:has() relationspseudoklass
Välj överordnade element utifrån deras underordnade element med den kraftfulla relationspseudoklassen :has().
:has() relationspseudoklass är en gratis lektion i CSS Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för CSS Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i CSS Academy innehåller totalt 4 lektioner.
Vad är :has()?
Pseudoklassen :has() väljer ett element om det innehåller en ättling som matchar argumentet. Den kallas ofta för ”föräldraselektorn” och gör det möjligt att formge ett överordnat element utifrån dess underordnade element — en funktion som CSS tidigare saknade.
Grundläggande syntax
.card:has(img) väljer alla .card-element som innehåller en img-ättling. Argumentet är en lista med relativa selektorer — alla giltiga CSS-selektorer som beskriver element i förhållande till det aktuella elementet.
Formgivning av överordnade element
Formge en formulärbehållare när den innehåller ett ogiltigt inmatningsfält: form:has(:invalid) { border-color: red; }. Formge en sektion som innehåller en rubrik: section:has(h2) { padding-top: 2rem; }. Det överordnade elementets utseende ändras utifrån de underordnade elementens tillstånd.
Val av syskonelement
:has() kan välja föregående syskonelement — något som + och ~ inte kan göra. h2:has(+ p) väljer h2-element som följs direkt av p. li:has(~ .active) väljer li-element som har ett efterföljande syskonelement med klassen .active.
Formgivning utifrån formulärtillstånd
Reagera på inbyggd formulärvalidering utan JavaScript: input:has(~ .error-msg) formger ett inmatningsfält som har ett syskonelement med ett felmeddelande. label:has(+ input:required) formger etiketter vars kopplade inmatningsfält är obligatoriska — allt med enbart CSS.
Navigeringstillstånd
Markera navigeringsbehållare utifrån ett aktivt underordnat element: nav:has(.active) tillämpar stilar på hela nav-elementet när något underordnat element har klassen active. Det är användbart för att på behållarnivå visa vilken navigeringssektion som är aktuell.
Kombination med andra pseudoklasser
.grid:has(.card:focus-within) formger hela rutnätet när något kort får tangentbordsfokus. .dropdown:has(:hover) håller en listruta öppen så länge pekaren är över någon ättling — renare än komplexa kedjor av syskonkombinatorer.
Motsvarighet till media query i CSS
.sidebar:has(nav) tillämpar en annan layout än .sidebar:not(:has(nav)). Villkorsstyrd layout utan JavaScript: förekomsten eller frånvaron av specifika underordnade element styr det överordnade elementets layout — vilket möjliggör verkligt adaptiv och innehållsmedveten CSS.
Prestandaöverväganden
:has() med breda argumentselektorer (till exempel :has(*)) kan vara kostsamt — webbläsaren måste kontrollera varje element. Håll argumenten till :has() specifika. Föredra :has(> .specific-child) (direkt underordnat element) framför :has(.specific-child) (valfri ättling) när det är möjligt.
Webbläsarstöd
:has() stöds i Chrome 105+, Safari 15.4+ och Firefox 121+. Fullt baslinjestöd har funnits sedan slutet av 2023. Det finns ingen polyfill (det skulle kräva JavaScript för att simulera funktionen) — använd det med progressiv förbättring i äldre webbläsare där funktionen inte är kritisk.
Ersätta JavaScript-mönster
Mönster som tidigare krävde JS-händelselyssnare: ”lägg till en klass på det överordnade elementet när ett underordnat element får fokus”, ”visa ett överlägg när en modalutlösare finns” och ”formge ett rutnät annorlunda när det har exakt tre objekt”. :has() hanterar alla dessa deklarativt.
Kunskapskontroll
Vad gör :has() unikt jämfört med befintliga CSS-kombinatorer som + och ~?
Sammanfattning
:has() är CSS första verkliga relationella pseudoklass och möjliggör val av överordnade element och föregående syskonelement. Den möjliggör innehållsdriven formgivning, reaktioner på formulärtillstånd, markering av navigering och många mönster som tidigare krävde JavaScript-baserad DOM-manipulering — allt deklarativt i CSS.
Lär dig CSS med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”:has() relationspseudoklass” gratis?
Ja – hela texten till ”:has() relationspseudoklass” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i CSS Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i CSS Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”:has() relationspseudoklass”?
Välj överordnade element utifrån deras underordnade element med den kraftfulla relationspseudoklassen :has(). Ni övar på CSS Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig CSS Academy?
Du behöver inga förkunskaper. Utbildningen i CSS Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”:has() relationspseudoklass”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här CSS Academy-lektionen?
Ja. Varje CSS Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Inbyggd CSS-nästling
- :has() relationspseudoklass
- @scope för avgränsade format
- API:t View Transitions