CSS-lisäesimerkit, XML ja CSS

Käydään läpi CSS:n perusteita HTML-, XHTML- ja XML-dokumentin avulla. Luentovideolla kerrataan kurssin CSS-asiat käytännön esimerkein.

Mitä videolla kerrataan

Nämä aiheet on käsitelty tarkemmin muilla luennoilla. Videolla ne kerrataan yhdessä esimerkkidokumenttien avulla.

AiheMissä käsitelty
display-ominaisuus Asemointiluennon luku 2
Täyte, marginaali ja raja CSS-luennon luku 9
Yhdistyvät marginaalit CSS-luennon luku 9.1
Valitsimet Valitsinluento
Perintä, kaskadi ja spesifisyys CSS-luennon luku 3

1. HTML, XHTML ja XML

HTML-määrittely ei ole tarkka esimerkiksi lopetustagien kanssa: selain korjaa puutteet omin päin. XHTML- ja XML-dokumentit sen sijaan ovat tarkkoja eivätkä toimi lainkaan, jos dokumentissa on pienikin virhe.

Palvelimen on tarjoiltava tiedosto oikealla tyypillä

XHTML-dokumentti käyttäytyy XML:nä vasta, kun palvelin tarjoilee sen tyypillä application/xhtml+xml. Jos tyyppi on text/html, selain jäsentää sen HTML:nä eikä tiukkuus näy mitenkään. Sama koskee XML-dokumenttia, jonka tyypin on oltava application/xml tai text/xml.

1.1 Mallidokumentit

Kaikilla mallidokumenteilla on sama tyylitiedosto malli.css, joka muotoilee sekä HTML- että XML-elementit. Sama tiedosto siis riittää molempiin, vaikka elementtien nimet ovat eri.

Mallidokumentit ja mitä kukin näyttää.
TiedostoMitä siitä näkee
malli.html Tavallinen HTML5-dokumentti. Vertailukohta muille
malli.xhtml Sama sisältö XHTML:nä. Näyttää samalta, kunhan palvelin tarjoilee sen oikealla tyypillä
malli-virhe.html Tahallinen virhe: strong-elementti suljetaan em-elementin lopetustagilla. Selain korjaa asian omin päin eikä valita mitään
malli-virhe.xhtml Täsmälleen sama virhe XHTML:nä. Sivua ei näytetä lainkaan, vaan selain kertoo jäsennysvirheestä ja rivinumerosta
malli.xml Aito XML-dokumentti omalla sanastollaan: dokumentti, otsikko, kappale ja korostus
malli2.xml Riisuttu XML-dokumentti, jossa on vain kolme elementtiä
Tee vertailu tässä järjestyksessä
  1. Avaa malli.html ja malli.xhtml. Ne näyttävät samalta.
  2. Avaa malli-virhe.html. Virhe ei näy muuten kuin siten, että korostus jatkuu kappaleen loppuun.
  3. Avaa malli-virhe.xhtml. Sama virhe pysäyttää koko dokumentin. Tämä on se ero, josta luvun alussa puhutaan.
  4. Avaa malli.xml ja katso sen lähdekoodi. Vertaa sitä tyylitiedoston XML-osaan.

2. Selaimen oletustyylit

Selaimeen on aina määritelty jokin oletusulkoasu HTML-dokumenteille. Juuri siksi otsikot ovat lihavoituja ja isompia, listoissa on merkit ja linkit ovat sinisiä ja alleviivattuja, vaikka et kirjoittaisi riviäkään CSS:ää.

Oletusulkoasu on nykyään määritelty standardissa

Vanhoissa ohjeissa sanotaan, ettei mikään standardi määrää oletusulkoasua. Se piti paikkansa HTML 4:n aikaan. Nykyisessä HTML Living Standardin Rendering-luvussa on kuvattu suositeltu oletustyylitiedosto CSS-sääntöinä, ja selaimet noudattavat sitä varsin tarkasti. Juuri siksi selainten oletusulkoasut ovat keskenään niin samankaltaisia.

