CSS/Valikuline selekteerimine

< CSS

Tihtipeale jääb väheseks üksnes võimalusest omistada stiile HTML-i elemendi nime järgi, näiteks muuta mõni konkreetne pealkiri allajoonituks või teha ühe lõigu piires kõik rõhutatud sõnad punaseks. Selleks ja veel palju enamaks on CSS-is mitmesugused selektorid.

Kõigi elementide selekteerimine

muuda

Sümbol * (tärn) selekteerib kõik elemendid. Esmapilgul võib tunduda, et selle effekt on täpselt sama, mis kasutades body elementi, kuid neil kahel on siiski selgelt tuntav vahe.

Mille poolest erinevad üksteisest näiteks järgnevad deklaratsioonid:

* { color: green }
body { color: green }

Mõlemad muudavad kogu teksti roheliseks, aga erinevus seisneb selles, et määrates värvi elemendile body, kandub see edasi kõigile temas sisalduvatele elementidele, välja arvatud nendele, millele on atribuut color juba eelnevalt määratud. Seega muutub roheliseks kõik ülejäänud tekst peale linkide, sest neile on juba antud sinine värv. Kasutades tärni (*) muutub aga roheliseks kogu tekst, sealhulgas ka lingid. Põhimõtteliselt on tärn samaväärne sellega, kui me kirjutaksime kõik html-i elemendid ja eraldaksime nad komadega:

a, abbr, acronym, ... , var { ... }

Alamelementide selekteerimine

muuda

Selguse huvides kasutame järgmist HTML-i koodinäidet:

<body>
  <h1>Lorem ipsum <em>dolor</em></h1>
  <p>Lorem ipsum dolor <strong>sit amet</strong>, consectetur
   adipisicing elit, sed do eiusmod tempor incididunt ut labore et 
   dolore magna aliqua. Ut <em>enim</em> ad minim veniam, quis 
   nostrud <a href="#">exercitation <em>ullamco</em> laboris</a> 
   nisi ut aliquip ex ea <a href="#">commodo</a> consequat. Duis 
   aute irure dolor in reprehenderit in voluptate velit esse cillum 
   dolore eu fugiat nulla <em>pariatur</em>. Excepteur sint occaecat 
   cupidatat non proident, sunt in culpa qui <em>officia</em> 
   deserunt mollit anim id est laborum</p>
</body>

Sooviksime, et kõik em elemendid, mis on pealkirjades oleksid hariliku kaldkirja asemel hoopis allajoonitud, aga linkide (a) sees olevad em id oleksid nii üla- kui alajoonitud, kõik ülejäänud oleksid kaldkirjas nagu ikka.

Sellisel puhul aitab meid võimalus selekteerida alamelemente ehk siis elemente, mis asuvad teise elemendi sees. Süntaks on järgmine:

E F { ... }

Taoline selektor valib kõik elemendid F, mis asuvad elemendi E sees või viimases sisalduva elemendi sees jne jne. Seega võime koostada järgmise stiililehe:

h1 em {
    text-decoration: underline;
    font-variant: normal;
}
a em {
    text-decoration: underline overline;
    font-variant: normal;
}

Selle sama võib kirjutada ka järgmiselt:

h1 em, a em { font-variant: normal }
h1 em { text-decoration: underline }
a em { text-decoration: underline overline }

Pange tähele, et korraga on eraldatud h1 em ja a em, kuna koma on väga madala prioriteediga selektor ning võetakse arvesse kõige viimasena (samamoodi nagu matemaatikas liitmistehe tehekse alles peale korrutamisi, jagamisi ja astendamisi). Järgnev näide ei tee seda, mida ta näib tegevat:

h1  em,strong { color: blue }

Selle asemel et muuta siniseks pealkirjas resideeruvad em ja strong elemendid, muudetakse siniseks vaid pealkirjades asuvad em-id ning strong-id tehakse kõik siniseks.

