HTML5-perusteet

ITKP1011 Web-julkaiseminen · korjattu ja laajennettu laitos

Luennolla käsitellään WWW-sivujen kirjoittamista eli opetellaan perusteet HTML5-dokumenttien tuottamisesta. WWW-sivun ulkoasun muotoilu käsitellään CSS-luennolla.

Oppimistavoitteet

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

Luentovideo pohjautuu vanhempaan luentomateriaaliin ja eroaa paikoin tämän sivun sisällöstä.

1. Dokumenttityypeistä

Kaavio: Word tallentaa tekstin, muotoilut ja kuvat yhteen binääritiedostoon, jota vain Word osaa avata Kaavio: HTML-editori tallentaa pelkkää tekstiä, ja kuvat ovat erillisiä tiedostoja, joihin dokumentti viittaa
Tekstinkäsittelyohjelman tiedostomuoto ja HTML-dokumentti eroavat perustavasti toisistaan.
Merkistö ja rivinvaihdot Visual Studio Codessa

Ikkunan oikeassa alareunassa lukee tiedoston merkistö (UTF-8) ja rivinvaihtotapa (LF tai CRLF). Molempia voi vaihtaa napsauttamalla. Aseta ne UTF-8 ja LF. Väärä merkistö näkyy selaimessa ääkkösten tilalla olevina kysymysmerkkeinä tai merkkeinä kuten ä. Rivinvaihdoista kerrotaan lisää komentoriviluennolla.

1.1 Kuka määrittää, miten sivuja tehdään?

W3C (World Wide Web Consortium)
Tuottaa spesifikaatioita, ohjeita ja työkaluja WWW-tekniikoille. W3C vastaa nykyään muun muassa CSS:stä ja saavutettavuusohjeista (WCAG) sekä ylläpitää validaattoripalvelua.
WHATWG (Web Hypertext Application Technology Working Group)
Selainvalmistajien muodostama ryhmä, joka ylläpitää HTML-määrittelyä. Vuodesta 2019 alkaen HTML-standardi on WHATWG:n Living Standard, ja W3C:n vanhat HTML5-suositukset on poistettu käytöstä.

1.2 Standardeista lyhyesti

HTML (HyperText Markup Language)
WWW:ssä käytettävien hypertekstidokumenttien rakenteen määrittelyyn tehty merkintäkieli. HTML:llä ei ole enää versionumeroita: määrittely elää jatkuvasti. Nimitystä HTML5 käytetään yhä puhekielessä tarkoittamassa nykyistä HTML:ää erotuksena vanhasta HTML 4:stä ja XHTML 1:stä.
XML (Extensible Markup Language)
Merkintäkieli, joka määrittelee, miten kirjoitetaan dokumentteja, jotka ovat sekä ihmisen että koneen luettavissa. XML on tiukka: jokainen elementti on suljettava ja elementit eivät saa mennä ristiin.
XHTML (Extensible HyperText Markup Language)
XML:n sääntöjen mukaan kirjoitettu HTML. Nykyään ei kirjoiteta erillistä XHTML-dokumenttityyppiä, vaan tavallista HTML5:tä XML:n sääntöjä noudattaen. Tätä kutsutaan polyglot-dokumentiksi: sama tiedosto kelpaa sekä HTML:nä että XML:nä. Tällä kurssilla kirjoitetaan näin.
CSS (Cascading Style Sheets)
Kieli, jolla määritellään dokumentin ulkoasu. CSS:llä muotoillaan HTML-, XML- ja SVG-dokumentteja.

2. WWW-sivujen tekeminen

WWW-sivujen tekemisessä voidaan erottaa samat vaiheet kuin tekstinkäsittelydokumentin tekemisessä:

  1. sisällön tuottaminen,
  2. rakenteen merkitseminen,
  3. ulkoasun määrittäminen.

2.1 Editorit

WWW-sivuja voi tuottaa niihin erikoistuneilla ohjelmilla, jotka näyttävät suoraan miltä sivu näyttää selaimessa. Sivuja voi tuottaa myös kirjoittamalla HTML-merkintää suoraan tekstieditorilla, ja niin teemme tällä kurssilla. HTML:n kirjoittaminen ei ole ohjelmointia.

HTML ei kiinnitä millään tavalla dokumentin ulkoasua vaan ainoastaan dokumentin rakenteen.

Kurssin editorisuositus on Visual Studio Code, joka soveltuu erityisen hyvin HTML- ja CSS-tiedostojen muokkaamiseen. Se on ilmainen ja toimii Windowsissa, macOS:ssä ja Linuxissa.

Kaksi hyödyllistä asetusta VS Codessa

Graafisia WYSIWYG-editoreita (What You See Is What You Get) kannattaa välttää, jos ei ymmärrä rakenteen ja ulkoasun eroa. WWW-sivujen yhteydessä WYSIWYG on muutenkin harhaanjohtava käsite: et voi tietää, miltä sivusi näyttää missäkin ympäristössä. Sama sivu näytetään puhelimessa, isolla näytöllä ja ruudunlukijassa eri tavoin, ja juuri se on tarkoituskin.

2.2 Rakenteen merkitseminen

HTML-dokumentti on tekstiä, johon merkitään dokumentin rakenne elementeillä. Elementti merkitään tageilla, jotka kirjoitetaan kulmasulkeiden väliin.

<title>Web-julkaiseminen</title>

Elementtien välillä ja tekstin keskellä saa olla vapaasti välilyöntejä ja rivinvaihtoja. Selain tiivistää peräkkäiset välimerkit yhdeksi välilyönniksi, joten tekstin asettelua ei voi tehdä välilyönneillä eikä tyhjillä riveillä.

Opettelun tueksi on koottu dokumentti tavallisimmista HTML-elementeistä.

2.3 Void-elementit eli tyhjät elementit

Useimmilla elementeillä on aloitus- ja lopetustagi. Osalla elementeistä ei koskaan ole sisältöä, eikä niillä siksi ole lopetustagia lainkaan. Näitä kutsutaan void-elementeiksi. XML-yhteensopivassa dokumentissa ne suljetaan lisäämällä loppuun välilyönti ja kauttaviiva.

<br />
<img src="kissa.jpg" alt="Musta kissa nukkuu sohvalla" />
<meta charset="utf-8" />
Kauttaviivaa saa käyttää vain näissä

Void-elementtejä on kiinteä, lyhyt joukko. Käytännössä tarvitset näitä:

ElementtiTarkoitus
brPakotettu rivinvaihto
hrAiheen vaihtuminen
imgKuva
linkViittaus esimerkiksi tyylitiedostoon
metaMetatieto
inputLomakkeen syöttökenttä
source, track, col, area, base, embed, wbrHarvinaisempia

Kaikki muut elementit suljetaan lopetustagilla. Merkintä <div /> tai <p /> ei sulje mitään: selain ohittaa kauttaviivan äänettömästi ja jättää elementin auki, jolloin loppu sivusta päätyy sen sisälle. Virhe on hankala löytää, koska mitään virheilmoitusta ei tule.

2.4 Ominaisuudet eli attribuutit

Elementeillä voi olla attribuutteja, jotka määrittelevät jotakin elementtiin liittyvää. Esimerkiksi hyperlinkin kohde määritellään a-elementin href-attribuutilla:

<a href="https://www.jyu.fi/">Jyväskylän yliopisto</a>

