CSS-tyylit (Cascading Style Sheets, tästä edes CSS) on tekniikka, joka mahdollistaa syntaksiltaan yksinkertaisten ja helposti omaksuttavien tyyliehdotuksien yhdistämisen rakenteellisiin dokumentteihin, kuten HTML- ja XML-tiedostoihin. Tyyliehdotukset koskevat dokumenttien esitystapaa, esimerkiksi sen graafista ulkoasua, ääntämistä, tai tulostusta. Tyylikielen nimessä esiintyvällä Cascading -sanalla viitataan mahdollisuuteen vaikuttaa dokumentteihin usean tyylisäännöstön ja -säännön välityksellä samanaikaisesti.
Tyyliehdotuksia voidaan yhdistää dokumentteihin asiakas/palvelin-arkkitehtuurin kummassakin päässä. Yksittäisen dokumentin esitystapaan voivat vaikuttaa:
Nämä kaikki voivat vaikuttaa yhdessä tai erikseen. Lisäksi asiakasohjelmat, ja joskus itse dokumentitkin, voivat tarjota mahdollisuuksia vaihtaa dokumentin esitysasua. CSS mahdollistaa tekijä ehdottaa, käyttäjä komentaa
-periaatteen, eli viimeinen sana dokumenttien lopullisesta esitystavasta jää aina käyttäjälle.
CSS tuo vain etuja tullessaan, sillä sen avulla voidaan erottaa esitykseen liittyvät seikat dokumenttien rakenteesta ja asiasisällöstä. Tämä on tavoiteltavaa mm. seuraavista syistä:
Dokumenttien käyttöalueet laajenevat: sama rakenne kelpaa eri välineille, kuten tulostimille, puhesyntetisaattoreille, projektoreille, yms., joille sitten tyylien avulla voidaan ehdottaa kullekin sopivaa esitystapaa.
Dokumenttien luonti ja ylläpito yksinkertaistuu: esitystavan suunnittelu, toteuttaminen ja viimeistely voidaan jättää viimeiseksi toimenpiteeksi, tarvittaessa eri osaamisalueiden taitajille. Rakenteellinen koodi helpottaa myös sisältöpäivityksiä ja keskitetty ulkoasuhallinta nopeuttaa esitykseen liittyviä muutoksia.
Dokumenttien tiedostokoko pienenee: samoja tyylejä voidaan yhdistää moneen dokumenttiin, jolloin välimuistien hyödyntäminen tehostuu ja dokumenttien siirrettävyys ja latautuminen nopeutuu.
Tyyliehdotus (style sheet) koostuu vähintään yhdestä tyylisäännöstä (style rule). Tyylisääntö sisältää vähintään yhden selektorin, jolla määritellään tyylisääntöjen kohde dokumentissa, ja deklaraatiolohkon, jossa määritellään tyylit yhdelle tai useammalle selektorille. Deklaraatiolohko taas koostuu vähintään yhdestä deklaraatiosta, eli ominaisuus/arvo parista, jollei se ole tyhjä. Yksinkertaisimmillaan tyylisäännön syntaksi on seuraava:
selektori {ominaisuus:arvo}
Selektori erotetaan tyhjällä tilalla (whitespace, esim. välilyönti) aaltosulkujen sisälle sijoittuvasta deklaraatiosta, jossa ominaisuudet erotetaan arvoistaan kaksoispisteellä. Tyylisäännössä voi esiintyä useampia selektoreita, jolloin nämä erotetaan toisistaan pilkuilla. Samoin deklaraatiota voi esiintyä useita, jolloin nämä erotetaan toisistaan puolipisteillä. Seuraava kuvaa yksinkertaista tyylisääntöä, jossa H1- ja P-elementeille ehdotetaan kaksi deklaraatiota:

