Logo de Mosaic
El texto central de HTML
Contenedores genéricos: los elementos div y span

22. Contenedores genéricos: los elementos div y span

Mark Norman Francis 26 de septiembre del 2008. Publicado en: div, span, agrupar, vínculos, semántico

En este apartado explicaremos cómo y cuándo utilizar los dos elementos de HTML que no se utilizan para describir el contenido. Los elementos span y div no confieren en realidad ningún significado al contenido que rodean; de hecho, son un mecanismo genérico que permite crear una estructura y unas agrupaciones personalizadas de elementos en los lugares en los que no hay ningún otro elemento del HTML que resulte realmente adecuado, a los que entonces se pueden aplicar estilos con CSS o manipular con JavaScript. A pesar de que los elementos div no añaden ningún significado semántico, se puede considerar que éstos representan una división estructural del etiquetado junto con la clase semántica o el nombre de ID adecuados.

Son "el último recurso" y sólo se deben utilizar cuando no hay ningún otro elemento del HTML que cumpla los requisitos necesarios, ya que no tienen ningún significado para las tecnologías de asistencia, los motores de búsqueda, etc.

Los contenidos de este apartado son los siguientes:

22.1. Semánticamente neutros

La mayoría de los elementos de HTML existen para describir el contenido, como por ejemplo las imágenes, las listas o los títulos, o para ayudar a componer el documento, como por ejemplo head, body, link, meta, etc. Sin embargo, hay dos elementos que no tienen ningún significado asignado: los elementos div y span, junto con los atributos id y class, ofrecen un mecanismo genérico para añadir estructura a los documentos.

Estos dos elementos se pueden considerar como el andamio de HTML. Dan la posibilidad de agrupar el contenido y de añadir información adicional relativa al contenido y vínculos para incorporar estilos e interactividad. Pero no añaden ningún significado semántico nuevo al documento, ni en sí mismos ni de ellos mismos.

22.2. En línea y de bloque

Como ya habéis aprendido, los elementos de bloque son elementos que ayudan a informar sobre la estructura de un documento. El elemento div, que es la abreviatura de división, es el contenedor genérico de los bloques. Normalmente se utiliza para rodear otros elementos de bloque con el objetivo de agruparlos. También se puede utilizar para reunir un grupo de elementos insertados y/o texto que no encajan de manera lógica bajo ningún otro elemento de bloque, pero debería ser el último recurso.

Ved también

Podéis ver el subapartado siguiente, donde encontraréis una explicación más detallada sobre la agrupación del contenido.

El elemento span es el contenedor genérico para los elementos en línea. También ayuda a informar sobre la estructura del documento, pero se utiliza para agrupar o rodear otros elementos insertados y/o texto más que elementos de bloque.

En un primer momento, la línea de separación entre estos dos tipos diferentes podría parecer arbitraria. La diferencia que hay que tener en cuenta es el tipo de contenido y el modo como debería aparecer al escribirlo sin ningún estilo. Un elemento div se pone alrededor de un grupo de elementos de bloque; por ejemplo, para rodear un título y una lista de enlaces para crear un menú de navegación. Un elemento span rodea un grupo de elementos en línea o (la mayoría de las veces) texto plano. La palabra clave es grupo; si un elemento div rodea sólo un elemento de bloque, o un elemento span sólo un elemento en línea, entonces su uso es innecesario.

Por ejemplo, observad el uso que se hace de los elementos div y span en el siguiente etiquetado, que es muy simple:

<body>
   <div id="mainContent">
      <h1>Título de la página</h1>
      <p>Éste es el primer párrafo de contenido de mi página de ejemplo.</p>
      <img src="example.gif" alt="Esta imagen es sólo un ejemplo, no tiene nada de
       especial">
      <p>Éste es el segundo párrafo de contenido de mi página de ejemplo. Es muy
       parecido al primero, pero aquí hay una <span id="specialAlert">alerta
       especial que queremos colorear y cuyo tamaño de texto queremos aumentar
       mediante CSS</span>. No se trata de un énfasis estándar, sino más bien un
       estilo, de manera que <em> i <strong> no son del todo adecuados.</p>
   </div>
</body>

Ahora podéis seleccionar el contenido del interior de los elementos div y span utilizando sus atributos id y aplicarles estilos y posicionamientos especiales con el CSS.

22.3. Más explicaciones sobre la agrupación de contenido

