1. Webdesign 101 forside
  2.  » CSS
  3.  » CSS under hjelmen

CSS under hjelmen

Selektorer: CSS pseudoklasser, pseudoelementer og attributselektorer

CSS for viderekomne kunne jeg også have brugt som overskrift for artiklerne i denne sektion.

Artiklerne dykker ned under overfladen inden for et emne der har at gøre med, hvorledes vi matcher vore formregler til websidens indhold.

Efter en kortfattet indledning gennemgår denne artikel følgende selektorer:

Begreberne

For at klare begreberne vil jeg starte med noget grundlæggende terminologi.

En formdeklaration er en komplet CSS-erklæring, der omfatter én eller flere selektorer og en formregelblok, der omfatter et antal formregler:

h3 {
  font-size:1.1em;
  line-height:100%;
  margin:0.2em auto 0.5em auto;
  color:maroon;
  background-color:transparent;}

I ovenstående er h3 selektoren. Formregelblokken indeholder fem formregler for fem forskellige egenskaber, jeg ønsker at påtrykke ethvert h3-element.

h3, h4 {
  font-size:1.1em;
  line-height:100%;
  margin:0.2em auto 0.5em auto;
  color:maroon;
  background-color:transparent;}

I ovenstående er både h3 og h4 selektorer og påtrykkes de samme egenskaber.

Egenskaber, der ikke er sat i en sådan formdeklaration, arves. Er der en egenskab, der ikke er defineret i dit stylesheet, bestemmer browseren værdien af denne egenskab. Det er meget tydeligt for så vidt angår font-family. Du kan sætte en font-family for body, der arves af alle websidens elementer. Eller du kan helt undlade at bestemme en font-family, hvorefter de fleste browser vil vise en Times New Roman i medium størrelse, svarende til ca. 16 pixel.

Indsætter jeg i mit stylesheet efterfølgende ovenstående en ny formdeklaration:

h4 {color:black;}

vil alle h4-elementer fortsat få de egenskaber, der er sat i den foregående formdeklaration, men elementets farven vil blive sort.

Ønsker du at give et antal elementer nogle egenskaber, der afviger fra de egenskaber de pågældende elementer normalt skal have, bruger du klassenavne:

<h3 class="mellemrubrik">

Formdeklarationen, der formaterer netop disse h3-elementer, er:

h3.mellemrubrik {overline underline;}

Ønsker du at kunne give et vilkårligt element disse egenskaber, udformes formdeklarationen på følgende måde:

.mellemrubrik {overline underline;}

I ovenstående er class en attribut, og mellemrubrik er attributtens værdi.

Simple selektorer

De lettest forståelige og mest anvendte selektorer er blandt andet dem, der er nævnt ovenfor. Jeg gennemgår dem lige for en ordens skyld:

Universalselektoren
Selektoren er en stjerne (asterisk, *):
* {margin:0;padding:0;}
Denne formdeklaration matcher alle elementer, og eksempel anviser en metode til sikre at alle elementers margin og padding nulstilles. Efterfølgende må du så oprette formdeklarationer vedrørende disse egenskaber for de elementer, du anvender på dine websider.
div#nav * {
font-family:arial,helvetica, sans-serif;
font-size:.9em;}
Denne formdeklaration vil vise alle tekstelementer i en div med en id="nav" med en sans-serif skrift i størrelsen 0,9 gange den normale skriftstørrelse.

Bemærk især for så vidt angår lister (og HTML-tabeller) at det er et voveligt foretagende at sætte skriftsstørrelser i andele eller procenter ved hjælp af universalselektoren. En skriftstørrelse på for eksempel 90% nedarves fra forædrelementet, så du får progressivt minder skrift i de indlejrede lister.

