Met Cascading Style Sheets (CSS) kunt u het uiterlijk van uw webpagina's veranderen. Van lettertypen en kleuren tot spatiëring en algehele lay-out, allerlei ontwerptools zijn binnen handbereik. Hoewel CSS in zijn geheel een gecompliceerde taal is, zijn er slechts twee basisconcepten die u moet begrijpen om te beginnen.
Het begint allemaal met het identificeren van welk deel van een pagina u precies wilt opmaken.
CSS = Selectors + Declaraties
Een CSS-bestand bevat een reeks regels die beschrijven hoe een HTML-bestand moet worden opgemaakt. Elke regel bestaat uit twee delen: wat je moet stylen en hoe je het moet stylen. Het eerste deel wordt bestuurd met behulp van een reeks termen die bekend staan als 'selectors'.
Voorbeelden in dit artikel zijn stijldeclaraties, maar daar gaat het niet om: de selectors zelf wel.
Historisch gezien waren er drie CSS-selectorniveaus (of versies) met verschillende mate van browserondersteuning. Volgens Can I Use zijn deze in 2020 allemaal beschikbaar voor meer dan 99 procent van de gebruikers over de hele wereld.
Niveau 1-kiezers
Niveau 1 introduceerde de vier fundamentele soorten selectors die een groot aantal gevallen dekken, zelfs vandaag de dag.
Patroon |
Wedstrijden |
E |
alle E-elementen |
.c |
alle elementen met class="c" |
#myid |
het element met id="mijnid" |
E F |
een F-element in een E-element |
Pseudo-lessen |
E:link |
een hyperlink naar een pagina die nog niet eerder is bezocht |
E:visited |
een hyperlink naar een pagina die al is bezocht |
E:active |
een hyperlink die momenteel is geselecteerd |
Pseudo-elementen |
E::first-line |
de eerste opgemaakte regel van een E-element |
E::first-letter |
de eerste opgemaakte letter van een E-element |
Typekiezer
De allereenvoudigste selector is de “type selector”. Het is gericht op alle instanties van een element, zoals een alinea of vetgedrukte tekst:
p { margin-bottom: 0; } b { font-family: sans-serif; }
Klassenkiezer
Met het class-attribuut kan verdere semantiek worden toegevoegd aan een HTML-element, zoals een specifiek type alinea. Dergelijke elementen kunnen als volgt in CSS worden geselecteerd:
.intro { font-weight: bold; }
Deze selector zou overeenkomen met:
…
Maar merk op dat het ook zou overeenkomen met:
Als je wilt dat het alleen van toepassing is op intro-paragrafen, kun je de typekiezer en de klassenkiezer combineren:
p.intro { font-weight: bold; }
ID-kiezer
Het HTML-id-attribuut moet uniek zijn binnen een document, bijvoorbeeld als u:
…
Dat zou het enige element moeten zijn met een 'content'-id. Met een ID-selector kunt u dat specifieke element in een document targeten:
#contents { color: #333; }
Afstammelingkiezer
Strikt genomen een 'combinator', want bij deze selector draait alles om de ruimte tussen twee andere. HTML is hiërarchisch, zoals uitgelegd in ons overzicht van de DOM . Met een descendant selector kan een element worden geïdentificeerd door zijn context binnen een ander element:
table b { font-weight: normal; }
Pseudo-klassen en -elementen
Pseudo-selectors richten zich op klassen of elementen die niet expliciet bestaan, maar toch beschikbaar worden gesteld. Zie ze als speciale inhoudsbonussen:
p::first-line { text-transform: uppercase; }
Selectielijsten
Gebruik een komma om selectors in een lijst te combineren als u op elk van hen dezelfde set regels wilt toepassen. In plaats van:
th { padding: 1em; } td { padding: 1em; }
Je kan schrijven:
th, td { padding: 1em; }
Specificiteit:
Een stylesheet is een reeks regels die een selector gebruiken om een element te matchen, maar wat gebeurt er als meer dan één regel overeenkomt met een bepaald element? Het resulterende gedrag wordt bepaald door "specificiteit" die definieert welke regel wordt gebruikt in een geval zoals:
p.intro { color: black; } p { color: gray; }
In dergelijke gevallen wordt de regel die voorrang heeft, als volgt bepaald door zijn specificiteit:
- ID-selectors (`#contents`) zijn het meest specifiek.
- Klassekiezers (`.author`) zijn minder specifiek.
- Typekiezers (`p`) zijn het minst specifiek.
Bij het berekenen van specificiteit wordt elk niveau alleen in aanmerking genomen als twee selectors dezelfde score hebben op het hogere niveau, dus "#contents" is specifieker dan "article.news p.author.special" omdat het eerste "wint" op ID-selectors.
Niveau 2-kiezers
De volgende herziening van CSS-selectors introduceerde kenmerkselectors, breidde pseudo-klassen en pseudo-elementen uit en voegde twee nieuwe combinators toe.
Patroon |
Wedstrijden |
* |
elk element |
E > F |
een F element kind van een E element |
E + F |
een F-element onmiddellijk voorafgegaan door een E-element |
Kenmerkkiezers |
E[foo] |
een E-element met een "foo" -attribuut |
E[foo="bar"] |
een E-element waarvan het attribuut "foo" precies "bar" is |
E[foo~="bar"] |
een E-element waarvan het attribuut "foo" een lijst is met door spaties gescheiden waarden, waarvan er één "bar" is |
E[foo|="en"] |
een E-element waarvan het attribuut "foo" een door koppeltekens gescheiden lijst met waarden heeft die beginnen met "en" |
Pseudo-lessen |
E:first-child |
een E-element, eerste kind van zijn ouder |
E:lang(fr) |
een element van type E in taal "fr" |
Pseudo-elementen |
E::before |
gegenereerde inhoud vóór de inhoud van een E-element |
E::after |
gegenereerde inhoud na de inhoud van een E-element |
Universele keuzeschakelaar
De "*" komt overeen met elk element. Het is niet vaak zo handig, maar als u bijvoorbeeld standaardmarges wilt resetten, kunt u dit doen:
* { margin: 0; }
Kenmerkkiezers
Met kenmerkselectors kunnen stijlen zeer specifiek worden getarget, gefilterd op het kenmerk van een element:
a[title] { text-decoration: underline dotted; }
Vergelijkbaar met de afstammeling combinator, maar deze komt alleen overeen met directe kinderen, niet met afstammelingen lager in de boom. Bijvoorbeeld, "ul > li" komt hier alleen overeen met de tekst "Sectie 1", en niet met "Sectie 1.1":
Aangrenzende Sibling Combinator: The Next Sibling
h1 + p { font-weight: bold; }
Deze selector is vaak handig voor het controleren van marges of een inleidende alinea zonder een specifieke klasse. Deze selector komt alleen overeen met één element als het onmiddellijk op een ander volgt. In het voorbeeld komt alleen de eerste alinea hier overeen, niet de tweede:
Contents
some extra text
Introductory paragraph
Following paragraph
Merk op dat deze selector alleen elementen in overweging neemt - niet tekst - bij het beslissen wat de volgende broer of zus is.
Erfenis
Sommige CSS-eigenschappen erven hun waarde van een voorouderelement. In de praktijk betekent dit bijvoorbeeld dat het instellen van het lettertype van het element "body" betekent dat elke alinea, tabel, enz. ook datzelfde lettertype gebruikt.
Dit is natuurlijk precies wat je zou verwachten, maar denk eens aan een eigenschap die niet erft: 'marge' bijvoorbeeld. U wilt niet dat elke afzonderlijke alinea of een stukje vetgedrukte tekst dezelfde marge heeft als het hele document.
Gerelateerd: Eenvoudige CSS-codevoorbeelden die u in 10 minuten kunt leren
Een goede vuistregel is om elementen zo algemeen te targeten als zinvol is - richt u niet op elk afzonderlijk element wanneer een eenvoudige 'body'-selector voldoende is.
Niveau 3-kiezers
Er zijn veel meer pseudo-klassen toegevoegd in dit niveau, naast enkele attributenkiezers en een nieuwe combinator.
Patroon |
Wedstrijden |
E ~ F |
een F-element voorafgegaan door een E-element |
Kenmerkkiezers |
E[foo^="bar"] |
een E-element waarvan het attribuut "foo" begint met de tekenreeks "bar" |
E[foo$="bar"] |
een E-element waarvan het attribuut "foo" eindigt met de tekenreeks "bar" |
E[foo*="bar"] |
een E-element waarvan het attribuut "foo" de substring "bar" bevat |
Pseudo-lessen |
E:root |
een E-element, root van het document |
E:nth-child(n) |
een E-element, het n-de kind van zijn ouder |
E:nth-last-child(n) |
een E-element, het n-de kind van zijn ouder, geteld vanaf de laatste |
E:nth-of-type(n) |
een E-element, de n-de broer of zus van zijn type |
E:nth-last-of-type(n) |
een E-element, de n-de broer of zus van zijn type, geteld vanaf de laatste |
E:last-child |
een E-element, laatste kind van zijn ouder |
E:first-of-type |
een E-element, eerste broer of zus in zijn soort |
E:last-of-type |
een E-element, laatste broer of zus in zijn type |
E:only-child |
een E-element, enig kind van zijn ouder |
E:only-of-type |
een E-element, enige broer of zus in zijn type |
E:empty |
een E-element dat geen kinderen heeft (inclusief tekstknooppunten) |
E:target |
een E-element dat het doelwit is van de verwijzende URI |
E:enabled |
een gebruikersinterface-element E dat is ingeschakeld |
E:disabled |
een gebruikersinterface-element E dat is uitgeschakeld |
E:checked |
een gebruikersinterface-element E dat is aangevinkt |
E:not(s) |
een E-element dat niet overeenkomt met eenvoudige selector s |
Kenmerkkiezers
U kunt elementen selecteren met een attribuut dat begint met een gegeven waarde: a[href^="https:"]
, eindigt met een gegeven waarde: img[src$=".gif"]
, of een waarde bevat: a[*="value"]
.
Pseudolessen
Aanvullende pseudo-klassen zijn onder meer “:last-child”, “:empty” (om een element zonder inhoud aan te passen), en “:checked” dat overeenkomt met een element zoals invoer via een selectievakje, maar alleen als het is aangevinkt.
Algemene Sibling Combinator: Een volgende broer of zus
Net als de aangrenzende broer/zus-combinatie van niveau 2, komt deze overeen met elke broer of zus die na de andere komt, niet alleen de volgende:
h1 ~ p { font-size: 110%; }
CSS-kiezers en hoe ze te gebruiken
Nu weet je zo ongeveer alles wat er te weten valt over het selecteren van een deel van een webpagina met behulp van CSS. U bent nu klaar om uw pagina's op te maken met de grote verscheidenheid aan CSS-eigenschappen die alles dekken, van kleuren tot lay-out.
Afbeelding tegoed : Pankaj Patel / Unsplash