Si observamos el código fuente de muchas páginas de Internet, veremos muchos elementos div anidados que incluyen algunas metáforas habituales en las class y/o id de los elementos; por ejemplo, header, footer, content, sidebar, etc.

Vuestros nombres de class e id deben ser siempre semánticos, lo cual quiere decir que deberían remitir al significado/papel del contenido y no limitarse a hacer referencia a su aspecto visual. Así pues, por ejemplo, barraLateral y mensajeAlerta son buenos nombres de class, mientras que columnaIzquierdaRoja y textoAzulIntermitente no. ¿Qué sucedería si después quisierais cambiar el color de la barra lateral de rojo a azul, o su posición en el sitio web de la izquierda a la derecha? ¿Y si quisierais cambiar vuestros mensajes de alerta de azules intermitentes a verde sin intermitencia?

Estas divisiones aportan predictibilidad a la hora de crear estructuras de página y, seguramente mucho más importante, cuando se vuelve a revisar el HTML más adelante ofrecen pistas sobre la parte de la página en la que os encontráis. Una página bien dividida se documenta prácticamente en sí misma con respecto a sus intenciones y a su contenido.

Con la buena intención de dejarlo todo un poco más claro, ahora veremos una estructura de div de un sitio web real, concretamente la página de inicio de dev.opera.com. Tened en cuenta que este ejemplo de código no incluye ningún contenido, si dejamos de lado algunos otros elementos que hemos puesto porque son importantes para la estructura del sitio. Básicamente, lo que queremos es únicamente reproducir la estructura real del sitio tal como está definida con los elementos div. En el código siguiente, leed con atención los comentarios HTML; los hemos puesto para explicar la estructura del sitio. Mientras vais revisando este código, abrid la página principal de dev.opera.com en una nueva pestaña o ventana del navegador para poder ver el aspecto del sitio mientras exploráis su estructura.

<body>
<!-- En primer lugar tenemos un elemento div "wrap", que rodea toda la página y 
permite un control más preciso de todo él en general -->
   <div id="wrap">
   <!-- Esta lista desordenada contiene la lista de enlaces de todos los sitios 
   diferentes de Opera, que podéis ver en la parte superior de la página -->
      <ul id="sitenav" class="hidemobile">
         ...
      </ul>
         ...
      <!-- Éste es el formulario de búsqueda - el cuadro de búsqueda que podéis 
       ver en la parte superior derecha de la página -->
      <form action="/search/" method="get" id="search">
         <div>
            ...
         </div>
      </form>
      <!-- Esta lista desordenada contiene el menú de navegación principal del 
       sitio - el menú horizontal de pestañas que hay justo debajo del gráfico del 
       título principal -->
      <ul id="menu">
         ...
      </ul>
      <!-- Este elemento div anidado forma la estructura del cuadro de inicio de 
       sesión, en el que introduciréis el nombre de usuario y la contraseña para 
       acceder al sitio. Sólo lo veréis si aún no habéis iniciado ninguna
       sesión. -->
      <div id="loginbox">
         <div id="login">
            ...
         </div>
      </div>
      <!-- Esta serie de elementos div anidados es donde está el contenido
       principal de la página - todos los resúmenes de los artículos que forman
       el grueso del contenido de la página -->
      <div id="content2">
         <div id="main">  
            ...
            <div class="major">
               ...
            </div>
            <div class="major">
               ...
            </div>
            ...
         </div>
      </div>
      <!-- Este elemento div contiene la barra lateral de la página - las
       categorías de artículos, los últimos comentarios, etc -->
      <div id="side">
         ...
      </div>
      <!-- Este elemento div contiene el pie de página, que es donde veréis el 
       mensaje de copyright y varios enlaces en la parte inferior de la
       página. -->
      <div id="footer">
         ...
      </div>
   <!-- El final de la página - es la etiqueta de cierre para el elemento div
    "wrap" -->
   </div>
</body>

22.4. Información adicional

Algunos contenidos tienen información adicional, que es de utilidad para los agentes de usuario y para otros analizadores, y ésta se debe comunicar por medio de un atributo. Los elementos span son a menudo una buena manera de adjuntar esta información al contenido de una página web, tal como veréis a continuación.

Un buen ejemplo de esto es un idioma diferente que aparece en un documento. Por ejemplo:

<p><q>Plus ça change, plus c'est la même chose</q> she said.</p>

Aunque el idioma del documento principal es el inglés, la cita es en francés. Esto se indicaría mediante el uso del atributo lang, de la siguiente manera:

<p><q lang='fr'>Plus ça change, plus c'est la même chose</q> she said.</p>