Element-selektoren
Selektoren er navnet på et HTML-element. Eksempler:
img {border:none;}
h1 {font-size:1.5em; color:#555;}
p {margin: 0 auto 0.5em auto;}
.class-elektoren
Selektoren matcher alle elementer, der har et klassenavn class. Eksempler:
.right { text-align:right;}
img.right {
  float:right;
   margin:0.3em 0 0.3em 0.5em;}
p.advarsel {
  background:yellow;
  padding:0.3em .5em;
  border:1px solid black;}
.sansserif {
  font-family:arial, helvetica, sans-serif;
  font-size:90%;}
.class.class-selektoren
Sammenkædede klassenavne matcher elementer, der indeholder begge klassenavne.
.sserif {font-family:arial;}
.obs {
  background:yellow;
  padding:0.3em .5em;
  border:1px solid black;}
.obs.sserif {
  text-transform:uppercase;
  font-size:90%;}

Disse eksempler vil tegne følgende afsnitselementer:

Undlad venligst at klikke på Send-knappen mere en én gang. Behandlingen af de indsendte data kan tage et antal sekunder.

Ovenstående skal vise standardskriften på gul bagrund og med en sort rammekant omkring. class="obs".

Undlad venligst at klikke på Send-knappen mere en én gang. Behandlingen af de indsendte data kan tage et antal sekunder.

Ovenstående skal vise et almindeligt tekstafsnit med Arial eller anden sans-serif skrift. class="sserif".

Undlad venligst at klikke på Send-knappen mere en én gang. Behandlingen af de indsendte data kan tage et antal sekunder

Ovenstående skal vise et tekstafsnit med gul baggrund, sort rammekant og med versalskrift (store bogstaver). class="obs sserif".

#id-selektoren
Selektoren matcher det element, der har en id="id".
div#nav {
float:right;
width:200px;
padding-left:20px;
border-left:3px solid #555;}

Bemærk, at en webside kan omfatte et vilkårligt antal klassenavne, men kun ét (1) element med en given id.

Kombinationsselektorer

Således betegner vi flere selektorer, der virker i sammenhæng med hinanden.

Afkomsselektoren (Descendant Selector)
Sektoren matcher et element, der er afkom af et andet element.
p em {font-style:normal; font-variant:small-caps;}
ul.zmenu li {font-variant:small-caps;}
Den første formdeklaration matcher alle em-elementer, der er afkom af et p-element, men ikke em-elementer, der er afkom af for eksempel li-elementer eller td-elementer.
Den anden formdeklaration matcher alle li-elementer, der er afkom af en ul med klassenavnet zmenu.

HTML-eksempel:

<ul class="zmenu">
<li>Menupunkt 1</li>
<li>Menupunkt 2
  <ol>
  <li>Menupunkt 2.1</li>
  <li>Menupunkt 2.2</li>
  <li>Menupunkt 2.3</li>
  </ol>
  </li>
<li>Menupunkt 3</li>
<li>Menupunkt 4</li>
<li>Menupunkt 5</li>
</ul>

HTML-koden herover tegner følgende liste:

  • Menupunkt 1
  • Menupunkt 2
    1. Menupunkt 2.1
    2. Menupunkt 2.2
    3. Menupunkt 2.3
  • Menupunkt 3
  • Menupunkt 4
  • Menupunkt 5

Det er tydeligt i eksemplet, at alle listepunkterne tegnes med den samme skrifttype. Alle listepunkterne har samme fælles forældreelement.

ul.zmenu * li {formregelblok}

Ovenstående vil matche alle elementer, der er afkom af af en li i ul.zemenu, det vil sige alle li'er i den indlejrede liste, men ikke første-generations-li'erne. For at matche første-generations-li'erne og kun dem er vi nødt til at ibrugtage forældre-barn-selektoren:

Forældre-barn-selektoren
Selektoren matcher alle elementer, der er umiddelbart afkom af et andet element.
ul.ymenu>li {formregelblok}
Ovenstående vil matche alle li'erne i en uordnet liste med klassenavnet ymenu, men ikke li'er i lister, der er indlejret i denne ul.
  • Menupunkt 1
  • Menupunkt 2
    1. Menupunkt 2.1
    2. Menupunkt 2.2
    3. Menupunkt 2.3
  • Menupunkt 3
  • Menupunkt 4
  • Menupunkt 5

Et advarende ord er her på sin plads: Hvis du ikke i dit globale stylesheet har en formdeklaration, der eksplicit sætter skriftfarven på lister, vil den indlejrede ol arve farven fra den overordnede liste, selvom den gengivne formdeklaration eksplicit kun matcher de li-elementer, der er direkte afkom af ul'en.

Listen herover er formateret med følgende formregel:

ul#ymenu > li {color:teal;}

Hvis du studerer andre websidekonstruktørers stylesheets vil du af og til se denne selektor anvendt på følgende måde: html>body div#box. Det er et såkaldt stylesheet hack, der er en metode til at passere forskellige formregler til forskellige browsere.

Lad være med det! Det er i den grad gået af mode. Nærmere forklaring i artiklen Internet Explorer 7 og webstandarderne.

Nærmest søskende-selektoren (Adjacent Sibling Selector)
Selektoren matcher det førstfølgende element efter et element.
h1 + p {font-weight:bold;}
Eksemplet vil vise det første tekstafsnit efter et h1-element med fed skrift.
Med søskende mener jeg to elementer, der har fælles forældreelement i det, man kalder DOM-træet: Alle HTML-elementer er afkom af body-elementet. Har du kun en h1 overskrift og nogle tekstafsnit, er tekstafsnittene søskende i forhold til body-elementet.
Alle søskende selektoren (General Sibling Selector)
Selektoren matcher alle elementer efter et element.
h1 ~ p {margin-left:1em; text-indent:-1em;}
Eksemplet vil vise alle tekstafsnit, der følger efter en h1-overskrift, med hængende indrykning.

Kombinationsselektorer eksempelside.

Attributselektorer

Som det fremgår af ovenstående, er valget af selektor afgørende for dine muligheder for at give specifikke elementer nogle særlige egenskaber. Heldigvis er paletten noget bredere end de foregående eksempler.

  1. Du kan udvælge elementer efter deres tilstand.
  2. Du kan udvælge virtuelle elementer – det vil sige elementer, der ikke er en iboende del af websidens HTML-opmærkning.
  3. Og du kan udvælge elementer med bestemte attributter eller bestemte attributter med bestemte værdier.

Pseudoklasser

Pseudoklasser svarer til almindelige klasser, som blot ikke er defineret i HTML-koden. Det kan formuleres sådan, at en pseudoklasse matcher en bestemt tilstand for et HTML-element der optræder i kildekoden.

Alle, der bare har snuset en lille smule til websidekonstruktion kender til begrebet, selv om de måske ikke har tænkt så meget på, hvad tingen hedder.

Pseudoklasser giver os mulighed for at formatere bestemte tilstande eller instanser af elementerne. Du kender det udmærket fra links. Et link på en webside kan have de fem tilstande, der er beskrevet i tabellen herunder:

Pseudoklasser, der vedrører et aktivt elements tilstand
SelektorBeskrivelse
a:linkRefererer til et link
a:visitedRefererer til et link, der har været besøgt
:focusRefererer til et element, der aktuelt har input fokus, det vil sige elementet kan aktiveres
:hoverRefererer til et element, hvor musemarkøren befinder sig over linket
:activeRefererer til et element, hvor venstre musetast er trykket ned

Modsætningsvis er pseudoelementer virtuelle elementer, der ikke eksplicit er oprettet i kildekoden. Om disse kan du læse i artiklen CSS pseudoelementer

Formatering af links

De pseudoklasser, der er nævnt i denne artikel, finder primært anvendelse i forbindelse med formatering af links. Dette emne er tilpas bredt til, at jeg har skrevet en separat artikel om det: Formatering af links

Desuden findes der en del flere pseudoklasser med meget interessante anvendelsesmuligheder. Disse fortæller jeg om i artiklen CSS pseudoklasser.

November 2009