O seletor de classe
Um seletor de classe é um ponto seguido do nome de uma classe. Ele estiliza todo elemento cujo atributo class contém esse nome, seja qual for o tipo do elemento.
O ponto aparece só no CSS. No HTML o atributo é class="badge", sem ponto. Nomes de classe diferenciam maiúsculas de minúsculas: .Badge não seleciona class="badge".
Várias classes em um elemento
Um elemento pode ter quantas classes quiser, separadas por espaços. Cada uma traz as próprias regras, e é assim que você monta variantes a partir de peças pequenas:
.btn.danger, sem espaço, seleciona elementos que têm as duas classes. O último span tem danger mas não tem btn, então a regra encadeada o ignora.
Variações do seletor de classe
| Seletor | Seleciona |
|---|---|
.note | Qualquer elemento com a classe note |
p.note | Só elementos <p> com a classe note |
.btn.primary | Elementos com btn e primary |
.card .title | Um .title em qualquer lugar dentro de um .card |
.card > .title | Um .title cujo pai é um .card |
.a, .b | Elementos com a ou b |
A diferença entre ter e não ter espaço, junto com outros combinadores, está na página de seletores CSS.
O seletor de ID
Um seletor de ID é um hash seguido do id: #site-header estiliza o elemento com id="site-header". Um id precisa ser único na página, então um seletor de ID mira exatamente um elemento.
Os ids fazem mais do que estilizar: href="#details" rola até o elemento, <label for="email"> aponta para o id de um input e o JavaScript o encontra com document.getElementById('details'). Esse é o motivo comum para dar um id a um elemento; para estilizar, a classe é a ferramenta melhor.
Classe vs ID
Classe .name | ID #name | |
|---|---|---|
| Por página | Muitos elementos | Um elemento |
| Por elemento | Várias, separadas por espaço | Um |
| Especificidade | (0,1,0) | (1,0,0) |
Alvo de link (#name na URL) | Não | Sim |
| Melhor para | Estilizar | Âncoras, labels, ganchos de JavaScript |
A diferença de especificidade é o motivo prático para estilizar com classes. Um ID vence qualquer quantidade de classes, então uma regra escrita com ID só pode ser sobrescrita por outro ID, por um estilo inline ou por !important:
Adicionar e remover classes com JavaScript
As classes são o jeito normal de o JavaScript mudar a aparência de algo: o CSS define os estados, o script só alterna entre eles.
classList também tem add, remove, contains e replace. Evite atribuir className diretamente: isso substitui todas as classes que o elemento tinha.
Como nomear classes
- Letras, dígitos, hífens e underscores são seguros:
card,card-title,card__title,is-open. - Não comece um seletor com um dígito, nem com um hífen seguido de dígito.
.2colé CSS inválido. Comece com uma letra (.cols-2) ou faça o escape do dígito (.\32 col). - Dê nomes pela função, não pela aparência:
.errorsobrevive a um redesign,.red-textnão. - Uma convenção de nomes ajuda em projetos maiores. O BEM escreve
block__element--modifier, por exemplo.card__title--large.
Erros comuns
- Colocar o ponto no HTML.
class=".badge"nunca combina com.badge. - Dois atributos
class.<p class="a" class="b">fica só coma. Useclass="a b". - Um espaço quando você queria as duas classes.
.btn .primaryprocura um elemento aninhado;.btn.primaryé o mesmo elemento. - Repetir um id. Ids duplicados quebram
getElementById, links de âncora e a associação de labels, mesmo que o CSS pareça funcionar. - Estilizar tudo com ids. A especificidade deles torna as sobrescritas futuras penosas; use classes.
Perguntas frequentes
Como selecionar uma classe no CSS?
Escreva um ponto seguido do nome da classe: .card { ... } estiliza todo elemento com class="card". O ponto só existe no CSS; o atributo no HTML não tem ponto.
Qual a diferença entre class e id no CSS?
Uma classe pode ser usada em quantos elementos você quiser, e um elemento pode ter várias; um id precisa ser único na página, e um elemento tem no máximo um. No CSS, #id tem especificidade bem maior que .class, então regras com ID são mais difíceis de sobrescrever.
Como dar duas classes a um elemento?
Separe os nomes com espaço em um único atributo: class="btn primary". Escrever class duas vezes no elemento não funciona; o navegador fica só com o primeiro atributo.
Como selecionar um elemento que tem duas classes?
Encadeie os seletores de classe sem espaço: .btn.primary seleciona elementos que têm as duas classes. Com espaço, .btn .primary significa um elemento .primary dentro de um elemento .btn.
Um nome de classe CSS pode começar com número?
No HTML pode, mas um seletor não pode começar com um dígito sem escape, então .1col é CSS inválido. Faça o escape do dígito (.\31 col) ou, melhor, comece os nomes de classe com uma letra.