CSS Selectors
Wat ga je leren?
Je leert hoe je met geavanceerde CSS selectors heel gericht elementen kiest op basis van hun plek in de HTML-structuur. Ook ontdek je hoe de browser beslist welke stijl wint wanneer verschillende regels tegelijk gelden (specificiteit en prioriteit).
Theorie
Je weet al hoe je elementen selecteert via hun tagnaam (p), een klasse (.knop) of een id (#header). Met geavanceerde selectors kun je nog veel preciezer stijlen toepassen.
Elementen binnen elementen (Nesting)
Met een spatie tussen twee selectors selecteer je een element dat zich ergens binnen een ander element bevindt:
.hoofdmenu a {
color: green;
}
Dit stijlt alle <a>-elementen binnen .hoofdmenu. Links op de rest van de pagina veranderen niet.
Alleen directe kinderen (>)
Soms wil je alleen elementen aanspreken die direct onder een ouder-element staan (één niveau diep), en niet in dieper geneste elementen:
.bericht > p {
border-left: 3px solid green;
}
Een <p> direct in <div class="bericht"> krijgt de rand wel. Een <p> die binnen een <blockquote> in dat artikel staat, krijgt de rand niet.
Selectors groeperen (,)
Hebben verschillende elementen dezelfde stijl nodig? Zet een komma tussen de selectors om herhaling te voorkomen:
h1, h2, h3 {
font-family: sans-serif;
color: darkblue;
}
Tag en klasse combineren
Wil je een klasse alleen laten gelden op een specifiek type HTML-element? Plak de klasse direct achter de tagnaam, zonder spatie:
p.belangrijk {
background-color: yellow;
}
Alleen een <p class="belangrijk"> krijgt nu een gele achtergrond. Een <h2 class="belangrijk"> slaat de browser over.
Welke regel wint? (Specificiteit en prioriteit)
Wanneer meerdere CSS-regels hetzelfde element proberen te stijlen met verschillende waarden, berekent de browser welke selector het meest specifiek is.
De rangorde van laag naar hoog:
- Tagnaam (
p,div,h1) — 1 punt - Klasse (
.bericht,.opvallend) — 10 punten - ID (
#belangrijk) — 100 punten
Een selector met een hogere score wint altijd van een selector met een lagere score:
p(1 punt) verliest van.tekst(10 punten)..bericht p(10 + 1 = 11 punten) wint van.tekst(10 punten).#belangrijk(100 punten) wint van.bericht p.opvallend(10 + 1 + 10 = 21 punten).
Wat bij een gelijke score?
Als twee selectors exact dezelfde specificiteit hebben, wint de regel die als laatste in het CSS-bestand staat. Dit is het 'cascading' principe van CSS (Cascading Style Sheets).
Predict
Bekijk deze HTML en CSS:
<div class="kaart">
<p class="tekst">Wat voor kleur word ik?</p>
</div>
p {
color: blue;
}
.kaart p {
color: green;
}
.tekst {
color: red;
}
Welke kleur krijgt de tekst in de browser?
Klik hier voor het antwoord
De tekst wordt groen.
De specificiteit-scores:
p= 1 punt (alleen een tagnaam).tekst= 10 punten (één klasse).kaart p= 11 punten (één klasse + één tagnaam)
Omdat .kaart p de hoogste score heeft (11 punten), wint de kleur groen.
Probeer het zelf.
Investigate
Experimenteer in het code-oefenveld hierboven:
- Verander
.bericht > pin.bericht p(zonder>). Wat gebeurt er met de tekst in het citaat (blockquote)? - Verander de volgorde van
h2, pen.bericht > pin de CSS. Maakt de volgorde uit voor de uiteindelijke stijl? - Voeg in de CSS onderaan
#belangrijk { color: purple; }toe. Waarom verandert de tekstkleur van de laatste paragraaf, ook al staat.opvallender ook op? - Verwijder het hekje bij
#belangrijkin de CSS. Wat gebeurt er nu met de mededeling?
Modify
Opdracht: Pas de code aan:
- Zorg dat links in het hoofdmenu (
.hoofdmenu a) een gele achtergrond (background-color: #e8f5e9;) enpadding: 4px 8px;krijgen. - Laat het citaat binnen het artikel (
.bericht blockquote p) cursief worden (font-style: italic;) met een grijze tekstkleur (color: #555555;). - Voeg een regel toe voor
ain het algemeen metcolor: red;. Controleer of de links in het hoofdmenu groen blijven door de hogere specificiteit van.hoofdmenu a.
Tip
Gebruik de nesting selector .bericht blockquote p om precies de paragraaf in het citaat te selecteren.
Antwoord
Voeg deze regels toe aan de CSS:
/* Algemene links */
a {
color: red;
}
/* Aangepaste menu-links */
.hoofdmenu a {
color: green;
text-decoration: none;
font-weight: bold;
background-color: #e8f5e9;
padding: 4px 8px;
}
/* Paragrafen in het citaat */
.bericht blockquote p {
font-style: italic;
color: #555555;
}
Make
Opdracht: Bouw een menukaart voor een lunchroom.
- Maak een lijst met ten minste twee categorieën (
<h2>), zoals Broodjes en Dranken. - Plaats onder elke categorie een aantal gerechten in een
<div>of<ul>. - Gebruik een groeperende selector (
,) om alle koppen (h1, h2) dezelfde kleur te geven. - Gebruik een kind- of geneste selector (bijvoorbeeld
.menu-groep > pof.gerecht span) om de prijzen rechts of vetgedrukt weer te geven. - Geef één gerecht de klasse
dagaanbiedingen een ander gerecht het id#favoriet. - Laat met CSS zien dat
#favorieteen speciale rand of achtergrond krijgt die sterker is dan de algemene opmaak.
Tip
Begin met een duidelijke HTML-structuur met klassen zoals menu-sectie en gerecht. Gebruik vervolgens in CSS combinaties zoals .menu-sectie h2 en #favoriet.
Antwoord
<div class="menukaart">
<h1>Lunchroom De Haven</h1>
<h2>Warme broodjes</h2>
<div class="gerechten">
<p class="gerecht dagaanbieding">Broodje warm vlees <span class="prijs">€ 6,50</span></p>
<p class="gerecht" id="favoriet">Broodje geitenkaas <span class="prijs">€ 7,00</span></p>
</div>
<h2>Dranken</h2>
<div class="gerechten">
<p class="gerecht">Verse jus d'orange <span class="prijs">€ 3,50</span></p>
<p class="gerecht">Warme chocolademelk <span class="prijs">€ 3,00</span></p>
</div>
</div>
h1, h2 {
color: #2c3e50;
font-family: sans-serif;
}
.menukaart {
max-width: 500px;
padding: 20px;
background-color: #fcfcfc;
border: 1px solid #ddd;
}
.gerechten > p {
padding: 8px;
margin: 4px 0;
border-bottom: 1px dashed #ccc;
}
.gerecht .prijs {
font-weight: bold;
color: #27ae60;
}
.dagaanbieding {
background-color: #fffde7;
}
#favoriet {
background-color: #e8f5e9;
border: 2px solid #2e7d32;
font-weight: bold;
}
Er gaat iets mis
Spatie tussen tag en klasse (p .opvallend vs p.opvallend)
/* Fout: spatie tussen tag en klasse */
p .opvallend {
color: red;
}
/* Goed: geen spatie tussen tag en klasse */
p.opvallend {
color: red;
}
Met een spatie zoekt de browser naar een element met klasse opvallend dat binnen een <p> staat. Zonder spatie selecteer je het <p> element dat zelf die klasse heeft.
Komma vergeten bij groeperen (h1 h2 vs h1, h2)
/* Fout: geen komma */
h1 h2 {
color: blue;
}
/* Goed: met komma */
h1, h2 {
color: blue;
}
Zonder komma zoekt CSS naar een <h2> die zich binnen een <h1> bevindt (wat in geldige HTML nooit voorkomt). Met een komma stijlt de browser zowel <h1> als <h2>.
Denken dat HTML-volgorde de prioriteit bepaalt
Als een element meerdere klassen heeft, zoals <p class="blauw rood">, maakt het niet uit welke klasse eerst in de HTML staat. De regel die als laatste in het CSS-bestand staat, wint bij gelijke specificiteit.