Pseudoclasses

Podcast do CSS - 015: pseudoclasses

Digamos que você tenha um formulário de inscrição de e-mail e queira que o campo tenha uma borda vermelha se contiver um endereço de e-mail inválido. Como fazer isso? Você pode usar uma pseudoclasse CSS :invalid, que é uma das várias pseudoclasses fornecidas pelo navegador.

Uma pseudoclasse permite aplicar estilos com base em mudanças de estado e fatores externos. Isso significa que o design pode reagir a entradas do usuário, como um endereço de e-mail inválido. Eles são abordados no módulo seletores, e este módulo mostrará mais detalhes sobre eles.

Ao contrário dos pseudoelementos, que você pode saber mais no módulo anterior, as pseudoclasses se conectam a estados específicos em que um elemento pode estar, em vez de estilizar partes dele.

Estados interativos

As pseudoclasses a seguir se aplicam devido a uma interação que um usuário tem com sua página.

:hover

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 2

Origem

Se um usuário tiver um dispositivo apontador, como um mouse ou trackpad, e ele for colocado sobre um elemento, você poderá se conectar a esse estado com :hover para aplicar estilos. Essa é uma maneira útil de sugerir que é possível interagir com um elemento.

:active

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 1

Origem

Esse estado é acionado quando há interação ativa com um elemento, como um clique, antes do clique ser liberado. Se um dispositivo apontador, como um mouse, for usado, esse estado será quando o clique for iniciado e ainda não tiver sido liberado.

:focus, :focus-within e :focus-visible

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 1

Origem

Se um elemento puder receber foco, como uma <button>, é possível reagir a esse estado com a pseudoclasse :focus.

Também é possível reagir se um elemento filho do elemento receber foco com :focus-within.

Os elementos focalizáveis, como botões, mostrarão um anel de foco quando estiverem em foco, mesmo quando clicados. Nesse tipo de situação, um desenvolvedor aplica o seguinte CSS:

button:focus {
    outline: none;
}

Esse CSS remove o anel de foco padrão do navegador quando um elemento recebe foco, o que apresenta um problema de acessibilidade para usuários que navegam em uma página da Web com um teclado. Se não houver um estilo de foco, eles não poderão acompanhar onde o foco está atualmente ao usar a tecla Tab. Com :focus-visible, você pode apresentar um estilo de foco quando um elemento recebe foco pelo teclado, além de usar a regra outline: none para evitar que um dispositivo ponteiro interaja com ele.

button:focus {
    outline: none;
}

button:focus-visible {
    outline: 1px solid black;
}

:target

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 1.3

Origem

A pseudoclasse :target seleciona um elemento que tem um id correspondente a um fragmento de URL. Digamos que você tenha o seguinte HTML:

<article id="content">
    …
</article>

Você pode anexar estilos a esse elemento quando o URL contém #content.

#content:target {
    background: yellow;
}

Isso é útil para destacar áreas que podem ter sido vinculadas especificamente, como o conteúdo principal de um site, por meio de um link de salto.

Estados históricos

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 1

Origem

A pseudoclasse :link pode ser aplicada a qualquer elemento <a> que tenha um valor href que ainda não tenha sido visitado.

:visited

É possível definir o estilo de um link que já foi visitado pelo usuário com a pseudoclasse :visited. Este é o estado oposto a :link, mas você tem menos propriedades CSS para usar por motivos de segurança. Você só pode definir o estilo color, background-color, border-color, outline-color e a cor de fill e stroke do SVG.

A ordem é importante

Se você definir um estilo :visited, ele poderá ser substituído por uma pseudoclasse de link com pelo menos a mesma especificidade. Por isso, é recomendável usar a regra da LVHA para estilizar links com pseudoclasses em uma ordem específica: :link, :visited, :hover, :active.

a:link {}
a:visited {}
a:hover {}
a:active {}

Estados de formulários

As pseudoclasses a seguir podem selecionar elementos de formulário nos vários estados em que esses elementos podem estar durante a interação com eles.

:disabled e :enabled

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 3.1

Origem

Se um elemento de formulário, como <button>, for desativado pelo navegador, será possível se conectar a esse estado com a pseudoclasse :disabled. A pseudoclasse :enabled está disponível para o estado oposto, embora os elementos de formulário também sejam :enabled por padrão. Portanto, talvez você não precise alcançar essa pseudoclasse.

:checked e :indeterminate

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 3.1

Origem