Attribuutit kirjoitetaan aloitustagin sisään välilyönneillä eroteltuina. Ensin tulee attribuutin nimi, sitten yhtäläisyysmerkki ja sitten arvo lainausmerkkien sisässä.

<img src="kaavio.png" alt="Myyntikäyrä nousee tasaisesti" width="640" height="480" />

Attribuuttien nimet kirjoitetaan pienillä kirjaimilla, ja arvo on aina lainausmerkeissä. HTML sallii lainausmerkkien pois jättämisen, mutta XML ei, joten tällä kurssilla ne kirjoitetaan aina.

2.5 Dokumentin on oltava hyvin muodostettu

Tuotetun dokumentin pitää olla hyvin muodostettu (engl. well-formed), jottei selainten tarvitse arvailla. Elementit eivät saa mennä keskenään ristiin eikä lopetustageja saa unohtaa.

Väärin:

<p>Tuotetun <strong>dokumentin pitää olla
   hyvin muodostettu
   (<em>engl. well-formed</em>).</p></strong>

Oikein:

<p>Tuotetun <strong>dokumentin pitää olla
   hyvin muodostettu
   (<em>engl. well-formed</em>)</strong>.</p>

HTML-standardi katsoo paikoin läpi sormien puuttuvia lopetustageja, mutta silloin dokumentti ei enää ole XML-yhteensopiva. Tällä kurssilla kirjoitamme vain XML-yhteensopivia dokumentteja.

2.6 Dokumentin pitää olla validi

Dokumentin pitää olla myös validi (engl. valid) eli sen rakenteen pitää noudattaa dokumenttityypin sääntöjä. Dokumenttityyppi määrää, mitä elementtejä saa käyttää, mitkä elementit saavat sijaita minkäkin sisällä ja mitä attribuutteja kullekin elementille kuuluu.

Validointiin käytetään W3C:n validaattoria. Se ottaa vastaan sekä osoitteen, tiedoston että suoraan liitetyn tekstin, joten dokumentin voi tarkistaa jo ennen julkaisemista.

Selain ei ole validaattori

Pelkkään selaimella testaamiseen ei voi luottaa, koska selaimet yrittävät hiljaisuudessa korjata virheet. Virheellinen dokumentti saattaa siksi näyttää oikealta omalla koneellasi ja hajota jonkun toisen selaimessa. Validaattori kertoo virheistä suoraan ja mainitsee rivinumeron.

3. HTML5-dokumentin runko

Jokainen kurssilla tehtävä sivu alkaa tästä rungosta. Kopioi se pohjaksi.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="fi" xml:lang="fi">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Sivun otsikko</title>
    <link rel="stylesheet" href="tyyli.css" />
  </head>
  <body>
    <h1>Otsikko</h1>
    <p>...Sivun sisältöä tänne...</p>
  </body>
</html>
Rungon osat.
RiviMerkitys
<!DOCTYPE html> Dokumenttityypin esittely. Se ei ole elementti eikä sitä suljeta. HTML5:ssä esittely on tämän mittainen, ja se on pakollinen: ilman sitä selain siirtyy yhteensopivuustilaan, jossa CSS toimii eri tavalla
xmlns XML-nimiavaruus. Tarvitaan, jotta dokumentti kelpaa myös XML:nä
lang ja xml:lang Sivun kieli. Kerro molemmat samalla arvolla, kun kirjoitat XML-yhteensopivasti. Ruudunlukija valitsee kielen perusteella oikean ääntämyksen, ja hakukoneet käyttävät sitä
head Sisältää kaiken dokumenttiin liittyvän metatiedon. Mikään sen sisältö ei näy sivulla sellaisenaan
meta charset Kertoo dokumentin merkistön. Käytä aina UTF-8:aa, ja pidä tämä rivi head-osan alussa
meta viewport Kertoo, että sivu mukautuu näytön leveyteen. Ilman tätä puhelin näyttää sivun pienoiskoossa
title Dokumenttia kuvaava otsikko, joka näkyy selaimen välilehdellä ja hakutuloksissa. Otsikon pitää olla järkevä myös irrallaan sivusta
link Liittää tyylitiedoston. Attribuutti type="text/css" on tarpeeton
body Sisältää kaiken varsinaisen sivulla näkyvän sisällön
h1 Korkeimman tason otsikko, joka kertoo koko dokumentin pääotsikon
p Merkitsee tekstikappaleen

4. Erikoismerkkien koodaus

Osa merkeistä on HTML:lle erikoismerkkejä, eikä niitä voi kirjoittaa tekstiin sellaisenaan. Ne korvataan entiteeteillä. Entiteetti alkaa &-merkillä ja päättyy puolipisteeseen.

Entiteetit, joita tarvitset.
MerkkiEntiteettiMilloin pakollinen
&&amp;Aina tekstissä ja attribuuttien arvoissa
<&lt;Aina tekstissä
>&gt;Ei aina pakollinen, mutta kirjoita silti aina
"&quot;Lainausmerkkien sisällä olevassa attribuutin arvossa

Käytännön sääntö on yksinkertainen: kirjoita nämä neljä merkkiä aina entiteetteinä, niin et joudu miettimään, milloin se on pakollista.

Ääkkösiä ei tarvitse koodata &auml;- ja &ouml;-entiteeteillä, kun käytössä on UTF-8. Kirjoita siis Hämähäkki etkä H&auml;m&auml;h&auml;kki. Muut merkit löytyvät entiteettitaulukoista.

4.1 Osoitteissa olevat erikoismerkit

Osoitteissa eli URLeissa olevat erikoismerkit koodataan eri tavalla kuin tekstissä: prosenttimerkillä ja merkin tavujen heksadesimaaliarvolla. Nykyinen standardi edellyttää, että merkit koodataan UTF-8-tavuina, jolloin yksi ääkkönen vie kaksi prosenttiryhmää.

Erikoismerkkien koodaaminen URLeissa UTF-8-merkistöllä.
Merkki Koodi Miksi merkki koodataan
Välilyönti%20Välilyönti päättäisi osoitteen
ä%C3%A4Osoitteessa saa olla vain ASCII-merkkejä. Ääkkönen vie UTF-8:ssa kaksi tavua, siis kaksi prosenttiryhmää
ö%C3%B6
å%C3%A5
Ä%C3%84
Ö%C3%96
Å%C3%85
?%3FAloittaa osoitteen kyselyosan
&%26Erottaa kyselyosan parametrit toisistaan
=%3DErottaa parametrin nimen ja arvon
+%2BTarkoittaa kyselyosassa välilyöntiä
#%23Aloittaa dokumentin sisäisen kohdan
%%25Aloittaa itse koodauksen
/%2FErottaa kansiot. Koodataan vain, jos merkki on osa tiedoston nimeä

Älä koodaa osoitteen rakenteeseen kuuluvia /-merkkejä äläkä osoitteen alkuosaa https://jotain.example/. Kauttaviivan koodaus %2F tarvitaan vain siinä harvinaisessa tapauksessa, että tiedoston nimessä on kauttaviiva.

Paras ratkaisu on välttää koko ongelma

Nimeä omat tiedostosi ja kansiosi vain merkeillä a–z, 0–9, väliviiva ja alaviiva. Silloin koodausta ei tarvita lainkaan, osoitteet pysyvät luettavina ja linkittäminen on helppoa. Ääkkösiä tai välilyöntejä sisältävä nimi näyttää osoiterivillä tältä:

