O que e o seletor :has()
O :has() e uma pseudo-classe CSS que seleciona um elemento se qualquer dos seletores passados como argumento corresponder a um descendente (ou parente relativo) deste elemento. Por muitos anos a comunidade CSS pediu um "seletor parente" e o :has() entregou exatamente isso.
Antes do :has(), para mudar o estilo de um elemento pai com base nos seus filhos era preciso usar JavaScript. Hoje e possivel fazer isso puramente em CSS.
Como funciona na pratica
A sintaxe basica e seletor:has(argumento). O argumento e avaliado em relacao ao elemento selecionado como origem. Por exemplo, div:has(p) seleciona todos os <div> que contem pelo menos um <p> em qualquer nivel de profundidade.
Use>para limitar a busca ao filho direto:div:has(> p)so corresponde se o<p>for filho imediato do<div>.
Casos de uso reais
O :has() resolve problemas que antes exigiam JavaScript:
- Destacar uma linha de tabela inteira quando uma celula especifica esta marcada com checkbox
- Mudar o layout de um card com base na presenca de uma imagem
- Estilizar um label de formulario quando o input associado esta invalido ou em foco
- Ocultar uma secao quando ela esta vazia (sem filhos)
- Aplicar estilos em um artigo com base na presenca de certas classes filhas
Combinacoes avancadas
O :has() pode ser combinado com outras pseudo-classes para criar seletores muito precisos. :not(:has(img)) seleciona elementos que nao contem imagens. :has(:checked) permite estilizar um wrapper de acordo com o estado de um checkbox interno.
Voce tambem pode passar multiplos seletores separados por virgula: :has(h2, h3) corresponde a elementos que contem h2 OU h3.
Suporte nos navegadores
O :has() tem suporte amplo desde 2023: Chrome 105+, Edge 105+, Safari 15.4+ e Firefox 121+. Para projetos que precisam suportar versoes antigas, considere usar JavaScript como fallback ou verificar o suporte com @supports selector(:has(*)).
Como usar este testador
O testador da Chipak executa o seletor diretamente no navegador usando querySelectorAll(), que implementa a mesma logica do motor CSS. Cole seu HTML no painel esquerdo, escreva o seletor e veja os matches destacados em verde na previa a direita.