O Fim dos Frames Aninhados: Como Criar Layouts Completos com CSS Grid

O Fim dos Frames Aninhados: Criando Layouts Completos com CSS Grid

Chegamos ao último capítulo da nossa jornada histórica sobre os frames! Se você acompanhou as aulas anteriores do nosso curso de HTML online, você já entende a teoria por trás dessa técnica que dominou a web nos anos 2000.

Mas agora vamos encarar o "chefão final" dessa era: a criação de um layout completo com cabeçalho, menu lateral, área de conteúdo e rodapé. No passado, isso exigia uma técnica confusa chamada Frames Aninhados. Hoje, nós fazemos isso em poucos minutos usando a ferramenta mais poderosa do Front-End atual: o CSS Grid. Apertem os cintos, porque o ganho de conhecimento hoje vai ser absurdo!

O que são Frames Aninhados (A Gambiarra Clássica)?

O que são frames aninhados no HTML? No antigo padrão HTML 4, os frames aninhados consistiam em colocar uma tag <frameset> dentro de outro <frameset>. Isso era necessário porque a tag só permitia dividir a tela em colunas OU em linhas. Para ter um menu lateral (colunas) abaixo de um cabeçalho (linhas), era preciso "aninhar" as divisões. Hoje, essa prática é banida e totalmente substituída pelo CSS Grid Layout.

A lógica antigamente era um verdadeiro quebra-cabeça. Nós só podíamos cortar a tela na horizontal (usando o atributo rows) ou na vertical (usando o atributo cols). Mas e se o nosso layout exigisse os dois?

Nós precisávamos criar um <frameset> principal que cortava a tela em três fatias horizontais (Cabeçalho, Miolo, Rodapé). Em seguida, no "Miolo", em vez de colocarmos o conteúdo direto, nós abríamos outro <frameset> para cortar esse espaço verticalmente (Menu na esquerda, Conteúdo na direita).

O Código Antigo (A Título de História)

Veja como ficava o temido arquivo index.html (que não continha a tag <body>, lembra?):

<!-- O MUSEU DA WEB: NÃO USE ISSO HOJE! -->
<!DOCTYPE html>
<html>
<head><title>Layout com Frames Aninhados</title></head>

<!-- Primeiro corte: 3 linhas horizontais (Cabeçalho 20%, Miolo 60%, Rodapé 20%) -->
<frameset rows="20%,60%,20%">
    <frame name="head" src="header.html" noresize="no">
    
    <!-- Aqui entra o Aninhamento: Cortando o Miolo em 2 colunas! -->
    <frameset cols="20%,*">
        <frame name="menu" src="menu.html" noresize="no">
        <frame name="conteudo" src="home.html" noresize="no">
    </frameset>
    
    <frame name="foot" src="foot.html" noresize="no">
</frameset>

</html>
⚠️ Atenção: A Morte do SEO e Mobile!
Imagine o Google tentando ler esse site. Ele não via o seu texto, via apenas links apontando para "header.html", "home.html", etc. Além disso, se alguém abrisse isso num celular, a tela de 5 polegadas tentaria carregar 4 sites ao mesmo tempo. Era um desastre de acessibilidade!

Pare de Brigar com Códigos Ultrapassados! 🚀

Aprender as técnicas modernas não é um "bônus", é uma questão de sobrevivência no mercado. Se você quer entender como as grandes empresas estruturam sites profissionais, rápidos e 100% responsivos, você precisa de um guia atualizado.

Banner Curso HTML Progressivo
Apostila Completa HTML e CSS Digital

"Eu sempre me enrolava para criar um layout com Cabeçalho, Menu, Corpo e Rodapé que não quebrasse no celular. A apostila destrinchou o CSS Grid de um jeito tão óbvio que me senti um idiota por não ter aprendido antes!" - Júlio, Front-End Jr.

A Evolução Suprema: O Poder do CSS Grid

Você percebeu que a lógica do <frameset> era organizar tudo em "linhas" (rows) e "colunas" (cols)? Essa foi exatamente a inspiração para o W3C criar a propriedade mais revolucionária do design moderno: o CSS Grid Layout.

Com o CSS Grid, nós usamos as tags semânticas corretas dentro do <body> (nada de 4 arquivos HTML diferentes, tudo fica num só, ou injetado inteligentemente via PHP) e instruímos o CSS a criar a nossa "grade" visual.

🛠️ Curiosidade (A Magia das Áreas): O CSS Grid possui uma propriedade maravilhosa chamada grid-template-areas. Com ela, você desenha o layout do site escrevendo palavras no CSS, como se estivesse fazendo um esboço num guardanapo!

O Código Moderno (A Solução Definitiva)