A pseudoclasse :checked está disponível quando um elemento de formulário de suporte, como uma caixa de seleção ou um botão de opção, está em estado marcado.

O :checked é binário(verdadeiro ou falso), mas as caixas de seleção têm um estado intermediário quando não estão marcadas nem desmarcadas. Isso é conhecido como o estado :indeterminate.

Um exemplo desse estado é quando há um controle "Selecionar tudo" que marca todas as caixas de seleção em um grupo. Se o usuário desmarcar uma dessas caixas de seleção, a caixa de seleção raiz não representará mais "todos" que está sendo marcada, então deve ser colocada em um estado indeterminado.

O elemento <progress> também tem um estado indeterminado que pode ser estilizado. Um caso de uso comum é dar a ele uma aparência listrada para indicar que não se sabe quanto mais é necessário.

:placeholder-shown

Compatibilidade com navegadores

  • 47
  • 79
  • 51
  • 9

Origem

Se um campo de formulário tiver um atributo placeholder e nenhum valor, a pseudoclasse :placeholder-shown poderá ser usada para anexar estilos a esse estado. Assim que houver conteúdo no campo, com ou sem um placeholder, esse estado não será mais aplicado.

Estados de validação

Compatibilidade com navegadores

  • 10
  • 12
  • 4
  • 5

Origem

É possível responder à validação de formulário HTML com pseudoclasses, como :valid, :invalid e :in-range. As pseudoclasses :valid e :invalid são úteis para contextos, como um campo de e-mail que tem um pattern que precisa ser correspondido, para que seja um campo válido. Esse estado de valor válido pode ser mostrado ao usuário, ajudando-o a entender que pode passar com segurança para o próximo campo.

A pseudoclasse :in-range estará disponível se uma entrada tiver min e max, como uma entrada numérica, e o valor estiver dentro desses limites.

Com formulários HTML, é possível determinar que um campo é obrigatório com o atributo required. A pseudoclasse :required estará disponível para os campos obrigatórios. Os campos que não são obrigatórios podem ser selecionados com a pseudoclasse :optional.

Como selecionar elementos pelo índice, ordem e ocorrência

Há um grupo de pseudoclasses que selecionam itens com base na localização deles no documento.

:first-child e :last-child

Compatibilidade com navegadores

  • 4
  • 12
  • 3
  • 3.1

Origem

Se você quiser encontrar o primeiro ou o último item, use :first-child e :last-child. Essas pseudoclasses retornam o primeiro ou o último elemento de um grupo de elementos irmãos.

:only-child

Compatibilidade com navegadores

  • 2
  • 12
  • 1.5
  • 3.1

Origem

Você também pode selecionar elementos sem irmãos, com a pseudoclasse :only-child.

:first-of-type e :last-of-type

Compatibilidade com navegadores

  • 1
  • 12
  • 3.5
  • 3.1

Origem

Você pode selecionar :first-of-type e :last-of-type que, à primeira vista, parecem fazer a mesma coisa que :first-child e :last-child, mas considere este HTML:

<div class="my-parent">
    <p>A paragraph</p>
    <div>A div</div>
    <div>Another div</div>
</div>

E este CSS:

.my-parent div:first-child {
    color: red;
}

Nenhum elemento ficaria de cor vermelha porque o primeiro filho é um parágrafo, e não um div. A pseudoclasse :first-of-type é útil nesse contexto.

.my-parent div:first-of-type {
    color: red;
}

Mesmo que o primeiro <div> seja o segundo filho, ele ainda é o primeiro do tipo dentro do elemento .my-parent. Portanto, com essa regra, ele ficará vermelho.

:nth-child e :nth-of-type

Compatibilidade com navegadores

  • 1
  • 12
  • 3.5
  • 3.1

Origem

Você também não se limita ao primeiro, ao último filho e aos tipos. As pseudoclasses :nth-child e :nth-of-type permitem especificar um elemento que está em um determinado índice. A indexação nos seletores de CSS começa em 1.

Também é possível transmitir mais de um índice para essas pseudoclasses. Se você quiser selecionar todos os elementos pares, use :nth-child(even).

Também é possível criar seletores mais complexos que encontram itens em intervalos espaçados regularmente, usando a microssintaxe An+B.

li:nth-child(3n+3) {
    background: yellow;
}

Esse seletor seleciona cada terceiro item, a partir do item 3. O n nessa expressão é o índice, que começa em zero, 3 (3n) é o quanto você multiplica esse índice.

