A :has()
pseudoclasse é, sem dúvida, meu novo recurso CSS favorito. Eu sei que é para muitos de vocês também, pelo menos aqueles de vocês que responderam à pesquisa State of CSS. A capacidade de escrever seletores de cabeça para baixo nos dá mais superpoderes que nunca pensei serem possíveis.
Digo “mais superpoderes” porque já houve uma tonelada de ideias inteligentes realmente incríveis publicadas por um grupo de pessoas superinteligentes, como:
Este artigo não é um guia definitivo para :has()
. Também não está aqui para regurgitar o que já foi dito. Sou apenas eu (oi 👋) entrando na onda por um momento para compartilhar algumas das maneiras que provavelmente usarei :has()
no meu dia-a-dia… ou seja, assim que for oficialmente suportado pelo Firefox que é iminente.
Quando isso acontecer, pode apostar que vou começar a usar :has()
por todo o lugar. Aqui estão alguns exemplos do mundo real de coisas que construí recentemente e pensei comigo mesmo: “Puxa, isso vai ficar muito melhor depois :has()
é totalmente suportado.”
Evite ter que acessar fora do seu componente JavaScript
Você já criou um componente interativo que às vezes precisa afetar os estilos em algum outro lugar da página? Veja o exemplo a seguir, onde <nav>
é um mega-menu de, e abri-lo muda as cores do <header>
conteúdo acima dele.
Eu sinto que preciso fazer esse tipo de coisa o tempo todo.
Este exemplo em particular é um componente React que fiz para um site. Eu tive que “chegar fora” da parte React da página com document.querySelector(...)
e alternar uma classe no <body>
, <header>
, ou outro componente. Isso não é o fim do mundo, mas com certeza parece um pouco nojento. Mesmo em um site totalmente React (um site Next.js, digamos), eu teria que escolher entre gerenciar um menuIsOpen
estado bem acima na árvore de componentes, ou faça a mesma seleção de elemento DOM - o que não é muito React-y.
Com o :has()
, o problema desaparece:
header:has(.megamenu--open) { /* style the header differently if it contains an element with the class ".megamenu--open" */
}
Chega de mexer com outras partes do DOM em meus componentes JavaScript!
Melhor UX de distribuição de tabelas
Adicionar “listras” de linhas alternativas às suas tabelas pode ser uma boa melhoria de UX. Eles ajudam seus olhos a acompanhar em qual linha você está enquanto examina a tabela.
Mas, na minha experiência, isso não funciona muito bem em tabelas com apenas duas ou três linhas. Se você tiver, por exemplo, uma tabela com três linhas no <tbody>
e você está “tirando” cada linha “par”, você pode acabar com apenas uma listra. Isso realmente não vale um padrão e pode fazer com que os usuários se perguntem o que há de tão especial nessa linha destacada.
Usando esta técnica onde Bramus usa :has()
para aplicar estilos com base no número de filhos, podemos aplicar listras de tabela quando houver mais de, digamos, três linhas:
O que ficar mais chique? Você também pode decidir fazer isso apenas se a tabela tiver pelo menos um certo número de colunas:
table:has(:is(td, th):nth-child(3)) { /* only do stuff if there are three or more columns */
}
Remova a lógica de classe condicional dos modelos
Muitas vezes preciso alterar o layout de uma página dependendo do que está na página. Pegue o seguinte layout de grade, onde o posicionamento do conteúdo principal altera as áreas da grade dependendo se há uma barra lateral presente.
Isso é algo que pode depender se há páginas irmãs definidas no CMS. Eu normalmente faria isso com lógica de modelo para adicionar condicionalmente classes modificadoras BEM para o wrapper de layout para contabilizar ambos os layouts. Esse CSS pode se parecer com isto (regras responsivas e outras coisas omitidas por brevidade):
/* m = main content */
/* s = sidebar */
.standard-page--with-sidebar { grid-template-areas: 's s s m m m m m m m m m';
}
.standard-page--without-sidebar { grid-template-areas: '. m m m m m m m m m . .';
}
CSS-wise, isso é totalmente bom, é claro. Mas isso torna o código do modelo um pouco confuso. Dependendo da sua linguagem de modelo, pode ficar muito feio adicionar condicionalmente um monte de classes, especialmente se você tiver que fazer isso com muitos elementos filhos também.
Compare isso com um :has()
abordagem baseada em:
/* m = main content */
/* s = sidebar */
.standard-page:has(.sidebar) { grid-template-areas: 's s s m m m m m m m m m';
}
.standard-page:not(:has(.sidebar)) { grid-template-areas: '. m m m m m m m m m . .';
}
Honestamente, isso não é muito melhor em termos de CSS. Mas remover as classes modificadoras condicionais do modelo HTML é uma boa vitória se você me perguntar.
É fácil pensar em decisões de microdesign para :has()
- como um cartão quando tem uma imagem nele - mas acho que será muito útil para essas alterações de layout de macro também.
Melhor gerenciamento de especificidade
Se você ler meu último artigo, você saberá que sou um defensor da especificidade. Se, como eu, você não quer que suas pontuações de especificidade sejam estouradas ao adicionar :has()
e :not()
em todos os seus estilos, certifique-se de usar :where()
.
Isso porque a especificidade de :has()
é baseado em o elemento mais específico em sua lista de argumentos. Portanto, se você tiver algo como um ID, seu seletor será difícil de substituir na cascata.
Por outro lado, a especificidade de :where()
é sempre zero, nunca aumentando a pontuação de especificidade.
/* specificity score: 0,1,0. Same as a .standard-page--with-sidebar modifier class
*/
.standard-page:where(:has(.sidebar)) { /* etc */
}
O futuro é brilhante
Essas são apenas algumas coisas que mal posso esperar para poder usar na produção. O CSS-Tricks Almanac também tem vários exemplos. O que você está ansioso para fazer com :has()
? Que tipo de exemplos do mundo real você encontrou onde :has()
teria sido a solução perfeita?
- Conteúdo com tecnologia de SEO e distribuição de relações públicas. Seja amplificado hoje.
- Platoblockchain. Inteligência Metaverso Web3. Conhecimento Ampliado. Acesse aqui.
- Fonte: https://css-tricks.com/more-real-world-uses-for-has/
- 1
- 11
- 7
- 9
- 98
- a
- habilidade
- Capaz
- Sobre
- acima
- Conta
- afetar
- Todos os Produtos
- já
- sempre
- surpreendente
- e
- Outro
- Aplicar
- abordagem
- áreas
- argumento
- artigo
- baseado
- Porque
- Aposta
- Melhor
- entre
- Pouco
- Sopro
- construído
- Monte
- Pode obter
- cartão
- cachoeiras
- certo
- alterar
- Alterações
- criança
- Escolha
- classe
- aulas
- cms
- código
- colunas
- componente
- contém
- conteúdo
- poderia
- Para
- APF
- decisões
- definitivo
- Dependendo
- Design
- Não faz
- fazer
- DOM
- não
- down
- elementos
- especialmente
- etc.
- Mesmo
- SEMPRE
- Cada
- exemplo
- exemplos
- vasta experiência
- Olhos
- Favorito
- Característica
- poucos
- final
- Firefox
- seguinte
- para a frente
- da
- totalmente
- ter
- dá
- vai
- vai
- ótimo
- Grade
- grid-template-áreas
- guia
- acontecer
- ter
- ajudar
- SUA PARTICIPAÇÃO FAZ A DIFERENÇA
- hi
- superior
- Destaque
- HTML
- HTTPS
- EU VOU
- idéias
- imagem
- melhoria
- in
- interativo
- IT
- JavaScript
- apenas um
- Guarda
- Tipo
- Saber
- língua
- Sobrenome
- traçado
- Provável
- pequeno
- olhar
- procurando
- lote
- Macro
- moldadas
- a Principal
- fazer
- gestão
- muitos
- poder
- momento
- mais
- a maioria
- Mozilla
- você merece...
- Cria
- Novo
- Próximo
- Próximo.js
- normalmente
- número
- Oficialmente
- ONE
- abertura
- Outros
- lado de fora
- parte
- particular
- peças
- padrão
- Pessoas
- perfeita
- Lugar
- platão
- Inteligência de Dados Platão
- PlatãoData
- possível
- presente
- bastante
- Problema
- Produção
- publicado
- alcançar
- Reagir
- Leia
- mundo real
- recentemente
- removendo
- responsivo
- LINHA
- regras
- Execute
- Dito
- mesmo
- digitalização
- doadores,
- conjunto
- Partilhar
- local
- smart
- So
- solução
- alguns
- algo
- algum lugar
- especial
- específico
- especificidade
- começo
- Estado
- listra
- Stripes
- estilo
- super
- Suportado
- mesa
- Tire
- TD
- modelo
- A
- O Estado
- o mundo
- coisa
- coisas
- pensamento
- três
- todo
- para
- Tom
- também
- TOTALMENTE
- pista
- verdadeiro
- upside
- us
- usar
- usuários
- ux
- esperar
- maneiras
- O Quê
- se
- qual
- QUEM
- ganhar
- perguntando
- Atividades:
- mundo
- Equivalente há
- seria
- escrever
- Vocês
- investimentos
- zefirnet