O que é uma pseudo-classe
Uma pseudo-classe é uma palavra-chave depois de dois-pontos que seleciona elementos pela posição no documento ou pelo estado. Você a acrescenta a um seletor normal: li:first-child, input:focus, a:hover.
As pseudo-classes de estado para links e mouse (:hover, :active, :visited) têm página própria, hover no CSS.
:nth-child() e a fórmula an+b
:nth-child() recebe um número, uma palavra-chave ou uma fórmula an+b. O navegador testa n = 0, 1, 2, ... e seleciona cada posição que a fórmula produz (as posições começam em 1).
| Fórmula | Posições selecionadas | Significado |
|---|---|---|
3 | 3 | O terceiro filho |
odd ou 2n+1 | 1, 3, 5, ... | Linhas ímpares |
even ou 2n | 2, 4, 6, ... | Linhas pares |
3n | 3, 6, 9, ... | Um a cada três |
n+4 | 4, 5, 6, ... | Do quarto em diante |
-n+3 | 1, 2, 3 | Os três primeiros |
3n+1 | 1, 4, 7, ... | Um a cada três, começando no primeiro |
Digite uma fórmula e veja quais itens são selecionados:
Experimente odd, even, 4, n+7, -n+5 e 2n+3. Uma fórmula inválida não seleciona nada.
A versão que conta a partir do fim é :nth-last-child(): li:nth-last-child(-n+2) seleciona os dois últimos itens.
nth-child vs nth-of-type
:nth-child() conta todo elemento irmão, seja qual for a tag, e só depois confere o resto do seletor. :nth-of-type() conta só os irmãos com a mesma tag. A diferença aparece assim que os irmãos são misturados:
Os mesmos pares existem para as pontas: :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.
:not(), :is() e :where()
| Pseudo-classe | Exemplo | Seleciona |
|---|---|---|
:not(X) | li:not(.done) | Elementos que não combinam com X |
:is(X, Y) | :is(h1, h2, h3) a | Elementos que combinam com qualquer item da lista |
:where(X, Y) | :where(ul, ol) li | Igual a :is(), com especificidade zero |
:has(X) | li:has(> input:checked) | Elementos que contêm algo que combina com X |
:not() é a de uso diário, por exemplo para colocar um separador entre os itens, mas não depois do último:
Pseudo-classes de estado: focus, checked, disabled, invalid
| Pseudo-classe | Seleciona |
|---|---|
:focus | O elemento que tem o foco do teclado ou do mouse |
:focus-visible | Com foco, e o navegador decide que o anel deve aparecer (normalmente foco pelo teclado) |
:focus-within | Um elemento que contém o elemento com foco |
:checked | Um checkbox ou radio marcado, ou um <option> selecionado |
:disabled / :enabled | Controles de formulário desabilitados (ou não) |
:required / :optional | Inputs com ou sem required |
:invalid / :valid | Inputs cujo valor falha ou passa na validação |
:user-invalid | Inválido, mas só depois que o usuário interagiu com ele |
:placeholder-shown | Um input que está mostrando o placeholder |
:empty | Um elemento sem filhos, nem mesmo texto |
:target | O elemento cujo id combina com o #fragment da URL |
Clique no campo de e-mail: o label fica azul graças ao :focus-within. Digite algo que não seja um e-mail e saia do campo: o :user-invalid deixa a borda âmbar. O :invalid simples teria marcado de âmbar o campo obrigatório vazio antes mesmo de você tocá-lo.
Faça o que fizer com :focus, mantenha um estilo de foco visível. Remover o outline sem colocar outra coisa no lugar deixa quem usa teclado sem saber onde está.
:has(), o seletor de pai
:has() seleciona um elemento pelo que ele contém. É o "seletor de pai" pedido há anos, e funciona nas versões atuais de Chrome, Firefox e Safari.
Escolha o outro plano: o card inteiro acompanha o botão de rádio, sem JavaScript.
Erros comuns
- Espaço antes dos dois-pontos.
li :first-childsignifica "um primeiro filho dentro de um li". Escrevali:first-child. - Achar que
p:nth-child(1)quer dizer "o primeiro p". Quer dizer "o primeiro filho, se ele for um p". Use:first-of-typepara o primeiro p. - Contar a partir de 0. As posições começam em 1:
:nth-child(0)não seleciona nada. - Remover o outline de foco.
:focus { outline: none }sem substituto quebra a navegação por teclado. - Confundir
:e::.:beforeé uma grafia antiga do pseudo-elemento::before; pseudo-classes sempre usam um dois-pontos.
Perguntas frequentes
O que é uma pseudo-classe no CSS?
Uma palavra-chave depois de dois-pontos que seleciona elementos pelo estado ou pela posição, e não pelo nome, como a:hover, li:first-child ou input:focus. Ela é acrescentada a um seletor normal, e a maioria das pseudo-classes conta como uma classe na especificidade (:where() conta zero).
Como funciona o nth-child no CSS?
:nth-child(an+b) seleciona elementos cuja posição entre os irmãos é a×n+b para n = 0, 1, 2 e assim por diante, contando a partir de 1. :nth-child(3) é o terceiro filho, :nth-child(odd) ou 2n+1 todos os ímpares, e :nth-child(n+4) do quarto em diante.
Qual a diferença entre nth-child e nth-of-type?
:nth-child() conta todos os elementos irmãos e depois confere o resto do seletor; :nth-of-type() conta só os irmãos do mesmo tipo de elemento. Em uma lista com um h2 seguido de parágrafos, p:nth-child(1) não seleciona nada, enquanto p:nth-of-type(1) seleciona o primeiro parágrafo.
Como usar :not() no CSS?
Coloque o seletor a excluir dentro dos parênteses: li:not(.done) seleciona todo item de lista sem a classe done. Ele aceita uma lista também, input:not([type="checkbox"], [type="radio"]).
Qual a diferença entre pseudo-classe e pseudo-elemento?
Uma pseudo-classe (um dois-pontos, :hover) seleciona um elemento existente inteiro em algum estado. Um pseudo-elemento (dois dois-pontos, ::before) mira uma parte de um elemento ou cria conteúdo gerado.