CSS-valitsimet

Valitsin (selector) kertoo, mihin elementteihin tyylisääntö osuu. Valitsimet ovat CSS:n tärkein yksittäinen asia: kun osaat kohdistaa säännön juuri oikeisiin elementteihin, et tarvitse ylimääräisiä luokkia etkä style-attribuutteja.

Oppimistavoitteet

Tämän luennon jälkeen sinun pitäisi osata:

Mitä tällä luennolla ei käsitellä

Tämä luento käsittelee valitsinten perusteet. Ominaisuudet ja arvot, kaskadi, yksiköt ja värit ovat CSS-luennolla, mediakyselyt omalla luennollaan ja sivun asettelu omallaan.

Attribuuttivalitsimet, loput pseudoluokat, pseudoelementit ja laskurit löytyvät TIEA2120 Web-käyttöliittymien ohjelmointikurssin CSS-valitsimet-materiaalista. Tällä kurssilla niitä ei tarvita.

Harjoittele pelaamalla

Valitsimia voi harjoitella CSS Diner -pelillä. Sen ensimmäiset tasot käsittelevät juuri tämän luennon valitsimia, ja loput menevät jatkomateriaalin puolelle.

1. Käsitteitä

Valitsimet perustuvat siihen, että dokumentti muodostaa puun: elementit ovat sisäkkäin ja peräkkäin. Seuraavat käsitteet tarvitaan, jotta valitsimista voi puhua täsmällisesti.

Äitielementti, vanhempi (parent)
Elementti, jonka sisällä tarkasteltava elementti välittömästi on.
Lapsielementti (child)
Välittömästi tarkasteltavan elementin sisällä oleva elementti.
Jälkeläinen (descendant)
Mikä tahansa elementin sisällä oleva elementti, kuinka syvällä tahansa. Jokainen lapsi on jälkeläinen, mutta jokainen jälkeläinen ei ole lapsi.
Esi-isä, esivanhempi (ancestor)
Elementti, jonka jälkeläinen tarkasteltava elementti on.
Sisarelementti (sibling)
Elementit ovat sisaruksia, jos niillä on sama äitielementti.
Edeltävä ja seuraava sisarus (preceding/following sibling)
Edeltävä sisarus on dokumentissa ennen tarkasteltavaa elementtiä, seuraava sen jälkeen.

Kaikki käsitteet yhdessä esimerkissä:

<article>
  <h2>Otsikko</h2>
  <p>Kappale, jossa on <strong>korostus ja <a href="/">linkki</a></strong>.</p>
</article>
Esimerkin elementtien suhteet.
VäitePitää paikkansa?
p on article-elementin lapsiKyllä
a on article-elementin lapsiEi. Se on jälkeläinen, muttei lapsi
a on article-elementin jälkeläinenKyllä
a on strong-elementin lapsiKyllä
article on a-elementin esi-isäKyllä
h2 ja p ovat sisaruksiaKyllä, molempien äiti on article
h2 on p-elementin edeltävä sisarusKyllä
h2 ja strong ovat sisaruksiaEi. Niillä on eri äitielementti

2. Perusvalitsimet

Yksinkertaiset valitsimet.
ValitsinOsuuEsimerkki
*Jokaiseen elementtiin* { box-sizing: border-box; }
EJokaiseen elementtiin, jonka nimi on Ep { line-height: 1.6; }
.luokkaElementteihin, joiden class-attribuutissa on tämä sana.varoitus { color: red; }
#tunnisteElementtiin, jonka id on tämä#valikko { ... }
E.luokkaE-elementteihin, joilla on tämä luokkap.varoitus { ... }
E#tunnisteE-elementtiin, jolla on tämä tunnistep#tarkein { ... }
.eka.tokaElementteihin, joilla on molemmat luokat.tarkea.uusi { ... }

Valitsimia voi luetella pilkulla erotettuna, jolloin sama sääntö koskee kaikkia:

h1, h2, h3 {
  font-family: Verdana, Arial, sans-serif;
}
Aloita elementeistä, lisää luokkia vasta tarvittaessa

Muotoile ensin elementit sellaisenaan: p, h1, ul. Lisää luokka vasta, kun jokin yksittäinen kohta poikkeaa muista. Näin tyylitiedosto pysyy lyhyenä eikä HTML täyty luokista.

3. Yhdistelmävalitsimet

Yhdistelmävalitsimilla kerrotaan, missä suhteessa elementtien on oltava toisiinsa. Merkki valitsimien välissä ratkaisee.

Neljä yhdistelmävalitsinta.
ValitsinNimiOsuu elementtiin F, joka on
E FJälkeläisvalitsinE-elementin jälkeläinen, kuinka syvällä tahansa
E > FLapsivalitsinE-elementin välitön lapsi
E + FVierusvalitsinE-elementin välittömästi seuraava sisarus
E ~ FYleinen sisarvalitsinE-elementin seuraava sisarus, vaikka välissä olisi muita
Välilyönti on merkitsevä

