Skip to content
This page has been auto-translated and may contain errors.View in English

Listas

docs.scrimba.com

Una cantidad sorprendente de una página web es realmente una lista: menús de navegación, resultados de búsqueda, cuadrículas de productos, los ingredientes de una receta, los pasos para restablecer una contraseña. Siempre que el contenido es un conjunto de elementos relacionados, HTML tiene un elemento que lo dice, y usarlo significa que el navegador, y cualquiera que lea con software de asistencia, sabe que los elementos pertenecen juntos.

Listas sin orden

Cuando el orden de los elementos no importa, usas una lista sin orden. Piensa en una lista de compras: leche, pan, huevos. No importa cuál escribas primero, son un montón de cosas agrupadas juntas.

Construyes una con dos etiquetas. La etiqueta <ul> envuelve toda la lista, y cada elemento va dentro de su propia etiqueta <li> ("elemento de lista"):

html
<ul>
  <li>Leche</li>
  <li>Pan</li>
  <li>Huevos</li>
</ul>

El navegador muestra cada elemento en su propia línea con un punto de viñeta al frente. No agregaste las viñetas ni los saltos de línea tú mismo, el navegador lo hace porque le dijiste que esto es una lista.

Una lista sin orden es un grupo de elementos donde la secuencia no tiene significado. El elemento <ul> es el contenedor, y cada hijo directo es un elemento <li> que contiene un elemento:

html
<ul>
  <li>Envío gratuito sobre $40</li>
  <li>Devoluciones dentro de 30 días</li>
  <li>Garantía de dos años</li>
</ul>

Una regla para mantener clara: lo único permitido como hijo directo de <ul> es <li>. No pones un <p> o un <div> directamente dentro de <ul>. Si quieres un párrafo o un enlace en un elemento, va dentro de <li>, que puede contener cualquier contenido que desees.

Las viñetas y la sangría son estilos predeterminados del navegador, no parte del significado. Cuando llegues a CSS los cambiarás o los eliminarás libremente, y la lista seguirá siendo una lista debajo.

Una lista sin orden marca un conjunto de elementos cuya secuencia no es significativa. <ul> es el contenedor y cada elemento es un <li>; los únicos hijos directos permitidos de <ul> son elementos <li> (y elementos de soporte de scripts como <template>), por lo que poner un <div> desnudo entre <ul> y sus elementos es inválido y el analizador no lo tratará como parte de la lista.

html
<ul>
  <li>Envío gratuito sobre $40</li>
  <li>Devoluciones dentro de 30 días</li>
  <li>Garantía de dos años</li>
</ul>

El marcador de viñeta y la sangría son valores predeterminados presentacionales de la hoja de estilos incorporada del navegador, no semántica; list-style: none los elimina sin cambiar lo que significa el elemento. Esa distinción importa porque el significado vive en el elemento, la viñeta es solo pintura. El software de asistencia (el término paraguas para herramientas como lectores de pantalla, que hablan la página en voz alta para personas que no pueden verla) lee la estructura, no el marcador: anuncia que una lista está comenzando y cuántos elementos contiene. Volvemos a lo que ese anuncio te compra en la lección de Profundidad sobre anidamiento.

JunoListas sin orden Usa <ul> para una lista donde el orden no importa, y envuelve cada elemento en su propio <li>. El navegador agrega las viñetas y los saltos de línea para ti, así que nunca escribes esos a mano. Me tomó un tiempo confiar en eso, seguía queriendo agregar los puntos yo mismo.
JunoListas sin orden<ul> es el contenedor, y sus únicos hijos directos son elementos <li>. Cualquier cosa más rica, un enlace, un párrafo, va dentro de <li>, nunca suelto en <ul>. Las viñetas son estilos predeterminados que puedes cambiar más adelante, así que elige el elemento por su significado, no por su apariencia.
JunoListas sin orden<ul> solo toma <li> como hijo directo, así que un <div> extraviado allí es marcado inválido. La viñeta viene de la hoja de estilos del navegador, no de la semántica, así que list-style: none elimina el punto y mantiene la lista. Esa distinción es la razón por la cual un lector de pantalla aún puede contar los elementos después de que tu CSS oculte los marcadores.

Listas ordenadas y sus atributos

A veces el orden es todo el punto. Pasos en una receta, posiciones en una carrera, instrucciones que sigues una tras otra. Para esas usas una lista ordenada, que numera los elementos para ti.

Funciona exactamente como una lista sin orden, pero el contenedor es <ol> en lugar de <ul>:

html
<ol>
  <li>Precalienta el horno a 180°C</li>
  <li>Mezcla la harina y el azúcar</li>
  <li>Vierte en el molde y hornea durante 25 minutos</li>
</ol>

Ahora el navegador pone 1, 2, 3 al frente de los elementos en lugar de viñetas. Si agregas un nuevo paso en el medio más adelante, los números se renumeran a sí mismos. Nunca escribes los números, y ese es el punto de usar <ol>.

Una lista ordenada es para elementos cuya secuencia tiene significado. Misma estructura que <ul>, cambia el contenedor a <ol>, y el navegador numera cada <li> automáticamente. Porque los números se generan, insertar o eliminar un elemento renumera el resto gratis.

<ol> tiene tres atributos que vale la pena conocer. start establece el número desde el cual la lista comienza:

html
<ol start="4">
  <li>Bate los huevos</li>
  <li>Incorpora la harina</li>
</ol>

Esa lista corre 4, 5. Es útil cuando una lista continúa después de que otro contenido la ha dividido en dos.

type cambia el estilo de numeración: 1 para números (el predeterminado), A o a para letras, I o i para números romanos.

html
<ol type="a">
  <li>Reúne tu evidencia</li>
  <li>Escribe el resumen</li>
</ol>

Esa lista corre a, b en lugar de 1, 2. Y reversed cuenta hacia atrás, lo que es adecuado para una cuenta regresiva o un ranking de los cinco mejores leído de abajo hacia arriba:

html
<ol reversed>
  <li>Bronce</li>
  <li>Plata</li>
  <li>Oro</li>
</ol>

Una lista ordenada marca elementos cuya secuencia es significativa; <ol> numera cada <li> a partir de valores generados, así que los ordinales nunca son contenido que escribas y permanecen correctos a medida que los elementos se mueven.

Tres atributos controlan la numeración. start establece el primer ordinal como un entero independientemente del estilo de visualización, así que start="4" en una lista de numerales romanos comienza en iv. type establece el estilo de marcador: 1, A, a, I, o i. reversed (un atributo booleano, lo que significa que su presencia sola es el valor, sin nada que establecer) cuenta hacia atrás desde el conteo de elementos a 1.

html
<ol type="I" start="4" reversed>
  <li>Fundamentos</li>
  <li>Lanzamiento</li>
  <li>Revisión</li>
</ol>

Hay una distinción que el estilo puede ocultar. type solo cambia cómo se dibuja el marcador; el valor anunciado al software de asistencia y usado por start es siempre el entero subyacente. Entonces una lista diseñada con letras sigue siendo posiciones 1, 2, 3 debajo. Cuando el ordinal es parte del contenido mismo, una cláusula legal numerada para citación, prefiere dejar que <ol> sea dueño del número en lugar de codificarlo en el texto, porque un "3." codificado en un <li> no se renumerará y un lector de pantalla lo leerá dos veces: una vez como el marcador generado y una vez como el texto. Un control más que vale la pena conocer: el atributo value en un <li> individual anula el número de ese elemento y la lista continúa contando desde allí.

JunoListas ordenadas y sus atributos Alcanza <ol> cuando el orden importa, como pasos en una receta, y el navegador numera los elementos para ti. Agrega o elimina un paso y los números se arreglan a sí mismos, así que nunca escribes 1. o 2. a mano. Los mismos elementos <li> que antes, solo un contenedor diferente.
JunoListas ordenadas y sus atributos<ol> te da tres atributos convenientes: start para comenzar desde un número distinto a 1, type para letras o números romanos en lugar de dígitos, y reversed para contar hacia atrás. Todos aún dejan que el navegador genere los números, que es la razón por la cual usas una lista ordenada en primer lugar.
JunoListas ordenadas y sus atributostype solo rediseña el marcador; el valor detrás de él, el que start usa y la tecnología de asistencia lee, es siempre el entero. Así que no escribas a mano "3." en un <li>, o no se renumerará y un lector de pantalla dice el número dos veces. Deja que <ol> sea dueño del conteo, y usa value en un solo <li> cuando necesites ajustar un elemento.

Listas de descripción