Digamos que você tenha 7 itens <li>. O primeiro item selecionado é 3, porque 3n+3 se traduz em (3 * 0) + 3. A próxima iteração escolheria o item 6 porque n agora incrementou para 1, então (3 * 1) + 3). Essa expressão funciona para :nth-child e :nth-of-type.

Teste esse tipo de seletor no testador de enésimo filho ou nesta ferramenta de seleção de quantidade.

:only-of-type

Compatibilidade com navegadores

  • 1
  • 12
  • 3.5
  • 3.1

Origem

Por fim, você pode encontrar o único elemento de um determinado tipo em um grupo de irmãos com :only-of-type. Isso é útil se você quiser selecionar listas com apenas um item ou encontrar o único elemento em negrito em um parágrafo.

Encontrar elementos vazios

Às vezes, pode ser útil identificar elementos completamente vazios e também existe uma pseudoclasse para isso.

:empty

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 3.1

Origem

Se um elemento não tiver filhos, a pseudoclasse :empty será aplicada a eles. Os filhos não são apenas elementos HTML ou nós de texto: eles também podem ser espaços em branco, o que pode ser confuso quando você está depurando o HTML a seguir e se perguntando por que ele não está funcionando com :empty:

<div>
</div>

O motivo é que há um espaço em branco entre a <div> de abertura e o fechamento, então vazio não vai funcionar.

A pseudoclasse :empty pode ser útil quando você tem pouco controle sobre o HTML e quer ocultar elementos vazios, como um editor de conteúdo WYSIWYG. Aqui, um editor adicionou um parágrafo vago e vazio.

<article class="post">
 <p>Donec ullamcorper nulla non metus auctor fringilla.</p>
 <p></p>
 <p>Curabitur blandit tempus porttitor.</p>
</article>

Com o :empty, é possível encontrar e ocultar essas informações.

.post :empty {
    display: none;
}

Como encontrar e excluir vários elementos

Algumas pseudoclasses ajudam você a escrever CSS mais compacto.

:is()

Compatibilidade com navegadores

  • 88
  • 88
  • 78
  • 14

Origem

Se você quiser encontrar todos os elementos filhos h2, li e img em um elemento .post, crie uma lista de seletores como esta:

.post h2,
.post li,
.post img {
    …
}

Com a pseudoclasse :is(), é possível criar uma versão mais compacta:

.post :is(h2, li, img) {
    …
}

A pseudoclasse :is não é apenas mais compacta que uma lista de seletores, mas também é mais permissiva. Na maioria dos casos, se houver um erro ou um seletor não compatível em uma lista de seletores, a lista inteira não funcionará mais. Se houver um erro nos seletores transmitidos em uma pseudoclasse :is, ele ignorará o seletor inválido, mas usará os válidos.

:not()

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 3.1

Origem

Você também pode excluir itens com a pseudoclasse :not(). Por exemplo, você pode usá-lo para definir o estilo de todos os links que não têm um atributo class.

a:not([class]) {
    color: blue;
}

Uma pseudoclasse :not também pode ajudar a melhorar a acessibilidade. Por exemplo, um <img> precisa ter um alt, mesmo que seja um valor vazio. Você pode criar uma regra CSS que adicione um contorno vermelho espesso às imagens inválidas:

img:not([alt]) {
    outline: 10px red;
}

Teste seu conhecimento

Testar seus conhecimentos sobre pseudoclasses

As pseudoclasses agem como se uma classe tivesse sido aplicada dinamicamente a um elemento, enquanto os pseudoelementos agem sobre o próprio elemento.

Verdadeiro
Preste atenção no uso de um : único ou duplo como um caractere diferenciador-chave no seletor
Falso
Os pseudoelementos são para partes e as pseudoclasses são para o estado.

Quais das opções abaixo são uma pseudoclasse funcional?

:is()
🎉
:target
As pseudoclasses funcionais têm () depois delas, para indicar que aceitam parâmetros.
:empty
As pseudoclasses funcionais têm () depois delas, para indicar que aceitam parâmetros.
:not()
🎉

Quais das pseudoclasses a seguir se devem a uma interação do usuário?

:hover
🎉
:press
Tente de novo.
:squeeze
Tente de novo.
:target
🎉
:focus-within
🎉

Quais das opções abaixo são pseudoclasses de estado <form>?

:enabled
🎉
:fresh
Tente de novo.
:indeterminate
🎉
:checked
🎉
:in-range
🎉
:loading
Tente de novo.
:valid
🎉