p strong ja p.strong ovat aivan eri asioita. Ensimmäinen osuu strong-elementteihin kappaleen sisällä, toinen kappaleisiin, joilla on luokka strong. Sama koskee merkkejä >, + ja ~: niiden ympärillä olevat välilyönnit ovat vapaaehtoisia, mutta pelkkä välilyönti tarkoittaa jälkeläisvalitsinta.

Huomaa, että sisarvalitsimet katsovat vain eteenpäin. CSS:ssä ei ole valitsinta, joka osuisi edeltävään sisarukseen.

4. Pseudoluokat

Pseudoluokka valitsee elementin sen tilan tai sijainnin perusteella, eli jonkin sellaisen asian perusteella, jota ei näy HTML-koodissa attribuuttina. Pseudoluokka kirjoitetaan kaksoispisteellä valitsimen perään.

4.1 Linkkien pseudoluokat

Linkin tilat.
PseudoluokkaOsuu, kun
:linkLinkkiä ei ole vielä avattu
:visitedLinkissä on käyty
:hoverOsoitin on linkin päällä
a:link    { color: #0645ad; }
a:visited { color: #663366; }
a:hover   { color: #ffffff; background-color: #0645ad; }
Järjestys on pakollinen

Kirjoita säännöt järjestyksessä :link, :visited, :hover. Muussa järjestyksessä myöhemmät säännöt kumoavat aiemmat, koska niillä on sama spesifisyys, eikä :hover silloin näy käydyillä linkeillä. Muistisääntö on LoVe HAte.

Älä poista kohdistusreunusta

Selain piirtää valittuna olevan elementin ympärille reunuksen, jotta näppäimistöllä liikkuva näkee, missä hän on. Merkintä outline: none tekee sivusta näppäimistöllä käyttökelvottoman. Jos oletusreunus ei miellytä, korvaa se omalla näkyvällä tyylillä äläkä poista sitä.

4.2 Sijainnin mukaan

Sijaintiin perustuvat pseudoluokat.
PseudoluokkaOsuu elementtiin, joka
:first-childon äitinsä ensimmäinen lapsi
:last-childon äitinsä viimeinen lapsi
li:first-child { font-weight: bold; }
li:last-child  { font-style: italic; }

Näiden etu tavalliseen luokkaan verrattuna on se, että muotoilu seuraa rakennetta. Kun listaan lisätään alkio tai siitä poistetaan sellainen, muotoilu siirtyy automaattisesti oikealle alkiolle. Luokkaa käytettäessä se pitäisi muistaa siirtää käsin.

4.3 Dokumentin juuri: :root

:root osuu dokumentin uloimpaan elementtiin, joka HTML-dokumentissa on aina html-elementti. Sitä käytetään koko sivua koskevien oletusarvojen asettamiseen.

:root {
  font-size: 100%;     /* kunnioittaa käyttäjän selaimeensa asettamaa kokoa */
  color-scheme: light dark;
}

Sama olisi mahdollista kirjoittaa myös valitsimella html. :root on kuitenkin vakiintunut tapa, ja se on aavistuksen spesifisempi, koska pseudoluokka lasketaan kuin luokka ja elementin nimi ei.

5. Valitsin ja spesifisyys

Kun useampi sääntö osuu samaan elementtiin, voittaja ratkeaa valitsimen spesifisyydellä: tunniste voittaa luokan ja luokka voittaa elementin nimen. Pseudoluokka lasketaan kuin luokka.

Spesifisyys tämän luennon valitsimilla.
ValitsinSpesifisyys
*0, 0, 0
li0, 0, 1
ul li0, 0, 2
.varoitus0, 1, 0
li:first-child0, 1, 1
#valikko a1, 0, 1

Yhdistelmävalitsimien merkit >, + ja ~ eivät itsessään vaikuta spesifisyyteen. Tarkemmin aiheesta CSS-luennon luvussa 3.2.

6. Tavallisimmat virheet

Virheet, jotka toistuvat useimmin.
VirheSeuraus
Ylimääräinen välilyönti: p .varoitus kun tarkoitettiin p.varoitusSääntö osuu kappaleen sisällä oleviin elementteihin, ei kappaleeseen itseensä
Piste luokan edestä puuttuu: varoitus { }Selain etsii elementtiä nimeltä varoitus, jota ei ole
Risuaita tunnisteen edestä puuttuu: tarkein { }Sama ongelma
Linkin pseudoluokat väärässä järjestyksessä:hover ei toimi käydyillä linkeillä
outline: none kohdistuksen poistamiseksiSivua ei voi käyttää näppäimistöllä
Puolipiste puuttuu edellisen määrityksen lopustaMyös seuraava määritys jää huomiotta
Tarkista valitsin kehittäjätyökaluilla

Jos sääntö ei osu, valitse elementti kehittäjätyökaluilla ja katso oikean laidan sääntöluettelosta, näkyykö sääntösi siellä lainkaan. Jos ei näy, valitsin ei osu; jos näkyy yliviivattuna, jokin toinen sääntö voittaa. Katso HTML5-luennon luku 19.1.

7. Lisätietoa

Käyttäjien kommentit

Kommentoi Lisää kommentti