Listas en HTML: ul, ol y li
HTML tiene dos listas principales. <ul> (lista desordenada) muestra viñetas, y <ol> (lista ordenada) muestra números. Cada elemento es un <li> (elemento de lista).
Usa <ol> cuando el orden significa algo (pasos, clasificaciones, un índice) y <ul> cuando no. Los lectores de pantalla anuncian las dos como listas con un recuento, como "lista, 3 elementos", y por eso una lista real es mejor que líneas que empiezan con un "•" o un "1." escritos a mano.
Una lista solo puede contener directamente elementos <li>. Todo lo demás, incluidos encabezados, párrafos y otras listas, va dentro de un <li>.
Estilos de viñeta
list-style-type en el <ul> cambia la viñeta. El pseudoelemento ::marker da estilo a la propia viñeta o número, por separado del texto:
Un valor de texto usa ese texto como viñeta. "\2713 " es una marca de verificación seguida de un espacio: el primer espacio solo termina el escape \2713. ::marker solo acepta algunas propiedades, sobre todo color, font-size y otras propiedades de fuente, lo que cubre la petición habitual de "viñetas de colores" sin marcado extra.
Listas ordenadas: números, letras y números romanos
<ol> tiene atributos para su numeración:
| Atributo | Ejemplo | Resultado |
|---|---|---|
type | type="a" | a, b, c (también funcionan A, i, I y 1) |
start | start="5" | Empieza a contar en 5 |
reversed | reversed | Cuenta hacia atrás |
value (en <li>) | <li value="10"> | Este elemento es el 10, los siguientes continúan desde ahí |
type está bien en HTML porque las letras pueden tener significado ("elige la opción B"). Para cambios puramente visuales, el CSS list-style-type: upper-alpha o lower-roman hace lo mismo.
Listas anidadas
Una sublista va dentro del <li> al que pertenece, después del texto de ese elemento. Los navegadores cambian la viñeta en cada nivel: disco, luego círculo, luego cuadrado.
Fíjate en dónde va </li>: el elemento "Frontend" se cierra solo después de su sublista. Cerrarlo antes del <ul> pone la sublista directamente dentro del <ul> exterior, lo que no es válido aunque se vea casi igual.
Las listas ordenadas se anidan del mismo modo, y la numeración vuelve a empezar en 1 en cada sublista. Para números como 1.1 y 1.2 hacen falta contadores de CSS.
Listas de descripción: dl, dt y dd
Una lista de descripción empareja términos con sus descripciones: un glosario, los detalles de un pedido, parejas tipo preguntas frecuentes. <dt> es el término y <dd> la descripción:
Un término puede tener varios <dd>, y varios <dt> pueden compartir un <dd>. Los navegadores sangran <dd> por defecto; la regla margin de arriba lo quita. Para datos con varias columnas, una tabla encaja mejor.
Listas sin viñetas: menús y listas horizontales
Los menús de navegación son listas de enlaces. Quita las viñetas con list-style: none y la sangría con padding: 0, y luego coloca los elementos en fila con flexbox:
Para los lectores de pantalla la lista sigue siendo una lista ("navegación, lista, 3 elementos"). Una excepción: Safari con VoiceOver puede perder el significado de lista cuando se quitan las viñetas. Si el recuento importa a tus usuarios, añade role="list" al <ul>.
Espaciado por defecto
Los navegadores dan a las listas un margen superior e inferior de 1em y las sangran con padding-inline-start: 40px, que es donde se colocan las viñetas. El padding está en el lado inicial, así que en los idiomas de derecha a izquierda las viñetas y la sangría pasan al otro lado automáticamente. Si quitas el padding, las viñetas salen fuera de la caja de la lista, donde pueden cortarse; o mantienes algo de padding o usas list-style-position: inside.
Errores comunes
<li>sin una lista padre. Tiene que estar dentro de<ul>,<ol>o<menu>.- Una lista anidada fuera de su
<li>. Pon la sublista dentro del elemento al que pertenece. - Texto u otras etiquetas directamente dentro de
<ul>, como<ul><p>Note</p><li>...</li></ul>. Muévelos a un<li>o fuera de la lista. - Escribir viñetas o números a mano con
•y<br>. Los lectores de pantalla oyen un párrafo, no una lista. list-style: nonesinpadding: 0, lo que deja una misteriosa sangría de 40 píxeles.- Usar
<ol>por el aspecto. Si el orden no importa, usa<ul>y dale estilo.
Preguntas frecuentes
¿Cómo hago viñetas en HTML?
Usa una lista desordenada: <ul> con un <li> por viñeta, por ejemplo <ul><li>Leche</li><li>Huevos</li></ul>. El navegador dibuja una viñeta delante de cada elemento y sangra la lista.
¿Qué diferencia hay entre ul y ol?
<ul> es una lista desordenada, con viñetas, para elementos cuyo orden no importa. <ol> es una lista ordenada, con números, para pasos y clasificaciones donde el orden sí importa. Las dos contienen elementos <li>.
¿Cómo quito las viñetas de una lista en HTML?
Pon list-style: none en el <ul> en el CSS. Pon también padding-inline-start: 0 (o padding: 0) para quitar la sangría que el navegador añade para las viñetas.
¿Cómo empiezo una lista ordenada en otro número?
Usa el atributo start: <ol start="5"> numera el primer elemento con 5. reversed cuenta hacia atrás, y value en un <li> fija el número de ese elemento y de los siguientes.
¿Cómo se hace una lista anidada en HTML?
Pon el <ul> u <ol> interior dentro de un <li> de la lista exterior, después del texto de ese elemento. Una lista colocada directamente dentro de otro <ul>, entre elementos <li>, no es válida.