W3docs

Etiqueta HTML <frameset>

La etiqueta <frameset> define la estructura de marcos, el número de columnas y filas y su posición en la ventana. Descripción, atributos y ejemplos de uso.

La etiqueta <frameset> definía la estructura de una página dividida en múltiples marcos — regiones desplazables independientes, cada una cargando su propio documento HTML. Reemplazaba al elemento <body> y utilizaba los atributos rows y cols para organizar los marcos en una cuadrícula.

Peligro

Las etiquetas <frameset> y <frame> son etiquetas HTML obsoletas. Fueron eliminadas en HTML5 y no deben usarse en páginas nuevas. Un documento HTML5 (que comienza con <!DOCTYPE html>) no puede utilizar un frameset en absoluto. Esta página documenta el elemento heredado y muestra qué usar en su lugar.

Esta página explica qué hacía <frameset>, por qué está obsoleto, y los reemplazos modernos y accesibles: los diseños con CSS Grid y Flexbox para dividir una página en paneles, y el elemento <iframe> para incrustar otro documento.

Por qué <frameset> está obsoleto

Los framesets fueron eliminados de la plataforma web porque rompían comportamientos fundamentales del navegador y la accesibilidad. Los principales problemas:

  • Navegación, marcadores e historial dañados. La barra de direcciones mostraba únicamente la URL del frameset externo, nunca el documento dentro de un marco. Los usuarios no podían guardar marcadores ni compartir lo que realmente estaban viendo, y el botón Atrás del navegador se comportaba de manera impredecible.
  • Impresión defectuosa. Imprimir un frameset generalmente producía el marco incorrecto o una página en blanco, porque no había un único documento para imprimir.
  • Fallos de accesibilidad. Los lectores de pantalla tenían dificultades para transmitir que la página estaba compuesta por varios documentos independientes; los usuarios de teclado podían quedar atrapados al mover el foco entre marcos, y el orden del foco era inconsistente.
  • Seguridad (clickjacking). Cargar páginas arbitrarias dentro de marcos habilitaba ataques de clickjacking. Los sitios modernos se defienden con las cabeceras X-Frame-Options y Content-Security-Policy — que a menudo rechazan cargarse dentro de un marco.
  • Eliminado en HTML5. Por todo lo anterior, la especificación HTML5 eliminó los framesets por completo.

Accesibilidad

Los framesets son hostiles para las tecnologías de asistencia (AT). Un lector de pantalla presenta un documento a la vez, por lo que una ventana compuesta de varios marcos no tiene un orden de lectura natural — los usuarios deben descubrir y cambiar entre marcos manualmente, con poca información sobre cómo se relacionan. La navegación por teclado también se ve afectada: el orden de Tab a través de los límites de marcos es poco fiable, y el foco puede quedar atrapado en un marco del que el usuario no puede salir fácilmente. Ninguno de estos problemas existe en un único documento HTML5 bien estructurado con diseño CSS.

Sintaxis

La etiqueta <frameset> va en pares. El contenido se escribe entre las etiquetas de apertura (<frameset>) y cierre (</frameset>).

La etiqueta <frameset> puede contener una o varias etiquetas <frame>. Se permite anidar una etiqueta <frameset> dentro de otra si es necesario dividir las ventanas en partes más pequeñas.

Consejo

El documento frameset utiliza el elemento <frameset> en lugar del elemento <body>. El elemento frameset no puede contener ningún contenido, sino que define y nombra los marcos organizados en filas y/o columnas.

Ejemplo de la etiqueta HTML <frameset>:

<!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="https://www.w3docs.com/learn-html/html-basic.html">
    <frame src="https://www.w3docs.com/learn-css/css-syntax.html">
  </frameset>
</html>

Resultado

Una ventana del navegador dividida en dos columnas iguales por un frameset, cada columna mostrando una página web diferente

Ejemplo de la etiqueta HTML <frameset> con el atributo rows:

<!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%,40%,30%">
    <frame src="https://www.w3docs.com/learn-javascript.html">
    <frame src="https://www.w3docs.com/learn-git.html">
    <frame src="https://www.w3docs.com/learn-php.html">
  </frameset>
</html>

Alternativas modernas

Todo lo que hacía <frameset> ahora se hace mejor con CSS y <iframe>.

Dividir su propia página en paneles (CSS Grid)

Para dividir un único documento en una barra lateral, encabezado y área de contenido — el caso de uso clásico de frameset — utilice CSS Grid. Al ser un único documento, la navegación, los marcadores, la impresión y los lectores de pantalla funcionan con normalidad.

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Two-pane layout with CSS Grid</title>
    <style>
      body { margin: 0; }
      .layout {
        display: grid;
        grid-template-columns: 200px 1fr;
        height: 100vh;
      }
      .sidebar { background: #f4f4f4; padding: 1rem; overflow: auto; }
      .content { padding: 1rem; overflow: auto; }
    </style>
  </head>
  <body>
    <div class="layout">
      <nav class="sidebar">Sidebar</nav>
      <main class="content">Main content</main>
    </div>
  </body>
</html>

También se puede construir un diseño flexible de filas y columnas con Flexbox.

Incrustar una página externa (<iframe>)

Para cargar una página web separada dentro de su documento — lo único que <frame> ofrecía y que CSS no puede hacer — utilice un <iframe>. A diferencia de los framesets, un iframe es un elemento HTML5 válido, mantiene la URL de la página padre como marcador y admite el uso de sandbox para mayor seguridad.

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

Proporcione siempre a un <iframe> un title descriptivo para que las tecnologías de asistencia puedan anunciar su propósito.

Atributos

En un frameset real, solo dos atributos eran estándar: rows y cols.

AtributoValorDescripción
colspíxeles, %, *Define el número y el tamaño de las columnas de marco. Eliminado en HTML5.
rowspíxeles, %, *Define el número y el tamaño de las filas de marco. Eliminado en HTML5.

Nota: En HTML 4.01, frameborder podía establecerse tanto en <frameset> (como valor predeterminado para sus marcos) como en cada <frame> individual. framespacing era una extensión no estándar de Netscape/Internet Explorer y nunca formó parte de la especificación HTML. Ambos están obsoletos y no deben utilizarse.

El elemento <frameset> también admitía los Atributos Globales.

Práctica

Práctica
¿Por qué no deberías usar el elemento frameset de HTML en páginas nuevas?
¿Por qué no deberías usar el elemento frameset de HTML en páginas nuevas?
Práctica
¿Qué característica moderna reemplaza a un frameset para incrustar una página externa separada?
¿Qué característica moderna reemplaza a un frameset para incrustar una página externa separada?
Was this page helpful?