Tyhjää tilaa voidaan käyttää vapaasti muotoilemaan tyylisääntöjä helpommin luettaviksi. Yleisenä tapana on kirjoittaa deklaraatio omalle rivilleen, esim. seuraavasti:
/* Ryhmitellyssä selektoreiden järjestys on vapaa. */
p,h1 {
font-family:serif;
margin-left:2em;
}
/* Yksinkertaisissa ja ristiriidattomissa tapauksissa
deklaraatioidenkaan järjestyksellä ei ole merkitystä. */
CSS-kommentit alkavat kauttaviiva-asteriksi yhdistelmällä ja päättyvät asteriksi-kauttaviiva yhdistelmään. Kommenttien syntaksi on siis sama kuin monessa ohjelmointikielessä, kuten JavaScriptissä.
Selektoreiden avulla siis yhdistetään deklaraatiot kohteisiinsa dokumentissa. Selektoreiden ominaisuudet useasti myös periytyvät jälkeläiselementeille, esim. P-elementin lapsena oleva B-elementti perii lähes kaikki sellaiset ominaisuudet emoltaan, jotka intuitiivisesti vaikuttaisivat periytyviltä, kuten kirjasintyylin ja värin.
Yksinkertaisempia CSS-selektoreita ovat tyyppiselektorit, joilla viitataan elementtityyppeihin
niiden nimellä. Esimerkiksi seuraavassa ensimmäinen sääntö ehdottaa
body-tyyppiselektorilla koko dokumentin rungolle kirjasinlajin:
body {
font-family:sans-serif;
}
h1,h2,h3,h4,h5,h6 {
font-family:serif;
}
body-selektorin font-family -ominaisuus periytyy BODY-elementin jälkeläisiin, mutta esimerkkimme toinen sääntö asettaa poikkeuksen kaikille yleisille otsikkoelementeille. Luonnollisesti otsikkoelementtien lapset perivät serif-fontin, jollei muuten määritetä. Vastaava periytyminen koskee muitakin ominaisuuksia.
Lähes kaikki elementit voidaan merkitä kuuluviksi luokkiin yleisellä CLASS-attribuutilla, esim. seuraavasti:
<p class="tarkea">On tärkeää huomioida, että...</p>
Elementti voi kuulua useaan luokkaan ja erilaiset elementit voivat kuulua samaan luokkaan. Luokitus siis helpottaa viittausta useaan elementtiin kerralla, mutta samalla vapauttaa viittaukset elementtisidonnaisuudesta.
Tyylisäännöissä luokkiin viitataan pisteellä:
p.tarkea {
border:3px double;
}
.tarkea {
color:red;
background-color:yellow;
}
Esimerkkimme ensimmäinen sääntö koskee P-elementtejä, jotka on merkitty kuuluvikasi tarkea-luokkaan. Toisessa säännössä elementtisidonnaisuutta ei ole, joten se koskee kaikkia elementtejä, jotka on merkitty kuuluvikasi tarkea-luokkaan.
Kaikki elementit voidaan merkitä yksilöllisellä tunnisteella, eli yleisellä ID-attribuutilla, esim. seuraavasti:
<p id="poikkeus">On tärkeää huomioida, että...</p>
ID-attribuutin arvo on dokumenttikohtaisesti uniikki, eli yksilöllinen tunniste ei saa esiintyä samassa dokumentissa kuin kerran.
Tyylisäännöissä tunnisteisiin viitataan ristikkomerkillä:
#poikkeus {
border:3px red double;
}
Näennäisluokilla ja näennäiselementeillä vaikutetaan sellaisiin tekijöihin, jotka eivät ole saavutettavissa dokumenttioliomalliin viittaamalla. Tässä käsitellään vain suppeasti käytetyimmät näennäisluokat, joilla vaikutetaan linkkien, eli A-elementtien tyyleihin. Seuraavat selektorit viittaavat linkkeihin niiden tilan mukaan:
a:link - selektori vaikuttaa vierailemattomaksi luokiteltuun linkkiina:visited - selektori vaikuttaa vierailluksi luokiteltuun linkkiina:hover - selektori vaikuttaa osoittimen alla olevaan linkkiina:active - selektori vaikuttaa aktiivissa tilassa olevaan linkkiin/* asetetaan kaikille ankkureille valkoinen
tausta ja linkeille värit tilan mukaan */
a {background:white;}
a:link {color:blue; }
a:visited {color:purple; }
a:hover {color:aqua; }
a:active {color:lime; }
Kaskadointijärjestyksellä tarkoitetaan ratkaisumallia, jonka mukaan määritellään painoarvo ristiriitaisille tyyliehdotuksille ja päätetään mikä sääntö jää voimaan. Esimerkkinä mainittakoon selektorin yksityiskohtaisuus; mitä yksityiskohtaisempi selektori, sitä enemmän säännöllä on painoarvoa. Yllä olevassa esimerkissämme säännöt ovat keskenään ristiriitaisia, sillä linkki voi olla samanaikaisesti esim., sekä visited-, että hover-tilassa, mutta kummatkin ovat yhtä spesifisiä. Asia ratkaistaan siten, että viimeiseksi ilmoitettu sääntö jää voimaan, joten esimerkkimme ilmoitusjärjestys on oleellinen.
Nämä olivat yleisimpiä ja yksinkertaisempia selektoreita. Kattava selektoreiden yhteenveto löytyy eri dokumentista.
Deklaraatiot koostuvat etukäteen määritetyistä ominaisuuksista ja näiden sallituista arvoista. CSS1-tason ominaisuudet arvoineen ja esimerkkien kera löytyvät omana suomenkielisenä kokonaisuutenaan. Edistyneempiäkin tyyliehdotuksia löytyy englanninkielisestä CSS 2.1 -spesifikaatiosta, mutta näiden asiakasohjelmatuki on toistaiseksi vielä kirjavaa.
Valitettavasti edistyneimpien tyylien puutteellinen selaintuki usein johtaa kovin epätoivottaviin tuloksiin, kuten sivun layoutin hajoamiseen tai sisällön tulostumattomuuteen. Yksinkertaisin ja kustannustehokkain tapa välttää tällaisia ongelmia on käyttää vain yleisesti tuettuja (käytännössä CSS1-) ominaisuuksia.
Tyyliehdotuksia voidaan yhdistää dokumenttiin muutamalla eri tavalla, joko tuomalla ne ulkopuolisesta CSS-tiedostosta, tai upottamalla ne suoraan dokumenttiin. Lähes poikkeuksetta on suositeltavampaa pitää CSS erillään merkkauskielestä. Seuraavaksi esitellään eri tyylien yhdistämiskeinot käännetyssä suositusjärjestyksessä.
CSS voidaan upottaa suoraan dokumenttiin käyttämällä elementtikohtaisesti yleistä STYLE-attribuuttia. Tällöin selektoria ei tarvita, koska attribuutin sijainti implisiittisesti määrittää selektorin. Deklaraatiolohko upotetaan suoraan attribuutin arvoksi ilman lohkon rajoja ilmaisevia aaltosulkuja:
<h1
style="font-family:sans-serif;font-style:italic">
Esimerkkiotsikko</h1>
Tämän menetelmän selvänä haittapuolena on dokumentin rakenteen ja sen ulkoasun yhdistyminen, joten CSS:n upotus STYLE-attribuutilla sopii ainoastaan poikkeustapauksiin.
Tällä menetelmällä CSS sijoitetaan STYLE-elementin sisällöksi:
<style type="text/css">
h1 {
font-family:sans-serif;
font-style:italic;
}
p {
font-family:serif;
font-style:normal;
}
</style>
Pakollinen TYPE-attribuutti ilmoittaa tyyliehdotusten sisältötyypin, joka on aina tuo sama CSS:n ollessa kyseessä.
STYLE-elementillä voidaan koota kaikki dokumentin tyyliehdotukset samaan paikkaan, mutta tämänkin menetelmän haittana on se, että merkkauskieli ja tyyliehdotukset yhdistyvät samaan dokumenttiin. Menetelmä siis sopii parhaiten vain sellaisiin tapauksiin, jossa dokumenttikohtaiset tyylit ovat ainutlaatuisia.
LINK-elementillä viitataan ulkopuoliseen CSS-tiedostoon:
<link
type="text/css"
rel="stylesheet"
charset="iso-8859-1"
href="tyylit.css" />
Yo. esimerkkiimme on merkitty neljä attribuuttia arvoineen:
CSS-tiedostomme on aivan tavallinen tekstitiedosto, joka sisältää pelkät tyyliehdotukset ja mahdolliset kommentit. Tiedostopäätteeksi on annettu .css, sekä yhteensopivuus-, että yhdenmukaisuussyistä.
LINK-elementti sopii käytettäväksi tilanteissa, joissa useammat dokumentit käyttävät samoja tyylejä. Kokonaisen sivuston tyylimääritykset voidaan siis sijoittaa jopa yhteen tiedostoon, jolloin sivuston ulkoasun hallinta helpottuu huomattavasti.
@import-säännöllä@import on avainsana jolla tuotetaan toisen tyylitiedoston sisältämät tyylisäännöt. Avainsana, jonka parametriksi tulee tuotettavan tyylitiedoston URL-osoite on esiinnyttävä tuottavassa tyyliehdotuksessa ennen muita mahdollisia tyylisääntöjä:
<style type="text/css">
@import "tyylit2.css";
/*mahdolliset upotetut tyylisäännöt vasta tähän*/
</style>
Tämä tuontimetodi vastaa pitkälti edellistä, mutta sillä on myös pari käytännöllistä lisäetua kun sitä käytetään esimerkkimme mukaisesti:
Lopuksi käsittelemme tyyleihin liittyvien ongelmien yleisiä ratkaisumalleja, jotka jaamme kolmeen tarkistuskategoriaan. Tarkistukset kannattaa tehdä esitetyssä järjestyksessä:
Ehkäpä yleisin syy tyylien toimimattomuuteen löytyy omasta koodistamme. Vika voi piiletä kahdella suunnalla, sekä tyylien että merkkauksen virheellisyydessä. Onneksemme kummankin muodollinen oikeellisuus voidaan tarkistaa ohjelmallisesti.
Merkintäkieleen liittyvät virheet voidaan sulkea pois validoimalla koodi. Validointi voidaan toteuttaa joko verkon kautta, esimerkiksi online-validointityökaluilla, tai omalle työasemalle asennettavalla validaattorilla. Tyylimäärityksiin pujahtaneet kirjoitus- tai ajatusvirheet voidaan taas eliminoida CSS-syntaksin tarkistuksella.
Mitä edistyneimpiä tyylejä käytämme, sitä todennäköisemmin törmäämme jonkinlaiseen asiakasohjelmatuen puutteeseen. Yksittäisestä asiakasohjelmasta voi puuttua jonkun ominaisuuden tuki kokonaan. Tuki voi olla myös puutteellista tai peräti virheellistä. Edelleen, tilanne voi olla sellainen ettei yksikään asiakasohjelma vielä tue jotain edistyneempää ominaisuutta.
Asiakasohjelmatuen tarkistuksen apuna voidaan käyttää Web-resursseja, joihin on koottu tietoa keskitetysti, kuten Web browser CSS support -sivua, jossa nimensä mukaisesti käsitellään yleisempien selainten CSS-tukea. Tässä yhteydessä tulee huomioida että tyylien toimimattomuus voi liittyä myös puutteelliseen merkintäkielitukeen, joten sekin kannattaa tarkistaa, esimerkiksi Web browser HTML support -sivulta, mikäli CSS-tuki löytyy.
Kolmas yleinen mutta edellisiä harvinaisempi ongelman lähde voi liittyä puutteelliseen käsitykseemme jostakin tyylisäännöstä tai sen soveltuvuudesta. Myös joihinkin ominaisuuksiin liittyviä yksityiskohtia on myöhemmissä suosituksissa muutettu tai korjattu. Kannattaa siis tarkistaa ajankohtaisesta CSS-spesifikaatiosta että olemme ymmärtäneet ongelmallisen säännön soveltuvuuden oikein, mikäli edelliset kohdat ovat kunnossa.
Ominaisuuksien piirteiden tarkastelemisen apuna voidaan käyttää CSS 2.1 -ominaisuuksien kehyskäyttöliittymää. Monimutkaisemmat selektorit taas voidaan kääntää selkokielisiksi selektoriselityksen avulla.