https://users.jyu.fi/~omatunnus/kuvat/kes%C3%A4loma%202026.jpg
Vanhat osoitteet, joissa lukee %E4

Netissä näkee myös koodauksia kuten %E4 (ä) ja %F6 (ö). Ne ovat Latin-1-merkistön (ISO-8859-1) mukaisia ja peräisin ajalta ennen UTF-8:n yleistymistä. Jos törmäät sellaiseen vanhalla sivulla, osoite toimii vain siksi, että myös palvelimen tiedostonimi on tallennettu samalla vanhalla merkistöllä. Älä käytä näitä koodauksia omissa sivuissasi: UTF-8-palvelimella %E4 johtaa virheeseen 404.

Vertailu: UTF-8 ja Latin-1

Alla oleva taulukko on tarkoitettu vanhojen osoitteiden tulkitsemiseen, ei uusien kirjoittamiseen. Omissa sivuissasi käytät aina UTF-8-saraketta.

Sama merkki koodattuna kahdella eri merkistöllä.
Merkki UTF-8 (käytä tätä) Latin-1 (vanha, vain tulkintaan)
ä%C3%A4%E4
ö%C3%B6%F6
å%C3%A5%E5
Ä%C3%84%C4
Ö%C3%96%D6
Å%C3%85%C5
é%C3%A9%E9
ü%C3%BC%FC
Välilyönti%20%20
&%26%26

Taulukon kaksi viimeistä riviä kertovat säännön: merkistöllä on väliä vain ASCII-alueen ulkopuolisissa merkeissä. Kirjaimet a–z, numerot ja välimerkit koodataan molemmissa täsmälleen samoin, joten ero näkyy vain ääkkösissä ja muissa erikoiskirjaimissa.

Näin tunnistat kumpi on kyseessä

Koodauksen voi tarkistaa valmiilla palvelulla, johon kirjoitetaan tiedostonimi sellaisenaan. Toinen tapa on liittää valmis osoite selaimen osoiteriville ja katsoa, mihin se johtaa.

Esimerkki

Kuvatiedoston nimi on hämähäkki.jpg. Osoitteessa ä-kirjaimet koodataan näin:

<p>
  <img src="h%C3%A4m%C3%A4h%C3%A4kki.jpg"
       alt="Hämähäkki lämmittelee auringossa rinkan päällä" />
</p>

Huomaa, että koodaus koskee vain src-attribuutin osoitetta. alt-teksti on tavallista tekstiä, joten siihen kirjoitetaan ääkköset normaalisti.

4.2 Linkkejä erikoismerkeistä

5. Dokumentin perusrakenne

Dokumentin rakenne muodostuu otsikoista ja niiden alle kuuluvasta sisällöstä. Perusrakenteesta kannattaa huomata seuraavat asiat:

Kaavio dokumentin otsikkohierarkiasta: yksi ensimmäisen tason otsikko, sen alla useita toisen tason otsikoita ja niiden alla kolmannen tason otsikoita
Hyvässä rakenteessa otsikkotasot muodostavat puun.

Dokumentin rakennetta voi tutkia selaimen kehittäjätyökaluilla: F12 avaa työkalut ja Ctrl+Shift+C käynnistää elementtivalitsimen. Työkalujen käyttöä käsitellään tarkemmin luvussa 19, jossa on myös ohje otsikkorakenteen tarkistamiseen. Jos otsikoissa on aukkoja tai sivulla on useita ensimmäisen tason otsikoita, rakenne on rikki, vaikka sivu näyttäisi silmällä hyvältä.

6. Elementtien luokittelu

Vanhastaan elementit jaettiin lohkotason (block) ja tekstitason (inline) elementteihin. Nykyinen HTML-määrittely puhuu sen sijaan sisältökategorioista, joista tärkeimmät ovat:

Kaksi tärkeintä sisältökategoriaa.
KategoriaMitä sisältääEsimerkkejä
Flow content
(vanha nimitys: lohkotaso)
Kaikki, mitä voi sijoittaa suoraan body-elementin sisään h1–h6, p, ul, ol, table, div, section
Phrasing content
(vanha nimitys: tekstitaso)
Tekstiä ja tekstin sisällä olevaa merkintää a, strong, em, code, img, span

Käytännön sääntö säilyy samana: teksti ei saa olla suoraan body-elementin sisällä, vaan se merkitään esimerkiksi kappaleeksi. Tekstitason elementit taas sijoitetaan aina jonkin lohkon sisään.

HTML-elementtien sisäkkäisyys Uloimpana on html-elementti. Sen sisällä ovat head ja body. Head-elementin sisällä ovat title, meta, link ja style. Body-elementin sisällä on flow content eli lohkotason sisältöä, kuten otsikot, kappaleet, listat, taulukot ja rakenne-elementit. Lohkotason elementtien sisällä on phrasing content eli tekstitason sisältöä, kuten linkit, korostukset ja kuvat. Sisimpänä on varsinainen teksti. Teksti ei saa olla suoraan body-elementin sisällä. html koko dokumentti head metatieto, ei näy sivulla title meta link style base body kaikki sivulla näkyvä flow content lohkotason sisältö h1 h2 h3 p ul ol dl table figure blockquote pre section article header nav main aside footer div phrasing content tekstitason sisältö a strong em code kbd abbr cite time img br span Varsinainen teksti sisimpänä
Elementit ovat sisäkkäin kuin maatuskanuket. Uloimpana on html, sisimpänä varsinainen teksti. Kaaviosta puuttuu paljon elementtejä, eikä se ilmaise kaikkia riippuvuuksia, mutta se kertoo pääsäännön: mitä ulompana elementti on, sitä suurempaa kokonaisuutta se merkitsee.

Kaaviosta kannattaa lukea kolme asiaa:

7. Sivun rakenne-elementit

HTML5 toi mukanaan joukon elementtejä, joilla sivun osat merkitään nimeltä. Ne eivät muuta ulkoasua mitenkään, mutta ne kertovat selaimelle, ruudunlukijalle ja hakukoneelle, mikä osa sivusta on mikäkin.

Sivun jäsentämiseen käytettävät elementit.
ElementtiKäyttötarkoitus
headerSivun tai osion yläosa: otsikko, logo, tunnistetiedot
navNavigointilinkkien joukko
mainSivun varsinainen sisältö. Vain yksi sivua kohti, eikä sen sisällä toistuvia osia kuten navigaatiota
articleItsenäinen kokonaisuus, joka olisi ymmärrettävä myös irrallaan: uutinen, blogimerkintä, kommentti
sectionSisällön temaattinen osio, jolla on oma otsikko
asideSivuun liittyvä mutta sen kulusta erillinen sisältö: sivupalkki, tietolaatikko
footerSivun tai osion alaosa: tekijätiedot, päiväys, yhteystiedot
figure ja figcaptionKuva, kaavio, koodilistaus tai taulukko sekä siihen kuuluva kuvateksti
addressYhteystiedot, jotka koskevat lähintä article- tai body-elementtiä
divYleinen lohko ilman merkitystä. Käytä vasta, kun mikään yllä olevista ei sovi
spanYleinen tekstitason elementti ilman merkitystä. Sama sääntö kuin div-elementillä
Sivun rakenne-elementtien asettelu Body-elementin sisällä ylimpänä on header, jossa on sivuston nimi ja logo. Sen alla on nav eli navigointilinkit. Keskellä on main, joka sisältää sivun varsinaisen sisällön: sivun h1-pääotsikon, kappaleen sekä section- ja article-elementit. Mainin oikealla puolella on aside eli sivuun liittyvä lisätieto. Alimpana on footer, jonka sisällä on address. Main-elementtejä on sivulla vain yksi. body header sivuston nimi ja logo, sama joka sivulla p img nav navigointilinkit ul li a main tämän sivun sisältö h1 p section temaattinen osio h2 p figure article itsenäinen kokonaisuus h2 p aside Sivuun liittyvä mutta sen kulusta erillinen sisältö. h2 p footer tekijätiedot, päiväys p address
Tyypillisen sivun jäsennys. Elementit eivät muuta ulkoasua: tämä asettelu syntyy vasta CSS:llä. Kaavio kertoo, mitkä osat sivusta ovat merkitykseltään mitäkin.