Hay un tercer tipo de lista para cuando cada elemento es realmente un par: una palabra y su significado, una etiqueta y su valor. Un glosario es el ejemplo más claro, cada término seguido de lo que significa.

Esta es una lista de descripción, y usa tres etiquetas. <dl> envuelve todo, <dt> contiene cada término, y <dd> contiene la descripción que va con él:

html
<dl>
  <dt>HTML</dt>
  <dd>El lenguaje que describe la estructura de una página.</dd>
  <dt>CSS</dt>
  <dd>El lenguaje que describe cómo se ve la página.</dd>
</dl>

El navegador muestra cada descripción sangrada bajo su término, así que el emparejamiento es claro de un vistazo. Piensa en "dt" como la palabra que estás definiendo y "dd" como la definición.

Cuando cada elemento es un emparejamiento en lugar de algo independiente, una lista de descripción se ajusta mejor que <ul> o <ol>. Se construye a partir de tres elementos: <dl> es el contenedor, <dt> es un término, y <dd> es la descripción vinculada a él.

html
<dl>
  <dt>Autor</dt>
  <dd>Carlos García</dd>
  <dt>Publicado</dt>
  <dd>14 de marzo de 2024</dd>
  <dt>Tiempo de lectura</dt>
  <dd>6 minutos</dd>
</dl>

Ese ejemplo muestra el segundo gran uso más allá de glosarios: metadatos clave/valor, un conjunto de etiquetas y sus valores. La agrupación es flexible. Un <dt> puede ser seguido por varios elementos <dd> cuando un término tiene más de una descripción, y varios elementos <dt> pueden compartir un solo <dd> cuando varios términos significan lo mismo. Alcanza un <dl> siempre que tu contenido sea naturalmente "esto, y su detalle", y alcanza <ul> u <ol> cuando los elementos se sostienen por sí solos.

Una lista de descripción asocia nombres con valores. <dl> es el contenedor; <dt> es un término (el nombre); <dd> es una descripción (el valor). La estructura que el navegador y el software de asistencia entienden es una secuencia de grupos, donde un grupo es uno o más elementos <dt> seguidos de uno o más elementos <dd>.

html
<dl>
  <dt>Almacenamiento</dt>
  <dt>Capacidad</dt>
  <dd>256 GB SSD</dd>

  <dt>Color</dt>
  <dd>Grafito</dd>
  <dd>Plata</dd>
</dl>

Esa flexibilidad es el punto: muchos términos pueden compartir una descripción, y un término puede llevar muchas descripciones. Dos encajes prácticos se destacan. El primero es contenido de término y definición como un glosario. El segundo es metadatos clave/valor, una tabla de especificaciones o un conjunto de detalles de publicación, donde cada etiqueta se empareja con su valor; un <dl> dice "estos son pares nombre/valor" de una forma en que una pila de <div>s nunca lo hace. Nota el quirk de denominación: <dt> y <dd> históricamente significaban "término de definición" y "descripción de definición", pero la especificación moderna deliberadamente los amplió a cualquier asociación nombre/valor, no solo definiciones de diccionario. Si tu contenido es una lista plana de pares sin emparejamiento, un <dl> es la herramienta equivocada y <ul> es la honesta.

JunoListas de descripción Una lista de descripción es para pares: un término y su significado. Usa <dl> alrededor de todo, <dt> para cada término, y <dd> para la descripción que lo sigue. Un glosario es la imagen para mantener en tu cabeza, palabra luego definición, palabra luego definición.
JunoListas de descripción Alcanza <dl> cuando cada elemento es un emparejamiento, un término y su detalle o una etiqueta y su valor, no un conjunto de pares. La agrupación se dobla para ajustarse: un <dt> puede tomar varios <dd>s, y varios <dt>s pueden compartir un <dd>. Los metadatos clave/valor como autor y fecha es donde gana su lugar más allá de glosarios.
JunoListas de descripción<dl> significa pares nombre/valor, y la especificación amplió <dt> y <dd> pasado definiciones de diccionario a cualquier etiqueta y valor, así que los metadatos son juego justo. Muchos términos pueden compartir un valor y un término puede contener muchos valores, lo que una pared de <div>s nunca puede expresar. Si los elementos son pares sin nada que emparejar, eso es un <ul>, no un <dl>.

Listas anidadas

Las listas pueden ir dentro de otras listas. Un menú podría tener "Bebidas" con opciones calientes y frías debajo, y cada una de esas con sus propias opciones. Poner una lista dentro de otra se llama anidamiento.