Preste muita atenção no CSS abaixo. Note como nós definimos colunas, linhas e mapeamos as áreas exatamente como fazíamos no antigo e falecido frameset, mas agora com total controle, semântica e preparo para SEO:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Layout Completo com CSS Grid</title>
    <style>
        body { margin: 0; font-family: sans-serif; background: #f8fafc; }
        
        /* AQUI ESTÁ O SEGREDO DO GRID! */
        .layout-grid {
            display: grid;
            min-height: 100vh;
            
            /* Criamos 2 colunas: A primeira com 250px, a segunda pega o resto (1fr) */
            grid-template-columns: 250px 1fr;
            
            /* Criamos 3 linhas: Topo auto, Miolo elástico (1fr), Base auto */
            grid-template-rows: auto 1fr auto;
            
            /* Desenhamos o mapa do site! */
            grid-template-areas:
                "cabecalho cabecalho"
                "lateral   conteudo"
                "rodape    rodape";
        }

        /* Agora dizemos quem é quem no mapa */
        header { grid-area: cabecalho; background: #0f172a; color: white; padding: 20px; text-align: center; }
        nav    { grid-area: lateral;   background: #3b82f6; color: white; padding: 20px; }
        main   { grid-area: conteudo;  background: #ffffff; padding: 40px; }
        footer { grid-area: rodape;    background: #1e293b; color: white; padding: 15px; text-align: center; }
        
        nav a { display: block; color: white; text-decoration: none; margin-bottom: 10px; }
    </style>
</head>
<body>

    <div class="layout-grid">
        
        <header>
            <h1>HTML Progressivo</h1>
        </header>

        <nav>
            <h3>Menu Principal</h3>
            <a href="#">Página Inicial</a>
            <a href="#">Apostila de HTML5</a>
            <a href="#">Apostila de CSS3</a>
            <a href="#">Contato</a>
        </nav>

        <main>
            <h2>A Revolução do Front-End</h2>
            <p>O CSS Grid substituiu as tabelas e os frames aninhados de uma vez por todas. Este texto é 100% lido pelo Google e extremamente fácil de adaptar para celulares usando Media Queries.</p>
        </main>

        <footer>
            <p>Curso HTML Progressivo - Todos os Direitos Reservados 2026 ©</p>
        </footer>

    </div>

</body>
</html>

O Resultado Vivo (Renderização Prática):

HTML Progressivo

A Revolução do Front-End

O CSS Grid assumiu o controle. Agora o código é limpo, o layout é inquebrável e o robô do Google lê seu site de ponta a ponta sem esbarrar em uma única gambiarra estrutural!

Curso HTML Progressivo - Todos os Direitos Reservados 2026 ©
💡 Dica (Flexbox ou Grid?): Muitos alunos confundem quando usar qual. Regra geral: O CSS Grid nasceu exatamente para essa finalidade que vimos acima (definir o esqueleto macro do site em duas dimensões). O Flexbox é melhor para organizar as coisas dentro dessas áreas (como alinhar os botões do menu ou os ícones do rodapé).



Perguntas Frequentes (FAQ)

Por que a tag frameset exigia "aninhamento"?

Porque ela foi desenhada com uma limitação fundamental: ou ela cortava a tela na vertical (cols), ou cortava na horizontal (rows). Se você quisesse um layout "misto" (com um cabeçalho no topo cruzando a tela toda, e embaixo um menu ao lado do texto), era obrigado a criar um frameset principal cortando em linhas, e jogar outro frameset dentro dele cortando em colunas.

O que é CSS Grid e por que substituiu as tabelas e os frames?

O CSS Grid Layout é o sistema de formatação mais poderoso do CSS. Ele permite dividir a tela em colunas e linhas virtuais e alocar os elementos do HTML5 (header, main, nav, footer) dentro desses espaços. Ele substituiu as técnicas antigas porque permite reordenar o site inteiro para celulares usando Media Queries, sem precisar alterar uma vírgula do código-fonte HTML.

Ainda posso usar a tag frameset caso o site seja apenas para intranet da empresa?

É fortemente desaconselhado. Apesar de navegadores antigos suportarem por legado, não há nenhuma documentação que garanta que navegadores futuros continuarão renderizando <frameset>. Refazer o layout em HTML5 puro + CSS ou estruturar dinamicamente via PHP garante que o software da empresa não deixará de funcionar de uma hora para a outra.



🎯 O que estudar a seguir:

Parabéns por vencer a história da Web e chegar à era do CSS Grid! Seus próximos passos são essenciais:

Como Direcionar Links e Estilizar Iframes (O Fim do Frameborder)

Direcionando Links e Estilizando Iframes: Do Legado ao CSS Moderno

E aí, futuro mestre do Front-End! Se você sobreviveu à nossa última aula (onde fizemos uma viagem no tempo para entender o museu dos antigos frames), você já sabe que o <iframe> é a tag moderna que sobreviveu para contar história. Mas nós mal arranhamos a superfície do que essa tag pode fazer.

Neste tutorial do nosso curso de HTML, vamos aprender um "truque de mágica" clássico e muito útil: como clicar em um link no seu site e fazer com que ele abra dentro do Iframe, sem recarregar a página inteira! De quebra, vamos pegar os atributos jurássicos de estilo (como frameborder e scrolling) e traduzi-los para o CSS moderno.

A Mágica do Iframe Dinâmico (Atributos name e target)

Como abrir um link dentro de um iframe? Para direcionar um link, você deve dar uma "identidade" ao seu iframe usando o atributo name (ex: <iframe name="tela">). Em seguida, nos seus links, adicione o atributo target apontando para esse nome (ex: <a href="pagina.html" target="tela">). Assim, o navegador carrega a nova URL apenas dentro daquele quadro específico.

No passado, quando usávamos layouts cortados por <frameset>, existia um problema grave: se você tivesse um menu na esquerda e clicasse em um link, a página destino carregava em cima do menu! Você perdia a navegação.

Para resolver isso, os criadores do HTML inventaram um sistema de "Mira e Alvo". Você dá um nome (crachá de identificação) para a área de conteúdo, e avisa ao link: "Ei, atire essa nova página lá dentro daquele alvo!". E a melhor parte? Esse recurso funciona perfeitamente hoje com os Iframes modernos do HTML5!

Dando Nome aos Bois... Digo, aos Iframes!

A sintaxe é incrivelmente simples. Primeiro, batizamos o nosso iframe usando o atributo name:

<!-- Aqui criamos a "TV" e damos o nome de "monitor-principal" -->
<iframe name="monitor-principal" src="boas-vindas.html" width="100%" height="400"></iframe>

Agora, preparamos a nossa tag de link (<a>). Se não fizermos nada, o link abre na mesma aba (padrão) ou em uma nova aba se usarmos target="_blank". Mas, se passarmos o nome do nosso iframe no atributo target, a mágica acontece:

<!-- O atributo target="monitor-principal" diz onde o link deve carregar -->
<nav>
    <a href="https://pt.wikipedia.org/wiki/HTML" target="monitor-principal">Ver sobre HTML</a>
    <a href="https://pt.wikipedia.org/wiki/CSS3" target="monitor-principal">Ver sobre CSS</a>
</nav>
🛠️ Curiosidade Nerd: Esse truque de usar o target apontando para o name do Iframe é o "avô" das modernas Single Page Applications (SPAs) feitas em React ou Angular. Antigamente, era assim que simulávamos uma página que não dava refresh completo no navegador!

Chega de "Gambiarras" e Código Confuso! 🚀

Saber os atributos como target é fundamental, mas o mercado real exige que você saiba organizar o DOM e aplicar CSS profissionalmente. Se você quer parar de perder horas caçando erros no Google, você precisa do método certo.

Slogan Curso HTML Progressivo
Apostila Completa HTML e CSS

"Eu sempre me frustrava porque meus sites nunca ficavam com cara de profissionais. A Apostila HTML & CSS Progressivo me destravou. Estudar offline, no meu ritmo e com projetos reais fez toda a diferença na minha carreira Front-End!" - Marcos, Desenvolvedor.

Estilizando Iframes: Antes vs. Depois

Na época dos velhos frames, usávamos atributos direto no HTML para ditar se a caixa ia ter borda, barra de rolagem ou se o usuário poderia redimensioná-la. Hoje, o HTML5 baniu essas coisas. O HTML dita O QUÊ é o elemento; o CSS dita COMO ele se parece. Vamos à tradução simultânea:

1. O fim do `frameborder` (Bordas)

Por padrão, o Iframe carrega com uma borda cinza "entalhada" que tem muita cara de anos 2000. Antigamente, os webmasters usavam frameborder="0" para apagar isso.

A Solução Moderna: Use a propriedade CSS border.

<!-- O jeito moderno de arrancar a borda feia do Iframe -->
<iframe src="pagina.html" style="border: none;"></iframe>

<!-- Você pode até adicionar bordas personalizadas, arredondadas e sombras! -->
<iframe src="pagina.html" style="border: 2px solid #3b82f6; border-radius: 8px;"></iframe>

2. Aposentando o `scrolling` (Barra de Rolagem)

Às vezes, você quer exibir um widget (como um botão de curtir ou um mini-mapa) e não quer que a barra de rolagem (scroll bar) apareça jamais. Antigamente, cravava-se um scrolling="no".

A Solução Moderna: Use a propriedade CSS overflow: hidden; para cortar as barras de rolagem sumariamente!

<!-- Escondendo qualquer barra de rolagem via CSS -->
<iframe src="mapa.html" style="overflow: hidden;"></iframe>
⚠️ Atenção à Usabilidade: Só oculte a barra de rolagem se tiver 100% de certeza que o usuário não precisará ler o resto do conteúdo interno. Esconder o scroll de um texto longo prende o usuário e gera alta taxa de abandono (Bounce Rate).

3. A herança do `resize` (Redimensionamento)

Nos <frameset> antigos, o usuário podia clicar na divisão e arrastar para diminuir um lado e aumentar o outro. O webmaster bloqueava isso com noresize.

A Solução Moderna: Hoje, os iframes são fixos ou responsivos (se adaptam à tela) por padrão. Mas, se você quiser permitir que o usuário puxe a ponta da caixa para aumentá-la (como acontece com as caixas de comentários <textarea>), o CSS te dá esse poder!

<!-- O usuário pode redimensionar a caixa puxando a borda inferior direita! -->
<iframe src="documento.html" style="resize: both; overflow: auto;"></iframe>



Perguntas Frequentes (FAQ)

Por que os atributos frameborder e scrolling pararam de funcionar no HTML5?

Eles foram declarados como obsoletos (deprecated) pelo consórcio W3C porque misturavam "design" com "estrutura". A filosofia do HTML5 e da web moderna exige que qualquer ajuste visual (bordas, barras de rolagem, cores) seja transferido estritamente para as folhas de estilo (CSS), deixando o código HTML muito mais leve e limpo.

Como estilizar o iframe de um vídeo do YouTube com CSS?

Quando você copia o código de incorporação do YouTube, ele geralmente vem com os atributos antigos. Você pode apagá-los com segurança e adicionar uma classe CSS ou estilo inline, por exemplo: style="border: none; border-radius: 12px; box-shadow: 0 4px 8px rgba(0,0,0,0.2);", o que deixará o player com bordas arredondadas e uma sombra elegante.

Posso alterar o CSS da página que está DENTRO do Iframe?

Regra geral: Não. O Iframe cria uma "caixa de areia" (sandbox) de segurança entre o seu site e o site de destino. Se o Iframe carrega um site de outro domínio (ex: Wikipedia), navegadores ativam a política CORS (Cross-Origin Resource Sharing) que impede seu CSS ou JavaScript de manipular o site de terceiros, garantindo a segurança dos usuários.



🎯 O que estudar a seguir:

Para consolidar o que você aprendeu e evoluir para o próximo nível de estruturação Front-End, confira esses materiais cruciais:

Como Criar um Site com Menu Lateral (Adeus Frames, Olá CSS Flexbox)

Como Criar um Site com Menu Lateral (Do Legado dos Frames ao CSS Moderno)

Fala, futuro mestre do Front-End! Se você acompanhou a nossa última aula sobre a história da internet, já sabe o que são os famosos "frames". Agora, vamos entender como os webmasters do passado dividiam a tela para criar menus laterais e, o mais importante, como nós fazemos isso hoje em dia com qualidade profissional.

Neste tutorial de nosso curso de HTML, vamos montar um layout clássico: um menu na lateral esquerda (ocupando 20% da tela) e a área de conteúdo na direita (ocupando 80%). Prepare-se para ver a mágica da evolução do código!

A Estrutura de um Menu Lateral

Como criar um menu lateral fixo? No HTML legado, usava-se a tag <frameset cols="20%,*"> para dividir a janela fisicamente. Hoje, a forma correta e moderna é usar o HTML5 semântico com a tag <nav> para o menu lateral e <main> para o conteúdo, organizando-os lado a lado através da propriedade display: flex; no CSS.

A Abordagem Histórica: O Uso do `frameset`

Antigamente, para ter um menu que não precisava ser recarregado toda vez que o usuário clicava em um link, nós tínhamos que criar três arquivos separados. O primeiro era o menu.html (apenas com os links). O segundo era o home.html (o conteúdo da página inicial).

E o terceiro era o famigerado index.html, que não continha texto nenhum, apenas a tag <frameset> atuando como uma tesoura que cortava o navegador em pedaços. O código era assim:

<!DOCTYPE html>
<html>
<head>
    <title>Site em Frames (Obsoleto)</title>
</head>
<!-- Corta a tela: 20% para o menu, e o asterisco (*) pega o restante (80%) -->
<frameset cols="20%,*">
    <frame src="menu.html">
    <frame src="home.html">
</frameset>
</html>
⚠️ Por que você deve fugir disso?
Dividir a tela dessa forma impedia que o site funcionasse em celulares (responsividade zero). Além disso, se um usuário buscasse no Google e caísse no seu arquivo menu.html, ele ia ver apenas uma lista de links com a tela inteira em branco, sem o resto do site!

Cansado de Tutoriais Ultrapassados? Atualize sua Carreira! 🚀

A internet está cheia de materiais que ensinam códigos dos anos 2000. O mercado moderno exige desenvolvedores que saibam criar layouts responsivos, limpos e otimizados para o Google.

Slogan Curso HTML Progressivo
Apostila Completa HTML e CSS

"Estava travado tentando alinhar minha barra lateral. A Apostila Progressiva me ensinou CSS Flexbox e Grid do zero de forma absurdamente didática. Salvou minha vida no estágio!" - Carlos, Desenvolvedor Front-End.

A Solução Moderna: Criando o Layout com CSS Flexbox

O que nós fazemos hoje? Mantemos todo o site em um arquivo só (ou usamos PHP para injetar o menu via servidor) e deixamos o CSS cuidar da organização visual. A melhor ferramenta para alinhar blocos lado a lado hoje se chama Flexbox.

Acompanhe o código abaixo. Veja como criamos um "container" principal e dissemos a ele: "Coloque o menu na esquerda ocupando 20% e o conteúdo na direita ocupando o resto".

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Layout Moderno com CSS Flexbox</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 0; background: #f8fafc; }
        
        /* O Flexbox ativa a exibição lado a lado */
        .layout-principal {
            display: flex;
            min-height: 100vh; /* Ocupa 100% da altura da tela */
        }

        /* O Menu Lateral (antigo frame esquerdo) */
        nav.menu-lateral {
            width: 20%; 
            background-color: #0f172a;
            color: white;
            padding: 20px;
        }

        nav.menu-lateral a {
            display: block;
            color: #cbd5e1;
            text-decoration: none;
            margin-bottom: 15px;
        }

        /* O Conteúdo Principal (antigo frame direito) */
        main.conteudo {
            flex: 1; /* Ocupa todo o espaço restante automaticamente! */
            padding: 40px;
            background-color: #ffffff;
        }
    </style>
</head>
<body>

    <div class="layout-principal">
        
        <!-- MENU DA ESQUERDA -->
        <nav class="menu-lateral">
            <h2>Navegação</h2>
            <a href="#">Home</a>
            <a href="#">Apostila de HTML5</a>
            <a href="#">Apostila de CSS3</a>
            <a href="#">Contato</a>
        </nav>

        <!-- CONTEÚDO DA DIREITA -->
        <main class="conteudo">
            <h1>Bem-vindo à Era Moderna do Front-End</h1>
            <p>Sem frames, sem gambiarras. O código é lido perfeitamente pelo Google e as telas se adaptam de forma fluida.</p>
        </main>

    </div>

</body>
</html>
🛠️ Curiosidade: A propriedade flex: 1; na área principal é o equivalente moderno ao asterisco * dos antigos frames. Ela avisa ao navegador: "Pegue todo o espaço que sobrar depois que o menu pegar os 20% dele". Lindo, não é?

O Resultado Vivo (Renderização Simples):

Bem-vindo à Era Moderna do Front-End

Sem frames, sem gambiarras. O código é lido perfeitamente pelo Google e as telas se adaptam de forma super profissional. Se a tela encolher, o Flexbox resolve!

Desafio de HTML e CSS (O Exercício Mental)

No tutorial antigo, nós pedíamos para os alunos criarem um site de bandas usando a propriedade rows no frameset, para criar um menu superior cortando a tela horizontalmente.

No CSS Moderno com Flexbox, se você quiser mudar os blocos de lado a lado (menu esquerdo) para um em cima do outro (menu no topo), basta aplicar a regra flex-direction: column; no container principal! Tente fazer isso no seu editor de código. Crie um menu horizontal e uma área de conteúdo abaixo dele!




Perguntas Frequentes (FAQ)

Como evitar que eu tenha que copiar o menu HTML em todas as páginas?

Como não usamos mais frames, a forma mais eficiente e utilizada no mercado corporativo é usar o PHP. Você cria um arquivo menu.php e, em todas as páginas, usa o comando <?php include('menu.php'); ?>. Assim, se você mudar um link no menu, todas as páginas do site se atualizam automaticamente.

Flexbox ou CSS Grid: qual usar para layouts?

Ambos são poderosos! Em regra geral, o Flexbox é ideal para alinhar elementos em uma única dimensão (ou em uma linha, ou em uma coluna), sendo perfeito para alinhar menus, barras e centralizações simples. O CSS Grid é feito para layouts bidimensionais completos, como galerias ou a arquitetura complexa de toda a página (dividindo em linhas e colunas ao mesmo tempo).

O que significa 100vh no CSS?

O vh significa "Viewport Height" (Altura da janela visível). Quando colocamos min-height: 100vh; no nosso container principal, estamos garantindo que a barra lateral e o conteúdo se estiquem até tocar o rodapé da tela do seu monitor, impedindo que o menu fique "cortado" no meio caso tenha pouco texto.



🎯 O que estudar a seguir:

Agora que o esqueleto do site está pronto, você precisa recheá-lo de interatividade e otimização:

As Tags Frameset e Frame: Como Dividir a Tela no HTML (E a Solução Moderna)

As Tags `frameset` e `frame`: A Evolução para o CSS Moderno

Agora que já fizemos uma breve explicação sobre a história dos frames, vamos entrar nos detalhes técnicos sobre como a web era construída no passado e como nós recriamos esses efeitos na internet de hoje.

Neste tutorial de nosso curso de HTML, iremos dissecar duas tags clássicas que reinaram na época do HTML 4.01: <frameset> e <frame>. Vamos entender como elas dividiam a tela e o que você deve usar hoje para não ser punido pelos buscadores!

Como funcionam as tags `frameset` e `frame`?

Para que serve a tag frameset? No HTML antigo, a tag <frameset> substituía a tag <body> e era usada para dividir a janela do navegador em várias seções (linhas ou colunas). Dentro dela, usava-se a tag <frame> para carregar um documento HTML diferente em cada seção. Hoje, o HTML5 baniu essas tags, e a divisão de telas é feita utilizando CSS (Flexbox ou Grid) combinado com <iframe>.

Muitos desenvolvedores das antigas consideravam os frames a parte mais confusa da criação de sites. O motivo era simples: um site com frames quebrava o padrão normal do HTML.

Até o momento, todos os nossos sites tinham sempre a mesma anatomia: a tag <head> para as configurações e a tag <body> para o conteúdo visível. No entanto, uma página que organiza frames não possui conteúdo próprio. A função dela é apenas dividir a tela e "chamar" outras páginas para preencherem esses espaços.

Por isso, a tag <frameset> substituía completamente o <body>. Dentro deste "Set" (um conjunto configurado), nós definíamos:

  • O número de frames na tela.
  • O tamanho exato (ou em porcentagem) de cada pedaço.
  • A disposição (se a tela seria cortada em colunas verticais ou linhas horizontais).

O Código Antigo: Um Site Dividido ao Meio

Vamos dar um exemplo prático de como isso era feito antigamente. Imagine que queremos criar uma página que divida a tela exatamente no meio: 50% da tela exibe o site da Globo e os outros 50% exibem o site do UOL. O código seria este:

<!DOCTYPE html>
<html>
<head>
    <title>Frames em HTML (Modo Antigo)</title>
    <meta charset="utf-8">
</head>
<!-- A tag frameset substitui o body e corta a tela em duas colunas (cols) de 50% -->
<frameset cols="50%,50%">
    <frame src="http://www.globo.com">
    <frame src="http://www.uol.com.br">
</frameset>
</html>
⚠️ Alerta de SEO e Boas Práticas!
Se você usar o código acima hoje, o Google vai olhar para o seu site e pensar: "Onde está o conteúdo dessa página?" Como o conteúdo pertence a sites externos (Globo e UOL), sua página não ganha relevância nenhuma. Além disso, no celular do usuário, a tela ficaria esmagada. É por isso que o frameset morreu!

O Mercado Mudou. Você Vai Ficar Preso no Passado? 🚀

Enquanto as faculdades e tutoriais antigos continuam ensinando tags obsoletas que destroem o SEO do seu site, o mercado exige programadores que dominem as boas práticas modernas.

Slogan Curso HTML Progressivo
Apostila Completa HTML e CSS

"Eu estava travado tentando entender essas montagens malucas de frames e CSS antigo. A apostila Progressiva mastigou o CSS Grid e o Flexbox de um jeito que salvou meus projetos reais!" - Carlos, Desenvolvedor Front-End.

A Solução Moderna: Flexbox e Iframes

Como nós dividimos a tela hoje no mercado de trabalho sem ser penalizado? Nós usamos a tag <body> normalmente, dividimos o layout usando CSS (Flexbox) e, se precisarmos embutir um site externo, usamos a tag moderna <iframe>.

Veja como recriamos o efeito de dividir a tela em duas colunas (50% / 50%) usando as melhores práticas do HTML5:

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <title>Divisão de Tela Moderna (CSS + Iframe)</title>
    <meta charset="utf-8">
    <style>
        /* Usamos o Flexbox para organizar os elementos lado a lado */
        .container-moderno {
            display: flex;
            width: 100%;
            height: 500px;
            gap: 10px; /* Cria um pequeno espaço entre as janelas */
        }

        /* Cada iframe vai pegar metade do espaço flexível (flex: 1) */
        .meu-iframe {
            flex: 1;
            border: 2px solid #ccc;
            border-radius: 8px;
        }
    </style>
</head>
<body>

    <h2 style="text-align: center;">O Jeito Certo de Embutir Sites Externos</h2>
    
    <div class="container-moderno">
        <!-- O Iframe é um elemento embutido que vive DENTRO do body -->
        <iframe src="https://www.programacaoprogressiva.net" class="meu-iframe" aria-label="Portal Progressivo"></iframe>
        <iframe src="https://pt.wikipedia.org" class="meu-iframe" aria-label="Wikipedia"></iframe><!-- Nota: Alguns sites grandes bloqueiam iframes por segurança -->
    </div>

</body>
</html>
🛠️ Curiosidade Nerd: Alguns sites gigantes (como o Google e o Facebook) possuem travas de segurança chamadas X-Frame-Options para evitar que cibercriminosos clonem seus sites usando Iframes (um ataque chamado Clickjacking). Por isso, se você tentar rodar o código acima com o site do Google, ele vai recusar a conexão e ficar em branco!

Exercício Prático: O Desafio Hacker

A característica mais marcante de desenvolvedores e hackers de elite é a curiosidade implacável e a vontade de fuçar no código. Agora que você entendeu o conceito, que tal um desafio de lógica?

Tente modificar o código CSS moderno que passamos acima para resolver os seguintes problemas:

  1. Como você faria para que o primeiro Iframe ocupe 70% da tela, e o segundo ocupe apenas 30%? (Dica: Pesquise sobre propriedades CSS como `width` ou a função `flex-basis`).
  2. Você seria capaz de colocar 4 iframes na tela, onde cada um deles ocupe exatos 25%? Teste criar isso no seu próprio bloco de notas!



Perguntas Frequentes (FAQ)

Ainda posso usar a tag frameset no HTML5?

Poder até pode, porque os navegadores atuais (como Chrome e Edge) mantêm compatibilidade reversa para não quebrar a "web antiga". Porém, a tag foi oficialmente classificada como obsoleta e banida das especificações do HTML5. Seu uso prejudica o SEO, destrói a responsividade no mobile e é considerado uma má prática extrema no mercado profissional.

Como usar iframes sem quebrar a tela do celular?

O maior erro ao usar <iframe> é declarar width="800" (tamanho fixo). Para manter o site responsivo em qualquer dispositivo móvel, remova os tamanhos fixos da tag HTML e adicione estilos CSS ao elemento: style="max-width: 100%; height: auto;".

Como ter um cabeçalho único em todas as páginas sem usar frames?

Antigamente usava-se frames para não precisar copiar o código do menu em todas as páginas. Hoje, nós usamos linguagens de servidor. A forma mais clássica e eficiente é criar um arquivo menu.php e usar o comando PHP include('menu.php'); em suas outras páginas, injetando o código dinamicamente.



🎯 O que estudar a seguir:

Pare de viver no passado e acelere a sua carreira. Recomendamos os próximos passos:

O Guia Definitivo dos Frames HTML: Do Legado Obsoleto da tag iframe Moderno

O Guia dos Frames HTML: A Evolução para o `< iframe >` Moderno

Bem-vindo a mais uma aula do nosso curso de HTML online! Se você é estudante de tecnologia ou esbarrou no código-fonte de algum sistema muito antigo (como bancos ou sistemas de governo), com certeza já se deparou com a palavra Frame.

Neste tutorial, nós vamos dar uma verdadeira aula de história da internet. Você vai entender por que essa técnica dominou a web nos anos 2000, por que ela foi cruelmente assassinada e banida do HTML5, e o mais importante: qual é a ferramenta que usamos hoje em dia para substituir isso no mercado de trabalho. Prepare-se para o choque de realidade!

O que é um Frame em HTML?

O que são frames no HTML? Originalmente, os frames (tags <frameset> e <frame>) permitiam dividir a tela do navegador em múltiplas janelas independentes, carregando um documento HTML diferente em cada uma delas. Hoje, essas tags estão obsoletas e banidas. A alternativa moderna e segura no HTML5 é a tag <iframe>, usada para incorporar conteúdos externos (como vídeos do YouTube ou Mapas) dentro de uma única página.

Até agora, todas as páginas que você criou no nosso curso se chamavam index.html, contato.html, etc. Ou seja, o navegador exibia um documento HTML inteiro por vez na tela.

A ideia dos frames era literalmente criar "molduras". Em vez de uma página inteira, os webmasters fatiaram a tela: o topo carregava um arquivo cabecalho.html, a lateral esquerda carregava um menu.html e o centro carregava o conteudo.html. Três páginas diferentes sendo exibidas juntas, como um quebra-cabeça.

Qual problema os antigos Frames resolviam?

Imagine que você tem um site com 50 páginas. Todas elas têm exatamente o mesmo cabeçalho e o mesmo menu lateral. Se você precisasse adicionar um link novo no menu, teria que abrir os 50 arquivos HTML e colar o link novo, um por um. Um inferno, concorda?

Os frames resolviam isso! O menu era um arquivo fixo (menu.html). Quando o usuário clicava em "Contato", apenas a "moldura" do conteúdo no meio da tela mudava. O menu e o cabeçalho não recarregavam. Era genial para a época!

⚠️ A Morte dos Frames (O Choque de Realidade)
Embora a ideia fosse boa nos anos 90, os frames geraram problemas catastróficos. O Googlebot (robô do Google) não conseguia ler o site direito para o SEO. Salvar a página nos "Favoritos" quebrava. E com a chegada dos smartphones, as páginas espremidas em molduras viraram um desastre. O HTML5 baniu oficialmente as tags <frameset> e <frame>!

Quer dominar o desenvolvimento moderno e fugir de códigos mortos? 🚀

A internet evolui numa velocidade assustadora. Se você continuar consumindo tutoriais baseados em HTML de 10 anos atrás, seu site nunca vai rankear no Google e nenhuma empresa vai te contratar.

Slogan Curso HTML Progressivo
Apostila Completa HTML e CSS

"A apostila do HTML Progressivo me ensinou exatamente o que as grandes empresas usam hoje: semântica limpa, CSS flexível e nada de gambiarras do passado!" - Carlos, Desenvolvedor Pleno.

Se não usamos Frames, como não repetir o Menu em 50 páginas?

Se você está prestando atenção, deve estar se perguntando: "Ok, os frames morreram. Mas como eu faço para não ter que copiar e colar o código do menu em todas as páginas do meu site hoje em dia?"

A resposta é simples: nós usamos linguagens de programação do lado do servidor (Back-End) ou frameworks modernos (Front-End).

  • A Solução Clássica e Poderosa (PHP): Nós criamos um arquivo chamado menu.php e usamos a função include('menu.php'); em todas as páginas. O PHP injeta o menu automaticamente antes de enviar o site para o usuário! Já temos um Curso de PHP Completo e Gratuito pronto pra você aprender isso!
  • A Solução Front-End (JavaScript): Hoje, aplicações modernas (Single Page Applications) feitas em React ou Vue.js carregam o menu uma vez e usam JavaScript para atualizar apenas o conteúdo do miolo (o DOM), sem recarregar a página. O mesmíssimo conceito dos frames, mas feito do jeito certo!

O Frame que Sobreviveu: O Poderoso `< iframe >`

Embora os frames de layout tenham morrido, o W3C salvou e aprimorou uma tag maravilhosa no HTML5: o Inline Frame (ou simplesmente <iframe>).

🛠️ Curiosidade: Toda vez que você vê um vídeo do YouTube incorporado num blog, um mapa do Google Maps na página de "Onde Estamos", ou um botão de "Curtir" do Facebook solto no meio de um artigo, você está vendo um <iframe> em ação!

O <iframe> funciona como uma janela retangular embutida no meio do seu conteúdo normal. Ele abre um "buraco" na sua página e renderiza o conteúdo de outro site ali dentro, de forma totalmente isolada e segura (sandbox).

Exemplo Prático: Incorporando o seu próprio site

Para usar, basta definir a tag e colocar o link do site externo no atributo src (source/origem):

<!-- Criando um iframe com largura e altura controladas e sem bordas -->
<h3>Navegue pelo nosso portal aqui mesmo!</h3>
<iframe 
    src="https://www.programacaoprogressiva.net" 
    width="100%" 
    height="400" 
    style="border: 1px solid #ccc; border-radius: 8px;" 
    aria-label="Janela do portal Programação Progressiva">
</iframe>

O YouTube facilita tanto a vida dos webmasters que, no botão "Compartilhar > Incorporar" de qualquer vídeo, ele já gera o código HTML do <iframe> pronto para você copiar e colar no seu site!




Perguntas Frequentes (FAQ)

Qual a diferença entre frameset e iframe?

A tag <frameset> era usada no passado para ditar a estrutura física da página inteira (substituindo a tag <body>), dividindo o navegador em telas rígidas. Já o <iframe> (Inline Frame) é usado hoje dentro do <body> como um elemento qualquer (assim como uma imagem), abrindo apenas uma "janela" pontual para exibir conteúdos externos, como vídeos ou mapas.

O uso de iframes prejudica o SEO do meu site?

Não, desde que usado corretamente. O Google entende perfeitamente que um <iframe> de um vídeo do YouTube agrega valor ao seu artigo. O que prejudica o SEO é colocar o texto original do seu site dentro de um iframe, pois o robô do Google pode não indexar aquele texto como sendo da sua página.

Como deixar um iframe responsivo para celulares?

Para evitar que o iframe quebre a tela do celular, nunca use width fixo em pixels (ex: width="800"). A forma moderna de fazer isso é aplicar regras CSS diretamente nele: defina max-width: 100%; e height: auto;, ou envolva o iframe numa <div> responsiva baseada em aspecto (Aspect Ratio).



🎯 O que estudar a seguir:

A arquitetura moderna exige soluções de verdade. Escolha seu próximo passo para se tornar um mestre Web: