Back

Formas Creativas de Estilizar Listas con CSS

Formas Creativas de Estilizar Listas con CSS

Las listas predeterminadas del navegador rara vez coinciden con un diseño real. Ya sea que estés construyendo un menú de navegación, un tutorial paso a paso o una lista de características de producto, el estilizado de listas con CSS te brinda las herramientas para hacer que se vean intencionales. Este artículo cubre las técnicas más prácticas basadas en estándares—desde propiedades nativas de listas hasta contadores CSS y marcadores personalizados—sin sacrificar la accesibilidad.

Puntos Clave

  • Elige el elemento HTML semántico de lista correcto (<ul>, <ol>, o <dl>) antes de aplicar cualquier CSS, ya que los lectores de pantalla dependen de esta estructura.
  • Usa ::marker para cambios simples de color y fuente del marcador, y ::before con flexbox cuando necesites control total del diseño sobre viñetas personalizadas.
  • Los contadores CSS te permiten crear formatos numerados personalizados, incluyendo numeración jerárquica multinivel con counters().
  • Considera agregar role="list" cuando uses list-style: none en listas significativas, especialmente para preservar la semántica de lista en Safari/VoiceOver.

Comienza con el Tipo de Lista HTML Correcto

Antes de tocar CSS, elige el elemento correcto:

  • <ul> — listas desordenadas donde la secuencia no importa (menús de navegación, listas de características)
  • <ol> — listas ordenadas donde la secuencia es significativa (instrucciones, clasificaciones)
  • <dl> — listas de descripción que emparejan términos con definiciones (glosarios, metadatos)

El HTML semántico importa aquí. Los lectores de pantalla anuncian el tipo de lista y el conteo de elementos, lo que ayuda a los usuarios a comprender el contexto antes de leer un solo elemento.

Las Propiedades list-style-*: Tu Punto de Partida

La abreviatura list-style agrupa tres propiedades:

ul {
  list-style: square inside none;
  /* list-style-type | list-style-position | list-style-image */
}

list-style-position vale la pena entenderla claramente:

  • outside (predeterminado) — el marcador se sitúa en el margen, y el texto permanece perfectamente alineado
  • inside — el marcador fluye con el texto, causando ajuste de línea en elementos multilínea

list-style-image existe pero es limitada—no puedes redimensionar o reposicionar la imagen. Para viñetas de imagen personalizadas, un pseudo-elemento ::before con background-image te da mucho más control.

Estilizar Marcadores Nativos con CSS ::marker

El pseudo-elemento ::marker te permite estilizar la viñeta o número incorporado directamente—sin marcado adicional requerido:

li::marker {
  color: deeppink;
  font-size: 1.2em;
  font-weight: bold;
}

Limitación importante: ::marker solo admite un subconjunto específico de propiedades CSS: color, content, font-*, direction, unicode-bidi, white-space, text-combine-upright, y propiedades de animación/transición. No puedes aplicar display, background, padding, margin, o posicionamiento. Trátalo como un gancho de estilizado a nivel de texto, no como un elemento completo.

El soporte del navegador para ::marker es bueno en navegadores actuales, pero verifica tu matriz de navegadores objetivo. Usualmente es la opción más limpia para cambios simples de color o fuente en marcadores nativos.

Viñetas de Lista Personalizadas con ::before

Cuando ::marker no es suficiente—para viñetas estilo icono, alineación compleja o transiciones—usa ::before en su lugar:

ul {
  list-style: none;
  padding-left: 0;
}

ul li {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
}

ul li::before {
  content: "✓";
  color: green;
  flex-shrink: 0;
}

Nota de accesibilidad: Establecer list-style: none puede causar que Safari/VoiceOver deje de exponer el elemento como una lista. Si la semántica de lista es significativa, agrega role="list" al <ul> o <ol>.

Contadores CSS para Listas Ordenadas Estilizadas

Los contadores CSS te dan control total sobre el formato de listas numeradas—útil para listas ordenadas estilizadas con prefijos, sufijos o numeración multinivel personalizados:

ol {
  list-style: none;
  counter-reset: steps;
}

ol li {
  counter-increment: steps;
}

ol li::before {
  content: "Paso " counter(steps) ". ";
  font-weight: bold;
  color: #333;
}

Contadores Anidados

Para listas anidadas, counters() (plural) genera la jerarquía completa:

ol {
  list-style: none;
  counter-reset: steps;
}

ol li {
  counter-increment: steps;
}

ol li::before {
  content: counters(steps, ".") " ";
}
/* Genera: 1, 1.1, 1.2, 2, 2.1 */

La propiedad counter-increment también acepta un tamaño de paso: counter-increment: steps 2 incrementa de dos en dos cada vez.

Una Nota sobre @counter-style

La regla-at @counter-style te permite definir sistemas de conteo completamente personalizados—símbolos personalizados, alfabetos o patrones cíclicos:

@counter-style thumbs {
  system: cyclic;
  symbols: "👍" "👎";
  suffix: " ";
}

ul {
  list-style-type: thumbs;
}

Usa con precaución. El soporte del navegador para @counter-style permanece incompleto—notablemente, Safari agregó soporte solo en la versión 17. Siempre prueba en tus navegadores objetivo y define un respaldo de list-style-type en el mismo elemento para asegurar una degradación elegante.

Elegir el Enfoque Correcto

ObjetivoMejor técnica
Cambiar color o fuente del marcador::marker
Icono personalizado o alineación compleja::before con flexbox
Formato numerado personalizadoContadores CSS con ::before
Sistema de conteo personalizado@counter-style (con respaldo)

Conclusión

Un buen estilizado de listas CSS comienza con HTML semántico y añade mejoras visuales encima. Usa ::marker para cambios ligeros de color y fuente, ::before cuando necesites control de diseño, y contadores CSS cuando las listas ordenadas necesiten numeración personalizada. Evita eliminar la semántica de lista sin restaurarla vía ARIA. Cada técnica tiene un caso de uso claro—elige la que se ajuste a tu diseño sin complicarlo demasiado.

Preguntas Frecuentes

Sí, técnicamente, pero usualmente eliges una estrategia de marcador. Si eliminas el marcador nativo con list-style: none, usa ::before para la viñeta personalizada. Si mantienes el marcador nativo, usa ::marker para ajustes simples de color y fuente.

Las heurísticas de accesibilidad de Safari interpretan list-style: none como una señal de que el elemento se está usando para diseño en lugar de como una lista semántica. Esto causa que VoiceOver deje de anunciarlo como una lista. Agregar role list al elemento ul u ol restaura explícitamente la semántica de lista para que las tecnologías asistivas continúen reportando la estructura correcta y el conteo de elementos.

Sí. Los contadores CSS no están restringidos a elementos de lista. Puedes aplicar counter-reset y counter-increment a cualquier elemento, como divs, encabezados o secciones, y mostrar el valor del contador usando la propiedad content en un pseudo-elemento. Esto los hace útiles para numerar capítulos, figuras o cualquier patrón de contenido repetitivo.

Establece el ul a display flex y elimina los estilos de lista predeterminados con list-style none y padding-left 0. Luego estiliza cada li o su ancla como un elemento flex en línea con espaciado apropiado usando gap o margin. Recuerda agregar role list al ul si quieres que los lectores de pantalla aún lo anuncien como una lista de navegación en Safari.

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..

OpenReplay