En este ejemplo era muy fácil indicar este cambio de idioma, ya que aparecía sólo en una cita, con lo cual el elemento q era perfecto para rodear el contenido. Hay algunos casos, sin embargo, en los que no existe ningún elemento semántico adecuado fácilmente disponible, con lo cual deberíais recurrir a span o div. Por ejemplo:

<p>A screen reader will read the French word chat (cat) as chat (to talk 
 informally) unless it is properly marked up.</p>

En este ejemplo, la primera aparición de la palabra chat, que es una palabra en francés en un documento en inglés, debería tener esta diferencia indicada a fin de que no se pudiera interpretar como la palabra inglesa chat. En este caso, la manera correcta de hacerlo es con un elemento span en torno a la palabra chat, ya que no hay ningún otro elemento HTML adecuado para rodear la palabra francesa (no queremos añadir ningún énfasis a la palabra, no es una cita, no es un código, etc.). Como es una única palabra dentro de una frase, estaremos trabajando con un elemento insertado. Por lo tanto, este ejemplo se debería escribir de la manera siguiente:

<p> A screen reader will read the French word <span lang='fr'>chat</span> (cat) as
 chat (to talk informally) unless it is properly marked up.</p>

Ésta es la misma técnica que la utilizada en los microformatos para etiquetar formatos de datos comunes en páginas web. Podéis encontrar mucha más información sobre los microformatos en algunos de los apartados más avanzados sobre HTML en dev.opera.com.

22.5. Enlaces para JavaScript, y también CSS

Antes ya hemos hablado de cómo se pueden utilizar div y span junto con los atributos id y class para ofrecer enganches con los que aplicar estilos y posicionamiento CSS en ciertas partes de vuestro contenido. Lo mismo también se puede hacer para aplicar JavaScript a vuestro documento.

Si el JavaScript debe encontrar y manipular un elemento concreto, lo más habitual es aplicarle un id y entonces utilizar la función getElementById para encontrarlo. En la última parte de este curso aprenderéis muchas más cosas sobre JavaScript.

22.6. "Div-itis"

Una de las cosas que hay que tener en cuenta es un efecto que, entre la comunidad de desarrolladores de webs, se conoce normalmente como "div-itis".

Es muy fácil añadir estilos mediante muchos elementos div o span anidados, pero es una tentación en la que deberíamos evitar caer siempre que sea posible. En la mayoría de los casos, se pueden añadir estilos o funciones JavaScript a los elementos ya existentes del documento. El uso de un contenedor genérico debería ser el último recurso; es mejor intentar escribir páginas web empezando sólo con los elementos semánticos y añadir contenedores sólo cuando sea necesario.

22.7. Semántica inadecuada

En esta sección exploraremos algunos de los errores más habituales que se deben tener en cuenta a la hora de etiquetar el contenido con HTML y que se deben evitar siempre que sea posible.

22.7.1. Párrafos "genéricos"

Algunas veces es muy tentador utilizar un elemento p (párrafo) en torno a cualquier bloque de texto, pero eso no es demasiado correcto. Tal como ya hemos explicado en el apartado anterior sobre el etiquetado del contenido:

"Si son sólo unas cuantas palabras y no una frase propiamente dicha, entonces quizá sería mejor no etiquetarlo como un párrafo."

Los elementos correctos para rodear contenido textual inconexo que no tiene ninguna otra relación semántica cubierta por otros elementos del HTML son div o span (según la posición exacta).

Resumen

Aquí acaban nuestras explicaciones sobre los elementos span y div; ahora ya deberíais entender mucho mejor cuál es su finalidad y ser capaces de utilizarlos con toda confianza. Los apartados del módulo "Conceptos básicos de CSS" se detendrán mucho más en su uso para crear maquetaciones de página y para otras finalidades.

Preguntas de repaso

  1. ¿Cuál es la diferencia entre div y span?

  2. Decid dos de los usos principales de estos elementos en las páginas web.

  3. Observad el código fuente de una de las páginas de vuestro sitio web preferido. Mirad qué estructura tiene. ¿Utiliza muchos elementos div y span? ¿Podéis ver algo malo o inadecuado en la manera de utilizarlos? ¿Cómo se podría mejorar?

Logo Creative Commons
Los contenidos recogidos en este artículo están sujetos a una licencia Creative Commons
Reconocimiento, No comercial - Compartir bajo la misma licencia 3.0 No adaptada
.
: Ir al índice :