Back

Formas Criativas de Estilizar Listas com CSS

Formas Criativas de Estilizar Listas com CSS

Listas com o estilo padrão do navegador raramente correspondem a um design real. Seja construindo um menu de navegação, um tutorial passo a passo ou uma lista de recursos de produto, a estilização de listas com CSS oferece as ferramentas para torná-las intencionais. Este artigo aborda as técnicas mais práticas e baseadas em padrões—desde propriedades nativas de listas até contadores CSS e marcadores personalizados—sem sacrificar a acessibilidade.

Principais Conclusões

  • Escolha o elemento HTML semântico de lista correto (<ul>, <ol> ou <dl>) antes de aplicar qualquer CSS, pois os leitores de tela dependem dessa estrutura.
  • Use ::marker para mudanças simples de cor e fonte do marcador, e ::before com flexbox quando precisar de controle total de layout sobre marcadores personalizados.
  • Contadores CSS permitem criar formatos de numeração personalizados, incluindo numeração hierárquica multinível com counters().
  • Considere adicionar role="list" ao usar list-style: none em listas significativas, especialmente para preservar a semântica de lista no Safari/VoiceOver.

Comece com o Tipo Correto de Lista HTML

Antes de tocar no CSS, escolha o elemento correto:

  • <ul> — listas não ordenadas onde a sequência não importa (menus de navegação, listas de recursos)
  • <ol> — listas ordenadas onde a sequência é significativa (instruções, classificações)
  • <dl> — listas de descrição que emparelham termos com definições (glossários, metadados)

HTML semântico é importante aqui. Leitores de tela anunciam o tipo de lista e a contagem de itens, o que ajuda os usuários a entender o contexto antes de lerem um único item.

As Propriedades list-style-*: Seu Ponto de Partida

O atalho list-style agrupa três propriedades:

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

list-style-position vale a pena ser compreendida claramente:

  • outside (padrão) — o marcador fica na margem e o texto permanece bem alinhado
  • inside — o marcador flui com o texto, causando quebra em itens de múltiplas linhas

list-style-image existe mas é limitada—você não pode redimensionar ou reposicionar a imagem. Para marcadores de imagem personalizados, um pseudo-elemento ::before com background-image oferece muito mais controle.

Estilizando Marcadores Nativos com CSS ::marker

O pseudo-elemento ::marker permite estilizar o marcador ou número integrado diretamente—sem marcação extra necessária:

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

Limitação importante: ::marker suporta apenas um subconjunto específico de propriedades CSS: color, content, font-*, direction, unicode-bidi, white-space, text-combine-upright e propriedades de animação/transição. Você não pode aplicar display, background, padding, margin ou posicionamento. Trate-o como um gancho de estilização em nível de texto, não como um elemento completo.

O suporte de navegadores para ::marker é bom nos navegadores atuais, mas verifique sua matriz de navegadores alvo. Geralmente é a opção mais limpa para mudanças simples de cor ou fonte em marcadores nativos.

Marcadores de Lista Personalizados com ::before

Quando ::marker não é suficiente—para marcadores estilo ícone, alinhamento complexo ou transições—use ::before:

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 acessibilidade: Definir list-style: none pode fazer com que Safari/VoiceOver pare de expor o elemento como uma lista. Se a semântica de lista for significativa, adicione role="list" ao <ul> ou <ol>.

Contadores CSS para Listas Ordenadas Estilizadas

Contadores CSS oferecem controle total sobre a formatação de listas numeradas—útil para listas ordenadas estilizadas com prefixos, sufixos personalizados ou numeração multinível:

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

ol li {
  counter-increment: steps;
}

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

Contadores Aninhados

Para listas aninhadas, counters() (plural) exibe a hierarquia completa:

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

ol li {
  counter-increment: steps;
}

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

A propriedade counter-increment também aceita um tamanho de passo: counter-increment: steps 2 incrementa de dois em dois.

Uma Nota sobre @counter-style

A regra-at @counter-style permite definir sistemas de contagem totalmente personalizados—símbolos personalizados, alfabetos ou padrões cíclicos:

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

ul {
  list-style-type: thumbs;
}

Use com cautela. O suporte de navegadores para @counter-style permanece incompleto—notavelmente, o Safari adicionou suporte apenas na versão 17. Sempre teste em seus navegadores alvo e defina um fallback de list-style-type no mesmo elemento para garantir degradação elegante.

Escolhendo a Abordagem Correta

ObjetivoMelhor técnica
Mudar cor ou fonte do marcador::marker
Ícone personalizado ou alinhamento complexo::before com flexbox
Formatação de numeração personalizadaContadores CSS com ::before
Sistema de contagem personalizado@counter-style (com fallback)

Conclusão

Uma boa estilização de listas CSS começa com HTML semântico e adiciona melhorias visuais por cima. Use ::marker para mudanças leves de cor e fonte, ::before quando precisar de controle de layout, e contadores CSS quando listas ordenadas precisarem de numeração personalizada. Evite remover a semântica de lista sem restaurá-la via ARIA. Cada técnica tem um caso de uso claro—escolha a que se adequa ao seu design sem complicá-lo demais.

Perguntas Frequentes

Sim, tecnicamente, mas geralmente você escolhe uma estratégia de marcador. Se remover o marcador nativo com list-style: none, use ::before para o marcador personalizado. Se mantiver o marcador nativo, use ::marker para ajustes simples de cor e fonte.

As heurísticas de acessibilidade do Safari interpretam list-style: none como um sinal de que o elemento está sendo usado para layout em vez de como uma lista semântica. Isso faz com que o VoiceOver pare de anunciá-lo como uma lista. Adicionar role='list' ao elemento ul ou ol restaura explicitamente a semântica de lista para que tecnologias assistivas continuem a reportar a estrutura e contagem de itens corretas.

Sim. Contadores CSS não são restritos a elementos de lista. Você pode aplicar counter-reset e counter-increment a qualquer elemento, como divs, cabeçalhos ou seções, e exibir o valor do contador usando a propriedade content em um pseudo-elemento. Isso os torna úteis para numerar capítulos, figuras ou qualquer padrão de conteúdo repetitivo.

Defina o ul como display flex e remova os estilos de lista padrão com list-style none e padding-left 0. Então estilize cada li ou sua âncora como um item flex inline com espaçamento apropriado usando gap ou margin. Lembre-se de adicionar role='list' ao ul se quiser que leitores de tela ainda o anunciem como uma lista de navegação no 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