Järglaste selektorit võib kasutada ka mitu korda järjest. Näiteks, et selekteerida em elemendid, mis asuvad lõikude sees:

p a em { ... }

võib pikendada seda seda selektorit veelgi:

html body p a em { ... }

Selektoris võib elemendi asemel kasutada ka tärni (*), mille koha peale sobib suvaline element. Näiteks, et selekteerida kõik rõhutused, mis asuvad lõigu piires mõne teise elemendi sees:

p * em { ... }

Või selekteerida kõik elemendid, mis asuvad lõigus mõne teise elemendi sees:

p * * { ... }

Klassid ja ID-d

muuda

HTML lubab määrata igale elemendile klassi (parameeter class) ja / või identifikaatori (parameeter id). Klassi ja identifikaatori peamine erinevus seisneb selles, et ID peab olema lehekülje piires unikaalne, ehk siis id väärtust, mis määratud ühele elemendile, ei saa enam anda teisele. Ühte klassi võib samas aga kuuluda piiramatu arv elemente. Lisaks võib üks element kuuluda korraga mitmesse klassi.

Klassid ja ID-d annavad võimaluse lisada HTML-ile semantilist (tähenduslikku) infot. Päris kindlasti vajavad aga klassi ja / või ID määramist elemendid div ja span, millel muidu puudub igasugune semantiline tähendus.

Olgu meil näiteks selline HTML-i lõik:

<div id="peatykk-1" class="peatykk">
  <h1>Lorem ipsum <em>dolor</em></h1>
  <p>Lorem ipsum dolor <strong>sit amet</strong>, consectetur
   adipisicing elit, sed do eiusmod tempor incididunt ut labore et 
   dolore magna aliqua. Ut <em>enim</em> ad minim veniam, quis 
   nostrud <a href="#peatykk_2" class="siselink">exercitation</a>
   ullamco laboris nisi ut aliquip ex ea <a href="#">commodo</a>
   consequat. Duis aute irure dolor in reprehenderit in voluptate
   velit esse cillum dolore eu fugiat nulla <em>pariatur</em>.</p>
  <p>Excepteur sint <span class="laul">juhheirassa, huhhei</span>
   qui <em>officia</em> deserunt mollit anim id est laborum</p>
</div>
<div id="peatykk-2" class="peatykk">
  <h1>At vero eos et accusamus</h1>
  <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui 
   blanditiis <a href="peatykk_1" class="siselink">praesentium</a> 
   voluptatum deleniti atque corrupti quos dolores et quas molestias 
   excepturi <em>sint occaecati cupiditate</em> non provident, 
   similique sunt in culpa qui. <strong class="hoiatus">Officia 
   deserunt mollitia attencione!</strong> Id est laborum et dolorum 
   fuga. Et harum quidem rerum facilis est et expedita 
   distinctio.</p>
  <p class="laul">Kes hommikuti külas käib,<br />
   see asjatult ei longi,<br />
   sest teavad kõik - param-paraa -<br />
   et selleks hommik ongi.</p>
</div>

Klassid

muuda

Klasside selekteerimiseks kirjutatakse elemendi nime järele punkt ., peale mida kirjutatakse klassi nimi. Süntaks järgmine:

element.klassinimi { ... }

Seda teades võime kirjutada stiilid eelmises HTML-i näites toodud klasside jaoks:

div.peatykk { border-bottom: double thin gray }
a.siselink { text-decoration: underline overline }
span.laul, p.laul { font-style: italic }
strong.hoiatus {
    background-color: red;
    text-transform: uppercase;
}

Kuna tegelikult sooviksime kõigi klassi laul kuuluvate elemntide teksti kirjutada kursiivis, siis võime kasutada kõikide elementide selektorit *:

*.laul { font-style: italic }

Selles konstruktsioonis võime ka tärni ära jätta ning kirjutada lihtsalt:

.laul { font-style: italic }

See on täiesti samaväärne koos-tärniga variandiga.