Standardi ei silti velvoita mihinkään. Älä oleta, että jokin näyttää tietyltä pelkän oletustyylin varassa; määrittele se, mikä on sinulle tärkeää.

2.1 Oletusulkoasun nollaaminen

Oletusulkoasun voi nollata seuraavalla tyylillä. Kokeile sitä mallidokumenttiin ja katso, mitä tapahtuu.

* {
  padding: 0;
  margin: 0;
  border: 0;
  display: inline;
  font-size: 1em;
  font-weight: normal;
}
Tämä on tarkoituksella liioiteltu

Sääntö on esimerkki siitä, kuinka paljon selaimen oletustyyli tekee työtä puolestasi. Erityisesti display: inline on raju: se osuu jokaiseen elementtiin, myös head-, title-, style- ja script-elementteihin. Selaimen oma tyyli piilottaa ne määrityksellä display: none, mutta tekijän tyylit voittavat selaimen oletustyylit, joten piilotus kumoutuu ja tyylitiedoston sisältö tulostuu sivulle tekstinä.

Älä käytä tätä omilla sivuillasi. Nykykäytäntö on kevyt normalisointi, ei täysi nollaus. Käytännössä ainoa asia, joka universaalivalitsimella kannattaa tehdä, on * { box-sizing: border-box; }.

2.2 Ulkoasun palauttaminen nollauksen jälkeen

Nollauksen jälkeen ulkoasu on rakennettava itse. Alla on tiivis malli, joka palauttaa tavallisimmat elementit lähelle selaimen oletusulkoasua. Tämä ei ole täydellinen lista vaan riittää siihen, että esimerkkidokumentti näyttää taas normaalilta. Täydellisen listan löydät Rendering-luvusta.

/* 1. Piilotetaan uudelleen se, mikä ei kuulu näkyä. */
head, title, style, script { display: none; }

/* 2. Palautetaan lohkotason elementit. */
html, body, h1, h2, h3, p, ul, ol, div, pre, blockquote, figure,
header, nav, main, section, article, aside, footer {
  display: block;
}

li    { display: list-item; }
table { display: table; }
tr    { display: table-row; }
th, td { display: table-cell; }

/* 3. Perusasetukset. */
body {
  margin: 1em;
  font-family: sans-serif;
  line-height: 1.5;
}

/* 4. Otsikot: koko, lihavointi ja marginaalit. */
h1 { font-size: 2em;    font-weight: bold; margin: 0.67em 0; }
h2 { font-size: 1.5em;  font-weight: bold; margin: 0.83em 0; }
h3 { font-size: 1.17em; font-weight: bold; margin: 1em 0; }

/* 5. Kappaleet ja listat. */
p, ul, ol, pre, blockquote { margin: 1em 0; }
ul, ol { padding-left: 2.5em; }
ul { list-style-type: disc; }
ol { list-style-type: decimal; }

/* 6. Tekstitason elementit. */
strong, th { font-weight: bold; }
em         { font-style: italic; }
code, pre  { font-family: monospace; }
pre        { white-space: pre; }