Lo clave para acertar: la lista interna va dentro de un <li>, no flotando entre elementos. Pones todo el <ul> (u <ol>) dentro del elemento de lista al que pertenece:

html
<ul>
  <li>Bebidas
    <ul>
      <li>Café</li>
      <li>Té</li>
    </ul>
  </li>
  <li>Refrigerios</li>
</ul>

"Café" y "Té" son parte de "Bebidas", así que su pequeña lista vive dentro del elemento "Bebidas". El navegador sangra un poco más la lista interna, así que puedes ver que pertenece al elemento arriba.

Para mostrar que algunos elementos pertenecen bajo otro elemento, anidasuna lista dentro de una lista. La regla que la mantiene válida: una lista anidada es un hijo de un <li>, nunca un hijo directo de <ul> u <ol> externo. La lista interna se sienta dentro del elemento en el que se expande.

html
<ul>
  <li>Frutas
    <ul>
      <li>Manzanas</li>
      <li>Plátanos</li>
    </ul>
  </li>
  <li>Verduras
    <ul>
      <li>Zanahorias</li>
      <li>Espinaca</li>
    </ul>
  </li>
</ul>

Puedes mezclar tipos mientras anidasen, un <ol> dentro de un <ul> o al revés, y anidar tan profundo como el contenido honestamente va. El lugar más común donde encuentras listas anidadas en código real es un menú de navegación con submenús: una lista de nivel superior de secciones, cada una con su propia lista de páginas dentro de su <li>.

El anidamiento es cómo se expresa la jerarquía: una sublista se coloca dentro del <li> al que pertenece, nunca como hijo directo de <ul> u <ol> padre. Acertar mal eso (un <ul> sentado directamente dentro de otro <ul>) es inválido, y la recuperación del analizador no se garantiza que coincida con lo que imaginaste.

El anidamiento es también donde la estructura paga para personas que no pueden ver la sangría. Un lector de pantalla anuncia una lista, su conteo de elementos, y su profundidad de anidamiento mientras entra en cada nivel: "lista, tres elementos", luego en una sublista "lista, dos elementos", y te dice cuando salen nuevamente. Ese comentario continuo es el equivalente no visual de la sangría que tu ojo lee gratis, y solo existe si el anidamiento es marcado real en lugar de elementos empujados hacia los lados con espaciado.

Eso conduce a la prueba de honestidad para cualquier lista. Un menú de navegación (el conjunto de enlaces que mueve a un visitante entre páginas, la fila a lo largo de la parte superior de la mayoría de sitios) es una lista de destinos, así que el marcado semánticamente correcto es un <ul> de enlaces, generalmente dentro de un elemento <nav> que etiqueta la región como navegación. Usa una lista real cuando el contenido es un conjunto de elementos relacionados, cualquiera que sea el CSS que luego lo hace parecer. No uses uno cuando no lo es: fingir espacios entre bloques no relacionados envolviéndolos en <li>s para pedir prestado espaciado de lista le dice al software de asistencia "estas tres cosas son un grupo de tres" cuando no lo son. El marcador puede ocultarse y el diseño puede ser cualquier cosa; la elección de <ul>, <ol>, o <dl> siempre debe responder lo que el contenido honestamente es.

JunoListas anidadas Para poner una lista dentro de una lista, deja la interna dentro del <li> al que pertenece, no suelta entre elementos. El navegador la sangra así que puedes ver que es parte del elemento arriba. Esa regla dentro de <li> es la única cosa para recordar aquí.
JunoListas anidadas Una lista anidada es siempre un hijo de un <li>, nunca un hijo directo de <ul> u <ol> externo. Puedes mezclar un <ol> dentro de un <ul> y ir tan profundo como el contenido realmente es. Los menús de navegación con submenús son donde lo harás golpear más, así que vale la pena sentirse cómodo ahora.
JunoListas anidadas Pon la sublista dentro de su <li>, porque un lector de pantalla lee el conteo de elementos y la profundidad de anidamiento, y esa estructura hablada es lo que reemplaza la sangría para alguien que no puede verla. Un menú nav realmente es una lista de enlaces, así que márcalo como uno; no envuelvas bloques no relacionados en <li>s para pedir prestado el espaciado. Deja que el elemento diga lo que el contenido honestamente es, y estilízalo como quieras después.