CSS

Criando contadores apenas com CSS

Você sabia que é possível criar contadores apenas com CSS? Com isso, alguns desenvolvedores conseguem até criar jogos sem nenhuma linha de JavaScript!

há 7 anos 2 meses

Formação Desenvolvedor HTML e CSS
Conheça a formação em detalhes

Olá Web Developers!

Vocês sabiam que é possível criar contadores apenas com CSS? Com isso alguns desenvolvedores conseguem até criar jogos sem nenhuma linha de JavaScript!

Os contadores fazem parte do CSS 2, então já possuem suporte por boa parte dos navegadores. Mesmo assim, são poucas as pessoas que conhecem ou fazem uso deles.

Para quem nunca viu pode parecer meio estranho, mas vamos ver de modo simples como usá-los!

Inicializando o contador

Primeiro vamos imaginar que os contadores são simplesmente variáveis, exatamente como as das linguagens de programação. Então, vamos começar com a declaração:

.minha-classe{
   counter-reset: meucontador;
}
  • meucontador é o nome do nosso contador, nossa “variável”.
  • counter-reset reinicia o nosso contador.

É como se estivéssemos escrevendo:

var meucontador = 0;

Imprimindo o contador

Agora vamos apresentar o nosso contador em algum lugar. Para isso, nós usamos a propriedade content, que deve ser usada junto a um pseudo-elemento, ::before ou ::after.

<div class="imprime-contador">Minha Div</div>
.imprime-contador::after{
   content: counter(meucontador);
}

O resultado será:

Veja que colocamos a classe imprime-contador em uma div. Foi exibido o conteúdo da div, e o ::after acrescentou depois dela o que passamos em content, o valor do nosso contador.

incrementando o contador

Agora temos que incrementar o nosso contador.

.imprime-contador{
   counter-increment: meucontador
}

Diferente do counter-reset, que reinicia o nosso contador, o counter-increment incrementa o valor.

Sempre que houver uma classe onde haja o incremento do nosso contador, ele será incrementado. Seria como se executássemos o seguinte código:

// imagine "elementsList" como sendo uma lista com todos
// os elementos HTML do nosso código
elementsList.forEach((element)=>{
   if( element.classList.contains("imprime-contador") ){
      meucontador++;
   }
})

Então se colocarmos três divs:

<div class="imprime-contador">Minha Div</div>
<div class="imprime-contador">Minha Div</div>
<div class="imprime-contador">Minha Div</div>

O Resultado será:

Incrementando de acordo com a seleção do usuário

Podemos também aproveitar o seletor :checked, que indica checkboxes marcados, para utilizar como condição para o incremento dos contadores. Por exemplo:

<style>
body {
  padding: 2em;  
}

.counter-reset{
   counter-reset: checkboxcounter;
}

.meucheckbox{
   width: 20px;
   height: 20px;
   margin-right: 10px;
   appearance: checkbox;
   -moz-appearance: checkbox;
   -webkit-appearance: checkbox;
}

.counter-print::after{
   content: "Total: " counter(checkboxcounter);
}

.meucheckbox:checked{
   counter-increment: checkboxcounter;
}
</style>

Clique nos Checkboxes para ver o contador incrementar:

<div style="margin-top: 30px;">  
  <span class="counter-reset"></span>  
  <input type="checkbox" class="meucheckbox" id="checkbox1" /><label for="checkbox1" >CheckBox 1</label>  
  <input type="checkbox" class="meucheckbox" id="checkbox2" /><label for="checkbox2" >CheckBox 2</label>  
  <input type="checkbox" class="meucheckbox" id="checkbox3" /><label for="checkbox3" >CheckBox 3</label>  
  <span class="counter-print"></span>  
<div>  

Se você quiser testar:

Aqui fizemos o seguinte:

  • Criamos uma classe no CSS apenas para reiniciar nosso contador, o .counter-reset;
  • Criamos uma classe no CSS apenas para imprimir o total do nosso contador, o .counter-print;
  • Fizemos um tipo de “condição” para o incremento, que são os checkboxes da classe .meucheckbox que estiverem marcados;

Vejam então que conseguimos fazer um contador que tem seu valor atualizado na página sem o uso de onclicks que chamam funções que calculam valores e atualizam o HTML, ou o uso de binds como os do Angular ou React. Apenas algumas linhas de CSS foram necessárias para criar este comportamento.

Alguma ideia, dúvida ou sugestão sobre como usar o CSS Counter? Compartilhe com a gente aí nos comentários!

Por hoje é só. Até o próxima o/

C# (C Sharp) - ASP.NET MVC
Curso C# (C Sharp) - ASP.NET MVC
Conhecer o curso

Autor(a) do artigo

Akira Hanashiro
Akira Hanashiro

Graduado em Análise e Desenvolvimento de Sistemas, Pós-graduado em Projetos e Desenvolvimento de Aplicações Web e MBA em Machine Learning. Especializado em Front End e curte desenvolvimento de jogos.

Todos os artigos

Artigos relacionados Ver todos