Al sinds december 2023 is de :has CSS selector toegevoegd aan de baseline, wat aangeeft dat we deze veilig kunnen gebruiken. Deze selector biedt nieuwe mogelijkheden voor CSS styling die voorheen alleen met JavaScript of extra classes mogelijk waren. In deze blog wil ik uitleggen wat de :has selector kan en toon ik twee praktijkvoorbeelden waarbij het ons veel werk en code scheelt.
Wat is de :has selector in CSS?
De :has selector in CSS is een krachtige toevoeging waarmee je styling kunt toepassen op basis van de aanwezigheid van specifieke child-elementen of volgende elementen (siblings). Het werkt als een “parent selector”
je kunt een element stylen op basis van wat het bevat of wat erna komt, zonder de context van je selector te veranderen.
article.typeA {
margin-bottom: 50px;
}
article.typeA:has(+ article.typeA) {
margin-bottom: 0;
}
Dit voorbeeld toont hoe je dubbele marges kunt voorkomen. Het + symbool betekent “direct volgend element”. Dus article.typeA:has(+ article.typeA) betekent: “selecteer een article met class typeA die direct gevolgd wordt door nog een article met class typeA”.
Voorheen losten we dubbele marges op met negatieve marges:
article.typeA + article.typeA {margin-top: -50px}, maar dat kan ongewenste bijeffecten hebben. Met de :has selector houden we de oplossing veel schoner.
Voorbeeld: Styling op basis van inhoud
article.typeA:has(img) { display: flex; }
Hiermee kun je de styling van een element laten afhangen van de inhoud, zonder extra classes zoals article.hasImage te hoeven gebruiken.
Praktijkvoorbeeld: Hover states in combinatie met popups en menu’s
Het probleem
In onze applicatie Clientbox hebben we een takenmodule met een kanban-weergave. Een kaart in deze weergave heeft een footer met actieknoppen die alleen zichtbaar zijn bij het hoveren van de kaart of wanneer er een actie actief is.