/* 7. Linkit. */
a:link    { color: #0645ad; text-decoration: underline; }
a:visited { color: #663366; }

/* 8. Lomakekentät: border: 0 poisti niiden reunat kokonaan. */
input, textarea, select, button { border: 1px solid #767676; }
Mitä tästä kannattaa oppia

Kahdeksan kohtaa ei vieläkään riitä: pois jäivät muun muassa taulukoiden reunat, kuvat, lomake-elementtien sisäiset tyylit ja kymmenet harvinaisemmat elementit. Juuri tämä on syy siihen, ettei täyttä nollausta tehdä: joudut kirjoittamaan uudelleen sen, minkä selain tekee jo valmiiksi ja paremmin.

3. Perintä ja taustaväri

HTML-rakenteessa elementti perii äitielementiltään tiettyjä tyylimäärityksiä, kuten kirjasintyypin, kirjasimen koon ja tekstin värin. Perintä on käsitelty CSS-luennon luvussa 4.1.

Taustaväri ei periydy, vaikka siltä näyttää

Kun annat body-elementille taustavärin, se näyttää periytyvän kaikkialle. Näin ei kuitenkaan ole. Elementtien taustaväri on oletuksena transparent eli läpinäkyvä, jolloin äitielementin taustaväri näkyy läpi.

Ero huomaa heti, kun yrität ylikirjoittaa taustavärin arvolla inherit tai kun tutkit elementtiä kehittäjätyökaluilla: laskettu arvo on rgba(0, 0, 0, 0) eikä äitielementin väri.

Kaskadin kolme vaihetta on kuvattu CSS-luennon luvussa 3. Kaksi kohtaa on syytä muistaa tässäkin:

4. XML ja CSS

CSS ei ole pelkästään HTML:ää varten. Sillä voi muotoilla minkä tahansa XML-dokumentin, eikä selain tarvitse siihen mitään erityistä: riittää, että dokumentin alussa on prosessointiohje ja että jokaiselle elementille kerrotaan ainakin display-ominaisuus.

Alla on kuvitteellinen otuskirja, jossa on oma elementtijoukkonsa: otuskirja, otsikko, otus, nimi, laji, kuvaus ja havaintoja. Näitä elementtejä ei ole missään standardissa, mutta CSS ei siitä välitä.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="otukset.css"?>
<otuskirja>
  <otsikko>Jyväskylän seudun tuntemattomat otukset</otsikko>

  <otus vaarallisuus="suuri">
    <nimi>Validaattorin peikko</nimi>
    <laji>Trollus validator</laji>
    <kuvaus>Piileskelee rivillä 47.</kuvaus>
    <havaintoja>2311</havaintoja>
  </otus>
</otuskirja>
otuskirja { display: block; max-width: 42em; margin: 1em auto; }
otsikko   { display: block; font-size: 1.9em; font-weight: bold; }
otus      { display: block; border: 2px solid #7a3b12; padding: 0.8em; }
nimi      { display: block; font-weight: bold; }
laji      { display: block; font-style: italic; }

/* Pseudoelementit ja attribuuttivalitsimet toimivat XML:ssä
   täsmälleen samoin kuin HTML:ssä. */
havaintoja::before { content: "Havaintoja: "; }
havaintoja::after  { content: " kpl"; }

otus[vaarallisuus="suuri"] { border-color: #b3261e; }
otus::before { content: "Vaarallisuus: " attr(vaarallisuus); float: right; }
Kokeile itse

Avaa otukset.xml ja poista prosessointiohjeen rivi tai kirjoita tiedostonimi väärin. Selain näyttää silloin pelkän elementtipuun, mistä näkee konkreettisesti, ettei XML-dokumentilla ole oletusulkoasua.

Huomaa myös, että XML on kirjainkoosta riippuvainen: Nimi ja nimi ovat eri elementtejä, ja valitsimen on vastattava kirjoitusasua tarkalleen.

5. SVG ja CSS

SVG on XML-pohjainen kuvaformaatti, joten sekin on CSS:n muotoiltavissa. Kun SVG kirjoitetaan suoraan HTML-dokumenttiin, sen osat ovat osa dokumenttia ja niihin pääsee käsiksi tavallisilla valitsimilla.

<svg class="kuva" viewBox="0 0 200 120" xmlns="http://www.w3.org/2000/svg"
     role="img" aria-labelledby="svg-otsikko">
  <title id="svg-otsikko">Talo: seinä, katto, ovi ja ikkuna</title>
  <rect class="seina" x="40" y="50" width="120" height="60" />
  <polygon class="katto" points="30,50 100,10 170,50" />
  <rect class="ovi" x="85" y="80" width="30" height="30" />
  <circle class="ikkuna" cx="60" cy="70" r="10" />
</svg>

Värit ja viivat annetaan SVG:n omilla ominaisuuksilla, jotka kirjoitetaan tyylitiedostoon aivan kuten mitkä tahansa CSS-ominaisuudet:

Tavallisimmat SVG-ominaisuudet.
OminaisuusMerkitys
fillMuodon täyttöväri
strokeViivan väri
stroke-widthViivan paksuus
stroke-dasharrayKatkoviivan kuvio, esimerkiksi 4,2
opacityLäpinäkyvyys välillä 0–1
Sivun oma CSS yltää vain upotettuun SVG:hen

Yllä oleva toimii siksi, että SVG on kirjoitettu suoraan dokumenttiin, jolloin sen osat ovat osa samaa dokumenttia. Jos kuva liitetään img-elementillä tai taustakuvana, sivun tyylitiedosto ei ylety sen sisään lainkaan. Erillinen SVG-tiedosto muotoillaan silloin omalla tyylitiedostollaan, kuten seuraavassa luvussa.

5.1 Erillinen SVG-tiedosto

SVG on XML-dokumentti, joten erillinen .svg-tiedosto muotoillaan täsmälleen samalla tavalla kuin mikä tahansa XML-dokumentti: tiedoston alkuun lisätään sama xml-stylesheet-prosessointiohje, ja tyylit kirjoitetaan erilliseen CSS-tiedostoon.

talo.svg:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="talo.css"?>
<svg viewBox="0 0 200 120" xmlns="http://www.w3.org/2000/svg">
  <title>Talo</title>
  <rect class="seina" x="40" y="50" width="120" height="60" />
  <polygon class="katto" points="30,50 100,10 170,50" />
</svg>

talo.css:

.seina {
  fill: #ffe9a8;
  stroke: #23201c;
  stroke-width: 2;
}

.katto {
  fill: #b3261e;
}

Näin sama kuva voidaan esittää eri tyylein vaihtamalla pelkkä tyylitiedosto, aivan kuten HTML-sivullakin.

Mikä CSS vaikuttaa mihinkin SVG:hen.
Miten SVG on sivullaMikä CSS vaikuttaa
Kirjoitettu suoraan dokumenttiin Sivun oma tyylitiedosto. Kuvan osiin pääsee käsiksi tavallisilla valitsimilla
Avattu omana dokumenttinaan, tai liitetty object- tai iframe-elementillä SVG-tiedoston oma xml-stylesheet-prosessointiohje tai sen sisällä oleva style-elementti. Sivun tyylit eivät vaikuta
Liitetty img-elementillä tai taustakuvana Vain SVG:n sisällä oleva style-elementti. Selain estää tässä tapauksessa ulkoisten tiedostojen lataamisen turvallisuussyistä, joten erillinen CSS-tiedosto jää hakematta
Jos haluat, että tyylit toimivat kaikissa tapauksissa

Kirjoita tyylit style-elementtiin SVG-tiedoston sisään. Silloin ne kulkevat kuvan mukana riippumatta siitä, miten kuva sivulle liitetään.

<svg viewBox="0 0 200 120" xmlns="http://www.w3.org/2000/svg">
  <style>
    .seina { fill: #ffe9a8; stroke: #23201c; stroke-width: 2; }
    .katto { fill: #b3261e; }
  </style>
  <title>Talo</title>
  <rect class="seina" x="40" y="50" width="120" height="60" />
</svg>
Muista saavutettavuus

Upotettu SVG tarvitsee nimen aivan kuten kuvakin. Anna sille role="img" ja title-elementti, johon viitataan aria-labelledby-attribuutilla. Pelkkä alt-attribuutti ei toimi, koska svg ei ole img.

6. Lisätietoa

Käyttäjien kommentit

Kommentoi Lisää kommentti