Samat elementit koodina:

<body>
  <header>
    <p>Matin kotisivu</p>
  </header>

  <nav>
    <ul>
      <li><a href="./">Etusivu</a></li>
      <li><a href="harrastukset.html">Harrastukset</a></li>
    </ul>
  </nav>

  <main>
    <h1>Tervetuloa</h1>
    <p>Tällä sivulla kerron itsestäni.</p>

    <section>
      <h2>Opinnot</h2>
      <p>Opiskelen tietojärjestelmätiedettä.</p>
    </section>
  </main>

  <footer>
    <p>Päivitetty <time datetime="2026-09-04">4.9.2026</time></p>
    <address><a href="mailto:matti@example.com">matti@example.com</a></address>
  </footer>
</body>
Mihin h1 kuuluu?

Sekä header että main saavat sisältää otsikoita, joten kumpikaan ei ole virhe. Monisivuisella sivustolla h1 kannattaa silti sijoittaa main-elementin sisään. Perustelu on yksinkertainen:

Sivuston nimi merkitään header-elementissä tavallisena kappaleena tai linkkinä etusivulle. Yhden sivun mittaisessa dokumentissa, jossa sivun otsikko ja sivuston nimi ovat sama asia, h1 voi olla myös header-elementissä.

Katso valmis esimerkkisivu rakenne-elementeistä.

Milloin div?

div-elementti ei tarkoita mitään. Se on oikea valinta silloin, kun tarvitset lohkon pelkästään ulkoasun takia eikä sisällölle löydy merkityksellistä elementtiä. Jos kysyt itseltäsi ”mikä osa sivua tämä on” ja saat vastauksen, käytä sitä elementtiä sen sijaan.

8. Otsikkoelementit h1–h6

Otsikkoja on kuusi tasoa: h1 on ylin ja h6 alin. Käytännössä kolme tasoa riittää lähes aina.

<h1>Ensimmäisen tason otsikko</h1>
<p>Tämä on tekstikappale.</p>

<h2>Toisen tason otsikko</h2>
<p>Tämä on tekstikappale.</p>

<h3>Kolmannen tason otsikko</h3>
<p>Tämä on tekstikappale.</p>

Katso otsikkotasojen esimerkkisivu, jossa näet miltä tasot näyttävät selaimen oletustyylillä.

9. Tekstikappale p

Kappale merkitään p-elementillä. Jokainen kappale merkitään omakseen; tyhjillä riveillä tai br-elementeillä ei tehdä kappaleita.

<p>Ensimmäinen kappale.</p>
<p>Toinen kappale.</p>

10. Erilaiset listat

Listoja on kolmea lajia. Listojen sisään voi sijoittaa sekä tekstitason että lohkotason elementtejä.

10.1 Järjestämätön lista ul

Käytä, kun alkioiden järjestyksellä ei ole merkitystä.

<ul>
  <li>Ensimmäinen alkio</li>
  <li>Toinen alkio</li>
</ul>

10.2 Järjestetty lista ol

Käytä, kun järjestys on osa sisältöä, esimerkiksi työvaiheissa. Numerot tulevat automaattisesti; älä kirjoita niitä itse tekstiin.

<ol>
  <li>Kirjoita sisältö</li>
  <li>Merkitse rakenne</li>
  <li>Validoi</li>
</ol>

Molemmat listatyypit näkyvät esimerkkisivulla.

10.3 Määritelmälista dl

Määritelmälista on nimi–arvo-pareja varten: sanasto, yhteystiedot, ominaisuusluettelo. Elementtejä on kolme:

<dl>
  <dt>HTML</dt>
  <dd>HyperText Markup Language, dokumentin rakenteen merkintäkieli.</dd>

  <dt>CSS</dt>
  <dd>Cascading Style Sheets, dokumentin ulkoasun määrittelykieli.</dd>
</dl>

Samalla termillä voi olla useita selityksiä ja samalla selityksellä useita termejä: peräkkäiset dt- ja dd-elementit kuuluvat yhteen.

10.4 Sisäkkäiset listat

Vain li saa olla listan lapsena

Listaelementin (ul tai ol) välittömänä lapsena saa olla vain li-elementtejä. Alilista sijoitetaan siis li-elementin sisään, ei sen viereen.

Ei koskaan näin:

<ul>
  <ul>
  </ul>
</ul>

Vaan näin:

<ul>
  <li>li on ainoa elementti, joka voi olla ul-elementin lapsi
    <ul>
      <li>Alilistan alkio</li>
      <li>Alilistan toinen alkio</li>
    </ul>
  </li>
</ul>

Huomaa, että ulomman alkion lopetustagi </li> tulee vasta alilistan jälkeen. Koodin sisennyksillä ei ole vaikutusta listan muodostumiseen, mutta ne tekevät rakenteen näkyväksi ja paljastavat virheet.

11. Taulukot

Taulukon elementit.
ElementtiTarkoitus
tableMuodostaa taulukon
captionTaulukon otsikko. Tulee heti table-elementin jälkeen
thead, tbodyErottavat otsikkorivit varsinaisesta datasta
trAloittaa uuden rivin
thRivi- tai sarakeotsikko
tdTaulukon solu
<table>
  <caption>Kurssin arvosanajakauma</caption>
  <thead>
    <tr>
      <th scope="col">Arvosana</th>
      <th scope="col">Opiskelijoita</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">5</th>
      <td>12</td>
    </tr>
    <tr>
      <th scope="row">4</th>
      <td>28</td>
    </tr>
  </tbody>
</table>
scope on pakollinen otsikkosoluissa

Attribuutti scope="col" tai scope="row" kertoo, koskeeko otsikko saraketta vai riviä. Ilman sitä ruudunlukija ei osaa yhdistää solua oikeaan otsikkoon, ja taulukosta tulee käyttökelvoton. Silmillä lukevalle ero ei näy mitenkään, joten sen unohtaa helposti.

Solu voidaan laajentaa usean sarakkeen tai rivin yli attribuuteilla colspan ja rowspan. Arvo kertoo, montako saraketta tai riviä solu kattaa. Laajennettujen solujen tieltä jäävät solut jätetään pois.

<tr>
  <td colspan="3">Tämä solu levittyy kolmen sarakkeen alueelle</td>
</tr>

Taulukoita rakennettaessa kannattaa huomata:

Kokonainen taulukkoesimerkki on omalla sivullaan.

12. Kuvat

