Executando verificação de segurança...
21

:has() - Como utilizar este novo e poderoso pseudo-seletor CSS

:has() é um dos pseudo-seletores mais poderosos incluídos na última versão do CSS e finalmente você pode, por exemplo, alterar um elemento pai ou classe pai dependendo do que tiver no elemento filho ou na classe filho.

Isto se estende ao ponto de conseguir alterar o layout geral de um formulário (ou até da página inteira) conforme o estado e a validação dos inputs, ou alterar a classe pai caso não exista um elemento filho, alterar o layout de uma grid caso uma das células possua uma imagem ou não (vamos ver esse exemplo logo abaixo), alterar completamente o layout de um post conforme os elementos que foram incluídos dentro dele... as possibilidades são infinitas e tudo sem utilizar JavaScript e somente utilizando CSS.

Então após aproximadamente 20 anos de discussões sobre como implementar este recurso com performance e flexibilidade, ele foi oficialmente definido como o pseudo-seletor :has() no Selectors Level 4.

Compatibilidade dos navegadores com o :has

Antes de entrarmos nos exemplos de como utilizar o :has e até antes de você utilizar esse recurso CSS em Produção, sugiro conferir a compatibilidade entre os navegadores que felizmente agora está uma corrida muito legal por todas as engines implementarem e, por mais imporessionante que seja, o Safari com o WebKit saiu na frente de todo mundo:

https://caniuse.com/css-has

Exemplo de como utilizar o :has

É extremamente simples de se estilizar classes e elementos com o :has e eu irei utilizar um exemplo encontrado no anúncio oficial do WebKit comemorando a disponibilidade já hoje desse novo recurso.

Imagine um HTML com a seguinte estrutura abaixo onde uma tag figure abraça uma tag img que mostra uma flor:

<figure>
  <img src="flores.jpg" alt="flores da primavera">
</figure>

Na mesma página, temos mais uma seção também com uma imagem, porém neste caso ela possui uma legenda que é adicionada pela tag figcaption (Legenda da Figura):

<figure>
  <img src="cachorro.jpg" alt="rapaz suspeito com seu workshire na grama ao sol">
  <figcaption>Miki adora estar ao ar livre sem coleira.</figcaption>
</figure>

E é agora que o negócio fica interessante, pois podemos alterar a estilização da tag raiz figure conforme o que aparecer como filho, por exemplo, se existir um filho figcaption, vamos alterar a estilização da classe pai para ter um fundo branco e um espaçamento adicional:

figure:has(figcaption) {
  background: white;
  padding: 0.6rem;
}

Então sem injetar classes adicionais no HTML e implementar isso usando somente CSS, o resultado é o seguinte:

Exemplo usando pseudo-seletor :has() do CSS

Outro exemplo utilizando :has e Display Grid CSS

Extraindo outro exemplo do artigo mencionado acima, é possível utilizar o :has() para configurar as células de uma grade que foi estilizada utilizando CSS Grid conforme o que existir dentro de cada célula, onde novamente, sem precisar que o backend ou frontend adicionem classes específicas para controlar a estilização.

Então neste exemplo, se uma célula representada pela tag article possui uma imagem dentro dela, podemos estilizar a célula para que ela consuma linhas ou colunas adicionais para ter mais espaço disponível:

article:has(img) {
  grid-column: span 2;
  grid-row: span 2;
}

Resultado utilizando o :has():

Exemplo utilizando :has() e Display CSS Grid

Resultado sem utilizar o :has():

Exemplo sem utilizar :has() e Display CSS Grid

Conclusão

Este pseudo-seletor é extremamente bem vindo para conseguir extrair ainda mais do código backend ou frontend que inseriam classes adicionais para atingir certas estilizações mais avançadas e agora utilizar somente CSS para controlar estes aspectos visuais e fazer isso com altíssima performance.

🛑 Um pedido sincero

Estamos realmente tentando construir um pedaço de internet mais massa aqui no TabNews, então você poderá nos ajudar DE VERDADE se compartilhar o link dessa publicação em outros lugares, pode ser 1 grupo de Facebook, ou grupo de Discord, Whatsapp, onde for que você acredite que faça sentido e as pessoas de lá vão gostar de aprender sobre essa novidade, combinado? Valeu demais 🤝

Carregando publicação patrocinada...
7
7

Finalmente, eu pensei que já tinha esse recurso no CSS de alguma forma, nem que seja um gambiarra, mas não encontrei na época que tanto quis fazer isso sem javascript kkkkk

Mas agora sim o negócio vai andar, esse recurso tem muito futuro, pois deixa tudo mais fácil assim como foi o flex e o grid pra quem usava float ou position para fazer layouts.

5
2

Eu estou aprendendo programação atualmente, estudando HTML, CSS e JS. Esse novo recurso será muito bem vindo e faz muito sentido! Podemos deixar o código mais clean e tem um resultado prático muito bom!