W3docs

Tag HTML <frame>

A tag <frame> foi removida do HTML5 e não é renderizada por nenhum navegador moderno. Referência histórica e substitutos modernos: <iframe> e layout CSS.

A tag <frame> (juntamente com seu contêiner, <frameset>) foi removida do HTML5 e não é renderizada por nenhum navegador moderno — não a utilize. Esta página é uma referência histórica. Se você precisar incorporar outra página web, use o elemento <iframe>; se precisar de um layout de múltiplos painéis, use CSS Grid ou Flexbox.

Perigo

<frame> e <frameset> são elementos HTML obsoletos. Eles não fazem parte do padrão HTML e não têm efeito em nenhum navegador atual. As seções a seguir explicam o que eles faziam e mostram os substitutos modernos.

O que <frame> costumava fazer

No HTML 4 e XHTML 1.0 Frameset, uma única janela do navegador podia ser dividida em painéis independentes. Cada painel carregava seu próprio documento HTML, rolava separadamente e podia ser direcionado por links.

A estrutura era assim. O elemento <frameset> substituía a tag <body> e descrevia como a janela era dividida: o atributo cols criava painéis verticais, o atributo rows criava painéis horizontais e o tamanho de cada painel era definido em porcentagens ou pixels. Um <frame> dentro dele apontava para um documento com o atributo src. A tag <frame> era vazia (sem tag de fechamento), mas no XHTML precisava ser auto-fechada (<frame />).

Exemplo legado — dois painéis verticais (não funciona hoje)

<!-- HISTORICAL ONLY: this renders nothing in modern browsers -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <frameset cols="50%,50%">
    <frame src="page-left.html">
    <frame src="page-right.html">
    <noframes>
      <body>Your browser does not support frames.</body>
    </noframes>
  </frameset>
</html>

O elemento <noframes> acima continha conteúdo de fallback para os poucos navegadores que não conseguiam exibir frames. Ele também está obsoleto.

Exemplo legado — três painéis horizontais com rows (não funciona hoje)

<!-- HISTORICAL ONLY: this renders nothing in modern browsers -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <frameset rows="30%,30%,40%">
    <frame src="top.html">
    <frame src="middle.html">
    <frame src="bottom.html">
  </frameset>
</html>

Substitutos modernos

Incorporar uma página: <iframe>

Para carregar outro documento HTML dentro da página atual, use o elemento <iframe>. Ao contrário do <frame>, ele é um elemento inline comum que vive no fluxo normal da página, funcionando ao lado do conteúdo regular.

<!DOCTYPE html>
<html>
  <head>
    <title>Embedding a page</title>
  </head>
  <body>
    <h1>Documentation</h1>
    <iframe
      src="https://www.w3docs.com/"
      title="W3docs home page"
      width="600"
      height="400">
    </iframe>
  </body>
</html>

Layout de múltiplos painéis: CSS Grid ou Flexbox

O clássico layout frameset de "cabeçalho, barra lateral, conteúdo" é agora construído com elementos semânticos estilizados com CSS — tudo dentro de um único documento, de modo que links, favoritos e o botão voltar funcionam normalmente.

<!DOCTYPE html>
<html>
  <head>
    <title>Modern layout</title>
    <style>
      body {
        margin: 0;
        display: grid;
        grid-template-columns: 200px 1fr;
        grid-template-rows: 60px 1fr;
        grid-template-areas:
          "header header"
          "sidebar main";
        height: 100vh;
      }
      header { grid-area: header; background: #222; color: #fff; }
      nav    { grid-area: sidebar; background: #eee; }
      main   { grid-area: main; padding: 1rem; overflow: auto; }
    </style>
  </head>
  <body>
    <header>Site title</header>
    <nav>Sidebar links</nav>
    <main>Main content goes here.</main>
  </body>
</html>

Para aprender essas técnicas de layout, veja The Ultimate Guide to Flexbox e grid-template-areas.

Por que os frames foram substituídos

Os frames permitiam exibir vários documentos em uma janela e carregar páginas de diferentes servidores lado a lado. Esses benefícios são hoje melhor atendidos pelo <iframe> e pelo layout CSS, enquanto as desvantagens se mostraram fatais:

  • Uma URL apontava apenas para o frameset, portanto painéis individuais não podiam ser salvos nos favoritos, compartilhados ou restaurados com o botão voltar.
  • Os mecanismos de busca indexavam os documentos emoldurados de forma isolada, prejudicando o SEO.
  • Criavam problemas de acessibilidade e impressão.
  • Foram removidos do HTML5 e não são suportados em nenhum navegador atual.

Frames vs. iframes

Os elementos <frame> e <iframe> tinham comportamento semelhante, o que é o principal motivo pelo qual <iframe> é o substituto recomendado. A diferença fundamental: <frame> existia apenas dentro de um <frameset> que substituía todo o <body>, enquanto <iframe> é um elemento comum que você insere diretamente no fluxo da página ao lado de outro conteúdo — e, ao contrário do <frame>, ainda faz parte do HTML hoje.

Atributos (obsoletos)

O elemento <frame> como um todo é obsoleto, portanto nenhum dos atributos abaixo tem qualquer efeito no HTML5 ou nos navegadores atuais. Eles estão listados como referência para leitura de marcação legada.

AtributoValorDescrição
bordercolorcolorDefinia a cor da borda ao redor do frame.
frameborder0, 1Definia se a borda ao redor do frame era exibida.
longdescURLApontava para uma página com uma descrição longa do conteúdo do frame.
marginheightpixelsDefinia as margens superior e inferior do frame.
marginwidthpixelsDefinia as margens esquerda e direita do frame.
nametextDefinia o nome do frame, usado para direcioná-lo a partir de links.
noresizenoresizeDefinia se o usuário podia redimensionar o frame.
scrollingyes, no, autoDefinia se a barra de rolagem era exibida.
srcURLDefinia a URL da página carregada no frame.

Prática

Prática
O que você deve usar hoje em vez do elemento frame obsoleto para incorporar outra página web?
O que você deve usar hoje em vez do elemento frame obsoleto para incorporar outra página web?
Was this page helpful?