Kuva lisätään img-elementillä.

img-elementin attribuutit.
AttribuuttiMerkitys
srcKuvan osoite. Pakollinen
altKuvan korvaava teksti. Pakollinen
width ja heightKuvan mitat pikseleinä. Kerro ne, niin sivu ei hyppää latautuessaan
loading="lazy"Lataa kuvan vasta kun siihen vieritetään. Sopii sivun alaosan kuviin
titleVihjeteksti. Älä laita tähän olennaista tietoa: se ei näy kosketuslaitteilla eikä näppäimistökäytössä

img on void-elementti, ja se pitää sijoittaa jonkin lohkotason elementin sisään.

<p>
  <img src="appro2_p.png" alt="Appro-logo" width="200" height="60" />
</p>

12.1 Kunnollinen alt-teksti

alt-attribuutin sisältö korvaa kuvan, jos kuvaa ei voida esittää. Sen tarkoitus on välittää sama tieto kuin kuva, ei kuvailla kuvaa sinänsä.

Miten alt-teksti valitaan.
Kuvan roolialt-teksti
Kuva välittää tietoaKerro se tieto: alt="Myynti kasvoi 12 % vuonna 2025"
Kuva on kaavio tai taulukkoKuvaile sisältö, tai kirjoita se auki tekstinä kuvan viereen
Kuva toimii linkkinäKerro, minne linkki vie: alt="Etusivulle"
Kuva on pelkkä koristeTyhjä: alt=""
Koristekuvan alt on tyhjä, ei välilyönti

Kirjoita alt="" ilman mitään sisältöä. Silloin ruudunlukija ohittaa kuvan kokonaan, mikä on juuri se mitä koristekuvalta halutaan. Vanhoissa ohjeissa neuvotaan kirjoittamaan välilyönti alt=" "; se tulkitaan eri ohjelmissa eri tavoin ja osa lukee sen ääneen. Attribuuttia ei myöskään saa jättää kokonaan pois, koska silloin ruudunlukija lukee tiedostonimen.

Suuri hämähäkki istuu rinkan kankaalla auringonpaisteessa
Kuvateksti kertoo lukijalle kuvan taustan. alt-teksti taas korvaa kuvan sille, joka ei sitä näe. Ne ovat eri asioita, eikä samaa tekstiä kannata toistaa molemmissa.
<figure>
  <img src="hamahakki.jpg"
       alt="Suuri hämähäkki istuu rinkan kankaalla auringonpaisteessa" />
  <figcaption>Retkellä Jotunheimenissa 2002.</figcaption>
</figure>

12.2 Kuvien osoitteet

Useimmiten kuvat sijaitsevat samalla palvelimella ja samassa kansiossa kuin html-dokumentti. Silloin on järkevintä käyttää suhteellista osoitetta:

<img src="appro2_p.png" alt="Appro-logo" />
<img src="kuvat/logo.png" alt="Appro-logo" />

Kuva voi periaatteessa sijaita millä tahansa palvelimella, jos osoitteeksi kirjoitetaan kokonainen URL:

<img src="https://appro.mit.jyu.fi/images/appro2_p.png" alt="Appro-logo" />
Kolme syytä olla linkittämättä toisen palvelimen kuvia

13. Pakotettu rivinvaihto br

br katkaisee rivin siellä, missä rivinvaihto kuuluu sisältöön: runossa, osoitteessa tai vastaavassa. br-elementillä ei saa tehdä tyhjää tilaa, eikä kahta br-elementtiä kirjoiteta peräkkäin. Väliä säädetään CSS:llä.

<address>
  yliopistonopettaja Tommi Lahtonen<br />
  Sähköposti: <a href="mailto:tommi.j.lahtonen@jyu.fi">tommi.j.lahtonen@jyu.fi</a><br />
  Kotisivu: <a href="https://hazor.iki.fi/">https://hazor.iki.fi/</a><br />
  Työhuone: AgC431.2
</address>

Kappaleiden erottamiseen käytetään p-elementtiä, ei br-elementtejä.

14. Hyperlinkit a

a-elementillä toteutetaan hyperlinkki joko toiseen dokumenttiin, saman dokumentin toiseen kohtaan tai mihin tahansa verkossa sijaitsevaan objektiin. Linkkinä voi toimia teksti tai kuva. a-elementti sijoitetaan jonkin lohkotason elementin sisälle.

<a href="https://www.jyu.fi/">Jyväskylän yliopisto</a>
<a href="gradu.pdf">Lue gradu (PDF)</a>
<a href="./"><img src="logo.png" alt="Etusivulle" /></a>
Linkkitekstin pitää kertoa, minne se vie

Ruudunlukijan käyttäjä voi selata sivun linkit listana ilman ympäröivää tekstiä. Siksi linkkitekstit ”tästä”, ”lisää” ja ”klikkaa tästä” ovat hyödyttömiä. Kirjoita <a href="ohje.pdf">Lue asennusohje</a> eikä Asennusohje löytyy <a href="ohje.pdf">tästä</a>.

Älä pakota linkkejä uuteen ikkunaan

Sivun lukija päättää itse, minkä linkin haluaa avata uuteen välilehteen. Uusi ikkuna rikkoo selaimen paluupainikkeen ja hämmentää etenkin ruudunlukijan käyttäjää.

14.1 Kolme tapaa kirjoittaa osoite

Sama kohde voidaan ilmaista kolmella tavalla. Ero on siinä, kuinka suuren osan osoitteesta kirjoitat itse.

Osoitetyypit.
TyyppiAlkaaTulkitaan suhteessaToimii
AbsoluuttinenProtokollalla https://Ei mihinkään; osoite on täydellinenMihin tahansa palvelimeen
PuoliabsoluuttinenKauttaviivalla /Palvelimen juureenVain saman palvelimen sisällä
SuhteellinenNimellä, ./ tai ../Siihen kansioon, jossa nykyinen sivu onVain saman palvelimen sisällä

Absoluuttinen osoite

<p>Absoluuttisella osoitteella oleva linkki kurssin
  <a href="https://appro.mit.jyu.fi/itkp1011/">kotisivulle</a>.</p>

Absoluuttinen osoite sisältää koko osoitteen ja toimii kaikkialla. Siitä ei voi jättää pois https://-alkua: href="www.jyu.fi" ei vie jyu.fi-sivustolle vaan etsii nykyisestä kansiosta tiedostoa nimeltä www.jyu.fi. Selain piilottaa osoiteriviltä protokollan, mutta HTML:ssä sen on oltava mukana.

Puoliabsoluuttinen osoite

<p>Puoliabsoluuttisella osoitteella oleva linkki
  <a href="/itkp1011/luennot/css/">CSS-luennolle</a>.</p>

Puoliabsoluuttinen osoite luetaan palvelimen juuresta (/), joten osoitteen alkuosa https://appro.mit.jyu.fi jätetään pois. Sama merkkijono toimii jokaisella saman palvelimen sivulla riippumatta siitä, kuinka syvällä kansiorakenteessa sivu on. Siksi se sopii hyvin esimerkiksi joka sivulla toistuvaan navigaatioon.

Suhteellinen osoite

<p>Suhteellisella osoitteella oleva linkki kurssin
  <a href="../../ohjaus/ohjaus1/">ensimmäisiin ohjaustehtäviin</a>.</p>

Suhteellinen osoite ratkaistaan sen kansion perusteella, jossa viittaava dokumentti sijaitsee. Se vastaa täsmälleen komentorivin oletushakemistoa. Suhteellinen osoite on paras valinta oman sivuston sisäisiin linkkeihin, koska sivusto toimii silloin sellaisenaan myös omalla koneella ja toiseen kansioon siirrettynä.

Suhteellisen osoitteen muotoja.
OsoiteKohde
href="#"Sama sivu, sivun alku
href="./"Sama kansio (näytetään index.html)
href="muuli.html"Tämän kansion tiedosto muuli.html
href="testi/"Tämän kansion alikansio testi
href="testi/muuli.html"Alikansion testi tiedosto
href="../"Isäkansio eli yksi taso ylöspäin
href="../testi/"Isäkansion alikansio testi
href="../../"Kaksi tasoa ylöspäin

14.2 index.html

Kun osoite viittaa kansioon eikä yksittäiseen tiedostoon, palvelin tarjoaa automaattisesti kyseisessä kansiossa olevaa index.html-tiedostoa. Tiedoston nimen ei siis tarvitse näkyä osoitteessa lainkaan.

https://users.jyu.fi/~omatunnus/            → näyttää tiedoston index.html
https://users.jyu.fi/~omatunnus/index.html → sama sivu, pidempi osoite

Anna jokaisen julkaistavan kansion etusivulle nimeksi täsmälleen index.html. Index.html tai etusivu.html ei kelpaa. Jos tiedostoa ei ole, palvelin joko listaa kansion sisällön kaikkien nähtäväksi tai antaa virheen 403 Forbidden.

14.3 Dokumentin sisäinen linkki

Saman sivun toiseen kohtaan viitataan risuaidalla ja kohteen tunnisteella:

<p>Linkki tämän dokumentin hyperlinkeistä kertovaan lukuun
  <a href="#hyper">Hyperlinkit</a>.</p>

Kohteelle täytyy antaa id-attribuutilla yksikäsitteinen arvo:

<h2 id="hyper">Hyperlinkit a</h2>
Anna tunnisteille kuvaavat nimet

Kirjoita id="hyperlinkit" eikä id="kohta14". Numeroihin perustuvat tunnisteet muuttuvat aina kun sivulle lisätään lukuja, ja silloin kaikki muualta tulevat linkit hajoavat. Tunnisteen saa esiintyä sivulla vain kerran.

15. Tekstitason elementit

Nämä merkitsevät tekstin osien merkitystä. Ne eivät ole muotoiluja, vaikka selaimen oletustyyli näyttääkin ne eri tavalla.

Tavallisimmat tekstitason elementit.
ElementtiMerkitysEsimerkki
strongErittäin tärkeä asia<strong>Varoitus:</strong>
emPainotettu, tärkeä asia<em>juuri tämä</em>
codeOhjelmakoodi tai komento<code>ls -al</code>
kbdKäyttäjän näppäilemä syöte<kbd>Ctrl</kbd>
sampOhjelman tuloste<samp>404 Not Found</samp>
abbrLyhenne; title kertoo selityksen<abbr title="Cascading Style Sheets">CSS</abbr>
citeTeoksen tai lähteen nimi<cite>Tuntematon sotilas</cite>
qLyhyt lainaus tekstin sisällä<q>Näin hän sanoi</q>
timePäiväys koneluettavassa muodossa<time datetime="2026-09-02">2.9.2026</time>
spanEi merkitystä; viimeinen keino<span class="korostus">...</span>
<p>Tässä on kappale, jossa jotkin sanat ovat <em>tärkeitä</em> ja toiset
  <strong>erittäin tärkeitä</strong>.</p>

Pidemmät lainaukset merkitään blockquote-elementillä, ja muotoilematon teksti kuten koodilistaus pre-elementillä.

16. Otsikkotietoihin sijoitettavat elementit

link-elementti saa esiintyä vain head-elementin sisällä. Sillä määritellään dokumentin suhde muihin dokumentteihin. Yleisin käyttö on tyylitiedoston liittäminen.

<link rel="stylesheet" href="tyyli.css" />
<link rel="icon" href="favicon.png" />

Käytä tyylitiedostoon suhteellista osoitetta, jolloin sivusto toimii myös omalla koneellasi. Attribuutti type="text/css" on tarpeeton.

16.2 Metaelementti meta

meta-elementillä määritellään dokumenttiin liittyvää metatietoa. Sekin saa esiintyä vain head-elementin sisällä.

<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Matin kotisivu: opinnot ja harrastukset." />
<meta name="author" content="Matti Meikäläinen" />

description näkyy usein hakutulosten kuvaustekstinä. keywords-metatiedolla ei ole enää merkitystä hakukoneille.

17. Kommentit

Kommentti alkaa merkinnällä <!-- ja päättyy merkintään -->. Selain ei näytä sitä, mutta se näkyy sivun lähdekoodissa kenelle tahansa. Älä siis kirjoita kommentteihin mitään salaista.

<!-- Navigaatio alkaa -->
<nav>
  ...
</nav>
<!-- Navigaatio päättyy -->

Kommentin sisällä ei saa olla kahta väliviivaa peräkkäin, eikä kommentteja voi sijoittaa sisäkkäin.

18. Saavutettavuus

Saavutettavuus tarkoittaa, että sivua voi käyttää myös silloin, kun ei näe näyttöä, ei käytä hiirtä tai ei erota värejä toisistaan. Yliopiston verkkosivuja koskee laki digitaalisten palvelujen tarjoamisesta, joten asia ei ole vapaaehtoinen.

Hyvä uutinen on, että suurin osa saavutettavuudesta syntyy siitä, että merkitset rakenteen oikein. Tämän luennon asiat riittävät pitkälle:

Tarkistuslista, joka kattaa suurimman osan tavallisista ongelmista.
AsiaMiksi
Sivun kieli merkitty lang-attribuutillaRuudunlukija valitsee oikean ääntämyksen
Yksi h1 ja loogisesti etenevät otsikkotasotOtsikot ovat ruudunlukijan sisällysluettelo
Jokaisella kuvalla altKuvan tieto välittyy myös ilman kuvaa
Linkkiteksti kertoo kohteenLinkkejä selataan usein listana
Taulukoissa th ja scopeSolu yhdistyy oikeaan otsikkoon
Listat merkitty ul- tai ol-elementeilläLukija kuulee, montako kohtaa listassa on
Ei olennaista tietoa pelkässä title-attribuutissaVihjeteksti ei näy kaikille
Ei linkkien pakottamista uuteen ikkunaanKäyttäjä hallitsee itse selaimensa

Osan puutteista löytää automaattisesti Lighthouse, mutta se ei korvaa yllä olevan listan läpikäymistä itse. Lisätietoa: saavutettavuusvaatimukset.fi ja MDN Accessibility.

19. Selaimen kehittäjätyökalut

Jokaisessa nykyselaimessa on sisäänrakennetut kehittäjätyökalut (developer tools, DevTools). Ne ovat tärkein yksittäinen apuväline sivujen tekemisessä: niillä näet, mitä selain oikeasti teki koodillesi, mitkä tiedostot latautuivat ja miltä sivu näyttää muunkokoisella näytöllä.

Työkalujen avaaminen.
ToimintoWindows ja LinuxmacOS
Avaa työkalutF12 tai Ctrl+Shift+ICmd+Option+I
ElementtivalitsinCtrl+Shift+CCmd+Option+C
KonsoliCtrl+Shift+JCmd+Option+J
Sivun lähdekoodiCtrl+UCmd+Option+U
Lataa sivu välimuistia ohittaenCtrl+Shift+RCmd+Shift+R

Työkalut voi avata myös napsauttamalla sivun kohtaa hiiren oikealla painikkeella ja valitsemalla Tutki tai Inspect. Silloin oikea elementti on valmiiksi valittuna.

19.1 Elements eli elementtinäkymä

Tämä on se välilehti, jota käytät eniten. Firefoxissa sen nimi on Inspector, Chromessa ja Edgessä Elements.

Lähdekoodi ja elementtinäkymä eivät ole sama asia

Ctrl+U näyttää tiedoston sellaisena kuin sen kirjoitit. Elementtinäkymä näyttää DOM-puun eli sen, mitä selain sai koodista aikaan. Jos unohdit lopetustagin, näet eron juuri tässä: lähdekoodissa kaikki näyttää siltä miltä tarkoititkin, mutta elementtinäkymässä loppuosa sivusta on valunut jonkin elementin sisään. Tämä on nopein tapa löytää sulkematon elementti.

19.2 Console eli konsoli

Konsoliin selain kirjoittaa varoituksensa ja virheilmoituksensa. Tällä kurssilla tärkeimmät ovat:

Tavallisimmat konsoliviestit.
ViestiMerkitys
Failed to load resource: 404Kuva, tyylitiedosto tai muu tiedosto puuttuu tai on väärässä osoitteessa
Mixed Content: ... was loaded over HTTPHttps-sivulle yritettiin ladata http-osoitteessa oleva tiedosto. Selain esti sen
Failed to decode downloaded fontFonttitiedosto on rikki tai väärässä muodossa

Konsoliin voi myös kirjoittaa JavaScript-komentoja, mutta sitä ei tällä kurssilla tarvita: me kirjoitamme HTML:ää ja CSS:ää emmekä ohjelmoi. Konsoli on siis tässä vaiheessa pelkkä ilmoitustaulu, jota kannattaa vilkaista aina kun jokin ei toimi.

19.3 Network eli verkkoliikenne

Verkkonäkymä listaa jokaisen tiedoston, jonka selain haki sivua ladatessaan. Avaa se ja lataa sivu uudelleen, niin lista täyttyy. Kiinnostavin sarake on Status:

Tämä on nopein tapa selvittää, miksi kuva ei näy palvelimella. Napsauta punaisena näkyvää riviä, niin näet, mitä osoitetta selain oikeasti yritti hakea. Useimmiten osoitteessa on väärä kirjainkoko tai kansio, jota ei ole olemassa.

Muista ohittaa välimuisti

Kun olet siirtänyt korjatun tiedoston palvelimelle mutta selain näyttää yhä vanhaa, paina Ctrl+Shift+R. Se lataa sivun välimuistia ohittaen. Verkkonäkymässä on myös valinta Disable cache, joka pitää välimuistin pois päältä niin kauan kuin työkalut ovat auki.

19.4 Näytön koon simulointi

Työkalupalkin laitepainike (Chromessa Toggle device toolbar, Ctrl+Shift+M) näyttää sivun kapealla näytöllä. Kokeile aina, miltä sivusi näyttää noin 360 pikselin levyisenä. Jos teksti valuu reunan yli tai sivua pitää vierittää sivusuunnassa, jokin on pielessä. Yleisin syy on puuttuva viewport-metaelementti tai liian leveä taulukko tai kuva.

19.5 Saavutettavuusnäkymä

Elementtinäkymän vieressä on Accessibility-välilehti. Se näyttää sivun sellaisena kuin ruudunlukija sen näkee:

Chromessa ja Edgessä sama puu löytyy elementtinäkymän oikean laidan Accessibility-paneelista. Rastittamalla Enable full-page accessibility tree saat koko sivun puun näkyviin elementtinäkymän tilalle.

19.6 Otsikkorakenteen tarkistaminen

Otsikkotasot ovat dokumentin runko, mutta selain ei näytä niitä valmiina listana. Kaksi virhettä kannattaa etsiä: onko sivulla useampi kuin yksi h1 ja hyppääkö jokin otsikko tason yli, esimerkiksi h2:sta suoraan h4:ään. Kumpaakaan ei näe sivua katsomalla, koska otsikon koon määrää CSS eikä taso.

Neljä tapaa nähdä otsikkorakenne.
TyökaluMiten
Visual Studio Code Avaa vasemman reunan Explorer ja sen alalaidasta Outline-osio. Se piirtää auki olevan tiedoston elementtipuun, josta otsikoiden järjestys ja sisäkkäisyys näkyvät suoraan. Toimii ilman selainta ja ilman verkkoyhteyttä
Selainlaajennus Sekä Firefoxiin että Chromeen on saatavana HeadingsMap, joka piirtää otsikkorakenteen sivupalkkiin ja merkitsee hypätyt tasot. Sama onnistuu myös WAVE-laajennuksella
Firefoxin saavutettavuuspuu Otsikot näkyvät puussa roolilla heading. Kun valitset otsikon, oikean laidan Properties-osion kohta attributes → level kertoo tason. Puu on pitkä, joten selaaminen on hidasta
Lighthouse Huomauttaa hypätyistä tasoista viestillä Heading elements are not in a sequentially-descending order ja kertoo, mikä otsikko on kyseessä

Nopein tapa harjoitustyötä tehdessä on VS Coden Outline-näkymä, koska se päivittyy samalla kun kirjoitat.

Harjoitus

Avaa oma sivusi selaimessa ja tee seuraavat asiat: 1) etsi elementtivalitsimella jokin kappale ja katso sen polku, 2) poista jonkin kuvan alt-attribuutti elementtinäkymässä ja katso, mitä saavutettavuuspuussa tapahtuu, 3) avaa verkkonäkymä ja tarkista, ettei yhdelläkään rivillä ole tilaa 404.

20. Lighthouse

Lighthouse on Googlen tekemä automaattinen tarkistustyökalu, joka on sisäänrakennettuna Chromessa ja Edgessä. Se lataa sivun, tekee sille joukon testejä ja antaa raportin neljästä osa-alueesta.

Lighthousen osa-alueet.
Osa-alueMitä mittaaMerkitys tällä kurssilla
PerformanceLatausnopeus ja sivun vakaus latautuessaPieni. Kuvien koon ja width/height-attribuuttien osalta hyödyllinen
AccessibilityKoneellisesti havaittavat saavutettavuuspuutteetSuuri. Löytää puuttuvat alt-tekstit, kielimerkinnän ja otsikkohypyt
Best PracticesYleiset virheet, kuten http-sisältö https-sivullaKohtalainen
SEOLöydettävyys hakukoneissaPieni, mutta muistuttaa title- ja description-tiedoista

20.1 Näin ajat testin

  1. Avaa sivusi Chromessa tai Edgessä. Sivun on oltava selaimessa auki; Lighthouse testaa sitä sivua, joka on näkyvissä.
  2. Avaa kehittäjätyökalut (F12) ja valitse välilehti Lighthouse. Se voi olla piilossa välilehtien lopun »-painikkeen takana.
  3. Valitse Mode: Navigation, Device: Mobile ja rastita ainakin Accessibility ja Best Practices.
  4. Paina Analyze page load ja odota puolisen minuuttia. Älä koske selaimeen sillä aikaa.
  5. Lue raportti. Jokainen punainen tai keltainen kohta aukeaa napsauttamalla, ja siinä kerrotaan mitä on vialla, missä elementissä ja miten se korjataan.
Testaa myös oma kone

Lighthousen voi ajaa myös paikallisesti auki olevalle tiedostolle, mutta osa testeistä vaatii oikean palvelimen. Luotettavimman tuloksen saat ajamalla testin julkaistulle sivulle osoitteessa https://users.jyu.fi/~omatunnus/. Sama tarkistus löytyy myös selaimen ulkopuolelta osoitteesta pagespeed.web.dev, jonne riittää liittää sivun osoite.

20.2 Miten raporttia luetaan

Tyypillisiä löydöksiä Accessibility-osiossa ovat:

Yleisimmät huomautukset ja niiden korjaus.
HuomautusKorjaus
Image elements do not have [alt] attributesLisää alt-teksti jokaiseen kuvaan
<html> element does not have a [lang] attributeLisää lang="fi" ja xml:lang="fi"
Heading elements are not in a sequentially-descending orderOtsikkotaso hypättiin yli, esimerkiksi h2:n jälkeen h4
Document does not have a meta descriptionLisää <meta name="description" ... />
Links do not have a discernible nameKuvalinkiltä puuttuu alt-teksti tai linkkiteksti on tyhjä
Background and foreground colors do not have a sufficient contrast ratioTekstin ja taustan kontrasti on liian pieni. Korjataan CSS:llä
Sata pistettä ei tarkoita saavutettavaa sivua

Lighthouse on automaattinen testi ja löytää vain koneellisesti havaittavat puutteet, arviolta kolmanneksen kaikista. Se ei osaa arvioida, onko alt-tekstisi mielekäs, kertooko linkkiteksti kohteesta tai etenevätkö otsikot loogisesti sisällön kannalta. Täydet pisteet saa myös sivu, jonka jokaisen kuvan alt-teksti on alt="kuva". Käytä työkalua virheiden etsimiseen, älä todistuksena laadusta, ja tee lopuksi luvun 18 tarkistuslista itse.

21. Yleisimmät virheet HTML-dokumentissa

Virheet, jotka validaattori löytää useimmin.
VirheKorjaus
Lopetustagi puuttuuSulje jokainen elementti, joka ei ole void-elementti
Elementit menevät ristiinSulje sisin ensin: <p><em>...</em></p>
Ei-void-elementti kirjoitettu muodossa <div />Käytä lopetustagia
Teksti suoraan body-elementin sisälläMerkitse se kappaleeksi tai muuksi lohkoksi
Lohkotason elementti tekstitason elementin sisällä<p> ei kuulu <em>-elementin sisään
ul-elementin lapsena muuta kuin liSiirrä alilista li-elementin sisään
Attribuutin arvo ilman lainausmerkkejähref="sivu.html"
Elementin tai attribuutin nimi isoilla kirjaimillaKirjoita pienillä
Sama id useaan kertaanTunnisteen pitää olla yksikäsitteinen
alt-attribuutti puuttuu kuvastaLisää se, tyhjänäkin jos kuva on koriste
Väärä dokumenttityyppi tai se puuttuu<!DOCTYPE html>
Koodaamaton &-merkki tekstissä tai osoitteessa&amp;

22. HTML-dokumentin tuottamisen vaiheet

  1. Kirjoita dokumentin sisältö.
  2. Merkitse dokumentin rakenne.
  3. Validoi dokumentti W3C:n validaattorilla. Voit ladata tiedoston tai liittää koodin suoraan, joten julkaisemista ei tarvitse odottaa.
  4. Korjaa virheet ja validoi uudelleen, kunnes tulos on puhdas.
  5. Testaa dokumentti vähintään kahdella eri selaimella ja kapealla näytöllä.
  6. Määrittele ulkoasu CSS:llä.
  7. Validoi CSS CSS-validaattorilla.
  8. Siirrä dokumentti ja kaikki siihen liittyvät tiedostot www-palvelimelle.
  9. Tarkista sivu vielä palvelimelta. Kuvat ja tyylit paljastavat siinä vaiheessa, jos jokin tiedosto jäi siirtämättä tai osoite on väärin.
Vaihe 9 löytää yleisimmän virheen

Omalla koneella sivu toimii, mutta palvelimella kuvat eivät näy. Syy on lähes aina jokin näistä: kuvatiedosto jäi siirtämättä, tiedostonimen kirjainkoko ei täsmää (Logo.PNG ei ole logo.png) tai osoitteessa on kansio, jota ei palvelimella ole. Tarkista nämä ennen kuin epäilet muuta.

23. WWW-sivun julkaisu JYU:ssä

Voit julkaista sivusi tallentamalla sen W:-asemalle. Jos W:-asema ei ole suoraan käytettävissä, toimi digipalvelujen ohjeen mukaan. Kotisivutila aktivoidaan sso.jyu.fi-palvelussa.

Sivusi löytyy osoitteesta

https://users.jyu.fi/~omatunnus/kansio/tiedoston_nimi.html

Komentoriviltä samaan tilaan pääsee kotihakemistoon tehdyn html-linkin kautta. Oikeuksien asettaminen, kirjainkoon merkitys ja rivinvaihdot käsitellään komentoriviluennon luvussa 30.

Jos sivu ei näy selaimessa.
Selaimen virheTodennäköinen syy
404 Not FoundVäärä tiedostonimi tai polku. Tarkista kirjainkoko ja se, että tiedosto todella siirtyi
403 ForbiddenTiedosto- tai kansio-oikeudet puuttuvat, tai kansiosta puuttuu index.html
Sivu näkyy, kuvat eivätKuvatiedostot jäivät siirtämättä tai osoitteen kirjainkoko ei täsmää
Ääkköset ovat sekaisinTiedosto ei ole UTF-8-muodossa tai meta charset puuttuu
Sivu näkyy ilman tyylejäTyylitiedosto jäi siirtämättä tai link-osoite on väärä

24. Tarkistuslista

Käy lista läpi, ennen kuin palautat harjoitustyön.

  1. Onko dokumentin alussa <!DOCTYPE html>?
  2. Onko html-elementissä lang ja xml:lang?
  3. Onko head-osassa meta charset, viewport ja kuvaava title?
  4. Onko sivulla täsmälleen yksi h1 ja etenevätkö otsikkotasot loogisesti?
  5. Onko jokaisella kuvalla alt? Onko koristekuvilla alt=""?
  6. Onko kaikki suljettu, ja onko kauttaviivaa käytetty vain void-elementeissä?
  7. Kertovatko linkkitekstit, minne linkki vie?
  8. Onko taulukoissa caption, th ja scope?
  9. Meneekö dokumentti validaattorista läpi ilman virheitä?
  10. Onko konsolissa virheilmoituksia ja verkkonäkymässä 404-rivejä?
  11. Mitä Lighthousen Accessibility-osio sanoo?
  12. Onko tiedosto tallennettu UTF-8-muodossa ja LF-rivinvaihdoilla?
  13. Toimivatko kaikki linkit ja näkyvätkö kuvat myös palvelimelta katsottuna?

25. Lisätietoa

Käyttäjien kommentit

Kommentoi Lisää kommentti