Identifikaatorid

muuda

Identifikaatorite selekteerimiseks kirjutatakse elemendi nime järele sümbol # (trellid), mille järel omakorda identifikaatori nimi.

element#identifikaator { ... }

Seega võime kirjutada stiilid meie HTML-i näites olevatele ID-dele:

div#peatykk-1 { background-color: #ccd }
div#peatykk-2 { background-color: #dcc }

Analoogselt klassidega võime kasutades tärni (*) valida suvalise elemendi, millele vastav ID on seatud:

*#peatykk-1 { background-color: #ccd }

Või kirjutada sama ilma tärnita:

#peatykk-1 { background-color: #ccd }

Tihtipeale ongi mugav kasutada just viimati toodud süntaksi, sest nagunii omab seda ID-d vaid üks element, mille tüüp on üldjuhul teada ega muutu.

!important

muuda

Teinekord on tarvis, et mõni stiil oleks kõrgema prioriteediga kui teised.

Olgu meil üks suur pikk dokument, mis on jaotatud div elemente kasutades alamosadeks: sissejuhatus, sisuosa, kokkuvõte ja lisad. Me soovime värvida igas dokumendi osas olevad pealkirjad erineva värviga ning kirjutame seega nõnda:

#sisu         h2, #sisu         h3 { color: green }
#sissejuhatus h2, #sissejuhatus h3 { color: blue  }
#kokkuvote    h2, #sissejuhatus h3 { color: brown }
#lisad        h2, #lisad        h3 { color: black }

Kuid mõningad osad meie dokumendist on alles kirjutamisel ning seetõttu me lisame igale pooleliolevale sektsioonile klassi pooleli. Kuna me soovime lugejaid selgelt informeerida, millised osad tekstist on alles toimetamisel, muudame nende sektsioonide teksti punaseks:

.pooleli { color: red }

Kuid oh häda - sedasi tehes muutub punaseks vaid tekst ning pealkirjad jäävad endiselt seda värvi, mis nad olid ülalpool määratud. Isegi kui me kirjutame nõnda:

.pooleli, .pooleli h2, .pooleli h3 { color: red }

Või, kui me oleme nõus, et ka lingid, mis on poolelioleva teksti sees, samuti punaseks muutuvad, siis saame kirjutada veelgi lühemalt:

.pooleli * { color: red }

Tuleb tunnistada, et reaalses elus on situatsioonid, kus meil on tarvis veebilehe kujundamisel !important käsku kasutada, niisama harvad kui Eesti maavärinad. Märksa olulisemat rolli mängib !important aga kasutajapoolsetes stiililehtedes, kus see on praktiliselt ainus võimalus määramaks stiile, mida veebilehe autorid üle kirjutade ei saa.


Selektorite kombineerimine

muuda

Klasse ja ID-sid saab kenasti kasutada koos ning kombineerida neid teiste selektoritega. Näiteks võime täpsustada, et ID peatykk-1 peab kuuluma klassi peatykk:

div.peatykk#peatykk-1 { ... }

Võib määrata, et kõigi esimeses peatükis olevate linkide taustavärv oleks roheline:

div#peatykk-1 a { background-color: green }

ning siselinkide oma kollane:

div#peatykk-1 a.siselink { background-color: yellow }

Lõpetuseks võib kõik need näited kokku klapitada, lisada väikseid täiendusi ning saada sellise stiilile:

body {
  font-family: sans-serif;
  padding: 0em;
}

div.peatykk {
    padding: 1em;
    margin: 0em;
}

div.peatykk h1 { border-bottom: double thick gray }

div#peatykk-1 { background-color: #ccd }
div#peatykk-2 { background-color: #dcc }


a.siselink { text-decoration: underline overline }

div.peatykk a { background-color: yellow }

.laul { font-style: italic }

strong.hoiatus {
    background-color: red;
    text-transform: uppercase;
}

mis annab meie lehele umbes sellise välimuse: