Menu

Pseudo-classes CSS: nth-child, not, first-child e focus

Pseudo-classes selecionam elementos pela posição ou pelo estado: :nth-child(), :first-child, :not(), :focus, :checked, :has() e outras. Veja a sintaxe, a fórmula an+b com um testador ao vivo e a diferença entre nth-child e nth-of-type.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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órmulaPosições selecionadasSignificado
33O terceiro filho
odd ou 2n+11, 3, 5, ...Linhas ímpares
even ou 2n2, 4, 6, ...Linhas pares
3n3, 6, 9, ...Um a cada três
n+44, 5, 6, ...Do quarto em diante
-n+31, 2, 3Os três primeiros
3n+11, 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-classeExemploSeleciona
:not(X)li:not(.done)Elementos que não combinam com X
:is(X, Y):is(h1, h2, h3) aElementos que combinam com qualquer item da lista
:where(X, Y):where(ul, ol) liIgual 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-classeSeleciona
:focusO elemento que tem o foco do teclado ou do mouse
:focus-visibleCom foco, e o navegador decide que o anel deve aparecer (normalmente foco pelo teclado)
:focus-withinUm elemento que contém o elemento com foco
:checkedUm checkbox ou radio marcado, ou um <option> selecionado
:disabled / :enabledControles de formulário desabilitados (ou não)
:required / :optionalInputs com ou sem required
:invalid / :validInputs cujo valor falha ou passa na validação
:user-invalidInválido, mas só depois que o usuário interagiu com ele
:placeholder-shownUm input que está mostrando o placeholder
:emptyUm elemento sem filhos, nem mesmo texto
:targetO 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-child significa "um primeiro filho dentro de um li". Escreva li: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-type para 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR