Hvad er :has()
:has() kaldes ofte en relationel pseudo-klasse: du kan style et element ud fra hvad det indeholder eller hvad der ligger ved siden af det.
Det gør det muligt at flytte logik op på parent-niveau i stedet for at style kun det inderste element.
Det åbner op for helt nye måder at tænke på i forhold til styling baseret på indhold og struktur.
Patterns og øvelser
Der er mange patterns du kan bygge med :has(). Her er nogle eksempler:
.card:has(img)Vælger .card, hvis der findes et img indeni.
.card:not(:has(img))Vælger .card, hvis den ikke har et billede.
.form:has(:focus-within)Vælger .form, hvis et felt indeni har fokus.
.option:has(input:checked)Vælger .option, hvis den indeholder et input der er :checked.
.list:has(:nth-child(4))Vælger .list, hvis der er mindst 4 børn.
.item:has(+ .item)Vælger .item, hvis der findes en søskende-.item lige efter.
.item:has(~ .item)Vælger .item, hvis der findes en søskende-.item senere i DOM'en.
.card:has(img, video)Vælger .card, hvis den har enten img eller video indeni.
.card:has(img):has(video)Vælger .card, hvis den har både img og video indeni.
.gallery:not(:has(:not(img)))Vælger .gallery, hvis den ikke har noget indhold der ikke er et img.
:has() er altså særligt nyttig, når du har brug for at style baseret på indholdets tilstedeværelse, tilstand eller mængde. Det kan være:
- card, hvor indholdet kan variere
- formularer, hvor noget bliver aktivt eller valgt
- lister og feeds med forskelligt antal elementer
- layout, der skal skifte alt efter indholdet
Test dig selv
- Knappen med et ikon skal have helt runde hjørner og have reduceret padding på højre side til
0.675rem.
- Giv kun det udsolgte produkt en outline ved hjælp af CSS
:has().
.containerskal have et grid med to kolonner, hvis der er et<figure>-element. Hvis der ikke er et<figure>-element, skal.containerhave enmax-widthpå40chog være centreret.
- Giv
pen grøn farve, hvis den kommer førfigure, og rød farve, hvis den kommer efterfigure.