La :has()
pseudo-classe est, de loin, ma nouvelle fonctionnalité CSS préférée. Je sais que c'est aussi le cas pour beaucoup d'entre vous, du moins ceux d'entre vous qui ont répondu à l'enquête State of CSS. La possibilité d'écrire des sélecteurs à l'envers nous donne plus de super pouvoirs que je n'aurais jamais cru possibles.
Je dis "plus de super pouvoirs" parce qu'il y a déjà eu une tonne d'idées intelligentes vraiment incroyables publiées par un groupe de personnes super intelligentes, comme :
Cet article n'est pas un guide définitif pour :has()
. Il n'est pas non plus là pour régurgiter ce qui a déjà été dit. C'est juste moi (salut 👋) qui saute dans le train pendant un moment pour partager certaines des façons que je suis le plus susceptible d'utiliser :has()
dans mon travail quotidien… c'est-à-dire une fois qu'il est officiellement pris en charge par Firefox qui est imminent.
Quand cela arrivera, vous pouvez parier que je commencerai à utiliser :has()
partout. Voici quelques exemples concrets de choses que j'ai construites récemment et que je me suis dit : "Ça va être tellement mieux une fois :has()
est entièrement pris en charge.
Évitez d'avoir à atteindre l'extérieur de votre composant JavaScript
Avez-vous déjà créé un composant interactif qui a parfois besoin d'affecter des styles ailleurs sur la page ? Prenons l'exemple suivant, où <nav>
est une mégamenu, et l'ouvrir change les couleurs du <header>
contenu au-dessus.
Je sens que je dois faire ce genre de chose tout le temps.
Cet exemple particulier est un composant React que j'ai créé pour un site. J'ai dû "atteindre l'extérieur" de la partie Réagir de la page avec document.querySelector(...)
et basculer une classe sur le <body>
, <header>
, ou un autre composant. Ce n'est pas la fin du monde, mais c'est sûr que ça fait un peu beurk. Même dans un site entièrement React (un site Next.js, par exemple), je devrais choisir entre gérer un menuIsOpen
indiquez bien plus haut dans l'arborescence des composants, ou faites la même sélection d'éléments DOM - ce qui n'est pas très React-y.
Avec :has()
, le problème disparaît :
header:has(.megamenu--open) { /* style the header differently if it contains an element with the class ".megamenu--open" */
}
Plus besoin de jouer avec d'autres parties du DOM dans mes composants JavaScript !
Meilleure table striping UX
L'ajout de "rayures" de rangées alternées à vos tableaux peut être une belle amélioration UX. Ils aident vos yeux à savoir sur quelle ligne vous vous trouvez lorsque vous parcourez le tableau.
Mais d'après mon expérience, cela ne fonctionne pas très bien sur les tables avec seulement deux ou trois lignes. Si vous avez, par exemple, un tableau avec trois lignes dans le <tbody>
et que vous « bandez » chaque rangée « paire », vous pourriez vous retrouver avec une seule bande. Cela ne vaut pas vraiment un modèle et les utilisateurs pourraient se demander ce qu'il y a de si spécial dans cette ligne en surbrillance.
En utilisant cette technique où Bramus utilise :has()
appliquer des styles en fonction du nombre d'enfants, nous pouvons appliquer des bandes de tableau lorsqu'il y a plus de, disons, trois lignes :
De quoi devenir plus fantaisiste ? Vous pouvez également décider de ne le faire que si la table contient au moins un certain nombre de colonnes :
table:has(:is(td, th):nth-child(3)) { /* only do stuff if there are three or more columns */
}
Supprimer la logique de classe conditionnelle des modèles
J'ai souvent besoin de changer une mise en page en fonction de ce qu'il y a sur la page. Prenez la disposition de grille suivante, où le placement du contenu principal change les zones de grille en fonction de la présence ou non d'une barre latérale.
Cela peut dépendre de l'existence ou non de pages sœurs définies dans le CMS. Je ferais normalement cela avec une logique de modèle pour ajouter conditionnellement Classes de modificateurs BEM au wrapper de mise en page pour tenir compte des deux mises en page. Ce CSS pourrait ressembler à ceci (règles réactives et autres éléments omis par souci de brièveté):
/* 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-sage, c'est tout à fait bien, bien sûr. Mais cela rend le code du modèle un peu désordonné. En fonction de votre langage de template, il peut être assez moche d'ajouter conditionnellement un tas de classes, surtout si vous devez également le faire avec de nombreux éléments enfants.
Comparez cela avec un :has()
approche basée sur :
/* 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 . .';
}
Honnêtement, ce n'est pas beaucoup mieux en termes de CSS. Mais supprimer les classes de modificateurs conditionnels du modèle HTML est une belle victoire si vous me le demandez.
Il est facile de penser à des décisions de micro-conception pour :has()
- comme une carte quand elle contient une image - mais je pense que ce sera aussi très utile pour ces changements de mise en page macro.
Meilleure gestion de la spécificité
Si vous lisez mon dernier article, vous saurez que je suis un adepte de la spécificité. Si, comme moi, vous ne voulez pas que vos scores de spécificité explosent lors de l'ajout :has()
ainsi que :not()
tout au long de vos styles, assurez-vous d'utiliser :where()
.
C'est parce que la spécificité de :has()
est basé sur l'élément le plus spécifique dans sa liste d'arguments. Donc, si vous avez quelque chose comme un ID là-dedans, votre sélecteur sera difficile à remplacer dans la cascade.
D'autre part, la spécificité de :where()
est toujours nul, sans jamais ajouter au score de spécificité.
/* specificity score: 0,1,0. Same as a .standard-page--with-sidebar modifier class
*/
.standard-page:where(:has(.sidebar)) { /* etc */
}
L'avenir est brillant
Ce ne sont là que quelques éléments que j'ai hâte de pouvoir utiliser en production. L'almanach CSS-Tricks contient également de nombreux exemples. Qu'avez-vous hâte de faire avec :has()
? Quel genre d'exemples concrets avez-vous rencontré où :has()
aurait été la solution idéale ?
- Contenu propulsé par le référencement et distribution de relations publiques. Soyez amplifié aujourd'hui.
- Platoblockchain. Intelligence métaverse Web3. Connaissance Amplifiée. Accéder ici.
- La source: https://css-tricks.com/more-real-world-uses-for-has/
- 1
- 11
- 7
- 9
- 98
- a
- capacité
- Capable
- A Propos
- au dessus de
- Compte
- affecter
- Tous
- déjà
- toujours
- incroyable
- ainsi que
- Une autre
- Appliquer
- une approche
- domaines
- argument
- article
- basé
- car
- Pari
- Améliorée
- jusqu'à XNUMX fois
- Bit
- Soufflant
- construit
- Bouquet
- Peut obtenir
- carte
- cascade
- certaines
- Change
- Modifications
- enfant
- Selectionnez
- classe
- les classes
- Cms
- code
- Colonnes
- composant
- contient
- contenu
- pourriez
- Cours
- CSS
- décisions
- définitive
- Selon
- Conception
- Ne fait pas
- faire
- DOM
- Ne pas
- down
- éléments
- notamment
- etc
- Pourtant, la
- JAMAIS
- Chaque
- exemple
- exemples
- d'experience
- Yeux
- Favori
- Fonctionnalité
- few
- fin
- Firefox
- Abonnement
- Avant
- De
- d’étiquettes électroniques entièrement
- obtenez
- donne
- Goes
- aller
- l'
- Grille
- zones de modèle de grille
- guide
- arriver
- ayant
- vous aider
- ici
- hi
- augmentation
- Surbrillance
- HTML
- HTTPS
- MAUVAIS
- et idées cadeaux
- image
- amélioration
- in
- Interactif
- IT
- JavaScript
- juste un
- XNUMX éléments à
- Genre
- Savoir
- langue
- Nom de famille
- Disposition
- Probable
- peu
- Style
- recherchez-
- Lot
- Macro
- LES PLANTES
- Entrée
- a prendre une
- les gérer
- de nombreuses
- pourrait
- moment
- PLUS
- (en fait, presque toutes)
- Mozilla
- Besoin
- Besoins
- Nouveauté
- next
- Next.js
- normalement
- nombre
- Officiellement
- ONE
- ouverture
- Autre
- au contrôle
- partie
- particulier
- les pièces
- Patron de Couture
- Personnes
- parfaite
- Place
- Platon
- Intelligence des données Platon
- PlatonDonnées
- possible
- représentent
- assez
- Problème
- Vidéo
- publié
- nous joindre
- Réagir
- Lire
- monde réel
- récemment
- enlever
- sensible
- RANGÉE
- Courir
- Saïd
- même
- balayage
- sélection
- set
- Partager
- site
- smart
- So
- sur mesure
- quelques
- quelque chose
- quelque part
- spécial
- groupe de neurones
- spécificité
- Commencer
- Région
- bande
- Bandes
- Catégorie
- Super
- Appareils
- table
- Prenez
- TD
- modèle
- La
- L'État
- le monde
- chose
- des choses
- pensée
- trois
- tout au long de
- à
- Ton
- trop
- TOTALEMENT
- suivre
- oui
- Upside
- us
- utilisé
- utilisateurs
- ux
- attendez
- façons
- Quoi
- que
- qui
- WHO
- gagner
- demande
- activités principales
- world
- vaut
- pourra
- écrire
- Vous n'avez
- Votre
- zéphyrnet