Contadores e estilos de lista

Muitos tipos de conteúdo são melhor representados como uma lista HTML. Para conteúdo de lista ordenada, como etapas de uma receita ou notas de rodapé de um artigo, o marcador também costuma conter informações. O CSS oferece várias maneiras de controlar os contadores em uma lista.

Listar estilos

Há uma ampla variedade de tipos de estilos de lista predefinidos que aceitam números, letras, algarismos romanos e muitos sistemas de contagem internacionais.

Além dos estilos compatíveis com navegadores, o W3C publicou Estilos de contador prontos, com suporte para 181 estilos adicionais em 45 sistemas de escrita.

Se essas opções não atenderem às suas necessidades, defina um @counter-style personalizado. Isso permite especificar símbolos personalizados, um prefixo e um sufixo, entre outras coisas.

Por padrão, o marcador de item é outside a lista, posicionado na frente dela e alinhado à direita. Também é possível posicionar o marcador de item dentro da lista com list-style-position: inside.

Contadores

Enquanto os estilos de lista controlam como os marcadores de itens são exibidos, os contadores permitem controlar os valores a serem mostrados. Para elementos de item de lista <li>, o navegador cria um contador chamado list-item, que é incrementado em 1 para cada item de lista encontrado.

Os contadores CSS mantêm uma contagem contínua do número de vezes que um elemento com um valor counter-increment correspondente definido é renderizado.

Para criar um novo contador, use counter-reset com um nome de contador e, opcionalmente, um valor inicial. Normalmente, isso é definido em um elemento pai que contém todos os elementos que serão contados.

Em seguida, adicione uma propriedade counter-increment a cada elemento que você quer contar.

Por fim, mostre o valor do contador usando a função counter().

Neste exemplo, queremos mostrar a contagem progressiva das notas de rodapé como o texto do link de cada uma delas. Como queremos um único contador para todo o documento, definimos counter-reset: note no corpo e incrementamos em cada link de nota de rodapé.

Você também pode ter vários contadores contando itens diferentes. No exemplo de notas de rodapé, e se você quisesse mostrar o índice da seção e do parágrafo em que a nota de rodapé está?

A contagem de seções pode ser criada no corpo usando counter-reset e incrementada em cada elemento <h2>. Queremos que a contagem de parágrafos seja redefinida para cada seção. Por isso, vamos usar counter-reset em elementos <h2> e incrementar em elementos <p>.

Por fim, combinamos os valores do contador na propriedade content.

a:after {
  content: "(S" counter(section) "P" counter(paragraph) "N" counter(note) ")";
  font-size: small;
  vertical-align: super;
}

Contadores aninhados

O que acontece quando você aninha uma lista dentro de outra? O contador list-item é inicializado para cada elemento <ul> ou <ol>, e o uso de counter() retorna apenas o número da contagem mais interna. Se quiser mostrar a contagem de cada um dos contadores aninhados, use a função counters(), que recebe um nome de contador e um separador.

li::marker {
  content: counters(list-item, ".")
  }

Contadores de inversão

Por padrão, os contadores (incluindo o contador list-item implícito para elementos <ol>) começam em 0 e aumentam em um para cada elemento. Isso significa que o primeiro será contado como 1. E se você quiser contar de trás para frente até 1?

Para fazer isso, adicione o atributo reversed ao <ol>. Se você estiver usando o estilo de lista padrão, os marcadores vão funcionar conforme o esperado. No entanto, se você estiver usando um contador personalizado, precisará definir counter-increment como um valor negativo e calcular o valor inicial do contador manualmente.