Valitsimet ja asemointia CSS:llä
Näissä tehtävissä tutustutaan WWW-sivun ulkoasun asemointiin CSS:n avulla ja harjoitellaan valitsimia. Jos et vielä ehtinyt tehdä loppuun ohjaus 3:n tehtäviä, viimeistele ne ennen näihin siirtymistä. Voit tarvittaessa jatkaa edellisen ohjauksen mallivastauksesta.
Tämän ohjauksen jälkeen sinun pitäisi osata:
- toteuttaa kuvagalleria
float-ominaisuudella ja tiedät, miksi floatilla asemoidut lohkot täytyy väistää (clear); - toteuttaa saman gallerian flexboxilla ja verrata tapoja keskenään;
- kohdistaa tyylin oikeisiin elementteihin ilman että HTML-tiedostoa muokkaa;
- käyttää jälkeläis-, lapsi- ja vierusvalitsimia sekä pseudoluokkia
:first-childja:last-child.
- Mallivastaus.zip ja mallivastaus
- Voit harjoitella valitsimia CSS Dinerin avulla.
1. Galleria float-ominaisuudella
Tehdään Nanonanon sivustoon galleriasivu, johon tulee pikkukuvia myyntiin.
- Lataa galleriakuvat.zip ja pura paketti
hakemistoon
W:\www\galleria\. - Luo uusi HTML-dokumentti ja tallenna se nimellä
index.htmlgalleria-hakemistoon. - Lisää
link-elementillä viite sivuston juurihakemistossa olevaanohjaus3.css-tiedostoon. Lisää sivulle myös pääotsikko ja lyhyt johdantokappale. -
Kopioi esimerkiksi
linkit-hakemiston tiedostosta kokoheader-elementti sisältöineen uuden dokumentinbody-osaan. Muuta murupolku vastaamaan Galleria-sivua ja korjaa navigointilinkit. Lisää linkki Galleria-sivulle myös muiden hakemistojen navigointipalkkeihin, ja poista Galleria-kohdan ympäriltä pelkkä teksti. -
Lisää sivulle viisi kuvalohkoa tähän tapaan:
<figure class="galleriakuva"> <img src="viitatorni.jpg" alt="Viitatorni ja järvimaisema" /> <figcaption>Viitatorni</figcaption> </figure>Miksifigureeikädiv?Kuva ja siihen liittyvä kuvateksti merkitään
figure-elementillä ja kuvatekstifigcaption-elementillä. Ne kertovat, että teksti kuuluu juuri tähän kuvaan;divjapeivät kerro mitään. Kuvat merkittiin näin jo ohjaus 2:ssa. - Tutki, miltä sivu näyttää selaimessa.
1.1 Liu'utus
Muotoillaan kuvalohkot tasavälisiksi ja selainikkunan koon mukaan vierekkäin rivittyviksi.
- Muokkaa
ohjaus3.css-tiedostoa. Liu'uta.galleriakuva-lohkot vasempaan laitaan. -
Selain antaa
figure-elementille oletuksena suuret sivumarginaalit. Nollaa ne ja määrää itse haluamasi marginaali. -
Tutki, mikä on suurimman kuvan leveys ja korkeus. Anna
.galleriakuva-lohkollewidthjaheight, jotka ovat hieman yli suurimman kuvan koon. Huomioi korkeudessa myös kuvatekstin tarvitsema tila. Voit käyttää tässä tapauksessapx-arvoja (miksi?).Muistabox-sizingohjaus3.cssalkaa säännöllä* { box-sizing: border-box; }, joten antamasiwidthjaheightsisältävät myös täytteen ja reunan. Varaa siis hieman enemmän tilaa kuin pelkkä kuva vaatii. - Keskitä kuva lohkon sisällä vaakasuunnassa. Koska kuva on tekstitason
elementti, se onnistuu
text-align-ominaisuudella. -
Muotoile kuvatekstit. Lisää
ohjaus3.css-tiedostoon sääntö, joka osuu vain.galleriakuva-lohkon sisällä olevaanfigcaption-elementtiin:- keskitä teksti;
- poista marginaalit ja täytteet;
- pienennä fonttikokoa hieman
em- tairem-yksikössä.
Älä piilota tekstiäoverflow: hidden-määritykselläVanhassa ohjeessa kuvatekstille annettiin kiinteä korkeus ja ylivuotava osa piilotettiin. Silloin pidempi kuvateksti katkeaa kesken eikä sitä pääse lukemaan mitenkään — ei myöskään ruudunlukijalla, joka ei kerro tekstin jatkuvan. Anna tekstin mieluummin rivittyä, tai varaa lohkoon riittävästi korkeutta.
-
Rivitä kuvat oikealla olevan navigointilohkon alapuolelle
clear-ominaisuudella. Voit lisätä lohkoille myös pienen ylämarginaalin, jotteivät ne mene kiinni navigointiin.clearjafloaton käsitelty asemointiluennon luvussa 5.
2. Sama galleria flexboxilla
Toteutetaan samanlainen galleria flexboxilla ja verrataan tapoja. Flexbox on käsitelty asemointiluennon luvussa 6.
- Lisää edellisen gallerian perään
h2-otsikko, jonka sisällöksi kirjoitat "Sama galleria flexboxilla". - Lisää otsikon perään
div-elementti, jolle annat luokanflex. - Kopioi uuden lohkon sisään koko edellä tekemäsi galleria eli kaikki viisi
figure-elementtiä. - Poista uuden gallerian
figure-elementeistäclass="galleriakuva"-attribuutit. -
Kokeile, miten sivu toimii. Vanha ja uusi galleria menevät liu'utuksen takia sekaisin. Lisää tyylitiedostoon:
.clear { clear: both; }ja ota tyyli käyttöön
h2-elementissä. Kelluva lohko ei kasvata äitilohkonsa korkeutta, joten ilmanclear-määritystä seuraava sisältö valuu sen viereen. -
Lisää tyylitiedostoon:
.flex { display: flex; }Kokeile. Kaikki kuvat tulevat yhdelle riville.
-
Käsketään flexboxia rivittämään ja lisätään väli alkioiden väliin:
.flex { display: flex; flex-wrap: wrap; gap: 1em; }gapkorvaa marginaalitFloatilla tehdyssä galleriassa välit piti tehdä marginaaleilla, ja reunimmaisten kohdalla ne menivät helposti pieleen. Flexboxissa
gaphoitaa asian yhdellä rivillä eikä lisää tilaa laitoihin. -
Muuta asiayhteyden mukaan määräytyvillä valitsimilla flexboxin kuviin ja teksteihin samat tyylit kuin floatilla tehtyyn. Älä tee enää muutoksia HTML-tiedostoon, vaan kirjoita valitsimet, joilla pääset käsiksi oikeisiin elementteihin. Vinkki:
.flex figure { ... } .flex figcaption { ... } -
Kokeile, mitä tapahtuu, kun lisäät
.flex-tyyliin:flex-direction: column; max-height: 30em; -
Flexboxissa voi myös muuttaa alkioiden järjestystä. Kokeile:
.flex figure { order: 5; } .flex figure + figure { order: 4; } .flex figure + figure + figure { order: 3; } .flex figure + figure + figure + figure { order: 2; }Ketju on hyvä harjoitus vierusvalitsimesta, mutta käytännössä saman saisi yhdellä rivillä:
flex-direction: row-reverse.ordermuuttaa vain sen, mitä silmä näkeeRuudunlukija lukee sisällön ja sarkain etenee edelleen koodin mukaisessa järjestyksessä. Näkevä ja näkemätön käyttäjä saavat siis eri järjestyksen. Kokeile: paina Tab ja katso, missä järjestyksessä kuvien linkit käydään läpi. Tästä syystä sisältö kirjoitetaan koodiin siinä järjestyksessä kuin se on tarkoitettu luettavaksi, ja
order-ominaisuutta käytetään vain pieniin siirtoihin.
Kumpi tapa oli helpompi kirjoittaa? Kumpi käyttäytyy paremmin, kun kavennat selainikkunaa? Entä kun suurennat tekstin kokoa? Vastaus näihin on syy siihen, miksi uudet sivustot tehdään flexboxilla tai gridillä eikä liu'utuksella.
3. Valitsinharjoituksia
Näissä tehtävissä harjoitellaan kohdistamaan tyyli oikeisiin elementteihin silloin, kun HTML-tiedostoon ei saa koskea. Se on tavallinen tilanne: sisältö tulee julkaisujärjestelmästä tai joltakulta toiselta, ja ainoa keino vaikuttaa ulkoasuun on CSS.
- Pura valitsimet.zip W:-asemalle johonkin hakemistoon
- Avaa zip-paketissa tullut
malli.htmlselaimeen. Et saa tehdä tähän tiedostoon mitään muutoksia. - Avaa elementtinäkymä (Ctrl+Shift+C, valikosta Työkalut → Selaintyökalut → Tarkastelu). Dokumentin rakenne ratkaisee, mitä valitsimia on käytettävä, joten tutki sitä ennen kuin kirjoitat mitään.
- Avaa tyylieditori (Shift+F7). Saat tehdä muutoksia
ainoastaan
valitsimet.css-tiedostoon.
Toteuta seuraavat muutokset. Valitsimista löytyy esimerkkejä valitsinluennolta.
| Tehtävä | Tarvitset |
|---|---|
| 1. Aseta koko dokumentille taustaväri ja tekstin väri | :root |
| 2. Muuta "Aliquam venenatis ipsum" -alkuisen kappaleen taustaväriksi hopea | Tunnistevalitsin. Vinkki: tutki kappaletta elementtinäkymässä |
3. Muuta strong-elementtien väri vihreäksi, mutta
tekstikappaleiden sisällä olevien punaiseksi |
Elementtivalitsin ja jälkeläisvalitsin |
| 4. Muuta navigointilohkon sed neque -teksti erottuvaksi, ilman että listan sana vestibulum muuttuu | Jälkeläisvalitsin kahdella tasolla. Mieti, miksi
.navbar strong ei riitä |
| 5. Lisää musta raja navigointilohkon ensimmäisen kappaleen ympärille | :first-child |
| 6. Kursivoi navigointilistan viimeinen alkio | :last-child |
7. Lihavoi jokaista h2-otsikkoa välittömästi
seuraava kappale, mutta ei muita |
Vierusvalitsin + |
| 8. Muuta taulukon joka toisen sarakkeen taustaväri tummaksi ja teksti valkoiseksi, joka toisen päinvastoin | Vierusvalitsin ketjutettuna |
| 9. Erota taulukon otsikkorivi taustavärillä ja lihavoi ensimmäisen sisältörivin solut | Jälkeläisvalitsin ja :first-child |
| 10. Muotoile linkkien kaikki tilat ja poista alleviivaus navigoinnista | :link, :visited, :hover,
:focus |
- Tehtävä 8: vierusvalitsimen voi ketjuttaa.
tdosuu kaikkiin soluihin,td + tdsarakkeisiin 2–4,td + td + tdsarakkeisiin 3–4 ja niin edelleen. Kun kirjoitat säännöt peräkkäin, myöhempi voittaa ja lopputulos vuorottelee. - Tehtävä 9: taulukossa on
theadjatbody, joten otsikkorivin erottamiseen ei tarvita vierusvalitsinta lainkaan. - Kaikkiin: jos sääntö ei osu, valitse elementti elementtinäkymässä ja katso oikean laidan sääntöluettelosta, näkyykö sääntösi siellä. Jos ei näy, valitsin ei osu. Jos näkyy yliviivattuna, jokin toinen sääntö voittaa.
- Tehtävissä 8 ja 9: millä tavalla nämä olisi ollut helpompi tehdä, jos olisit saanut muuttaa myös HTML-tiedostoa? Milloin luokka on parempi ratkaisu kuin monimutkainen valitsin?
- Tehtävässä 8 tarkista kontrastit. Tumma tausta vaalealla tekstillä ja päinvastoin toimivat, mutta tumma teksti tummalla taustalla katoaa kokonaan.
Attribuuttivalitsimet, pseudoelementit kuten ::first-letter ja
::marker, sekä :nth-child()-tyyppiset valitsimet eivät
kuulu tähän kurssiin. Ne on koottu
valitsinten
jatkomateriaaliin, jossa on myös omat kokeiltavat esimerkkinsä.
4. Lisätehtäviä
-
Merkitse osa gallerian kuvista myydyiksi. Lisää myytyihin kuviin
figcaption-elementin sisään toinen elementti:<figcaption>Viitatorni <span class="myyty">(myyty)</span></figcaption>ja muotoile
.myyty-luokka erottuvaksi. Huomaa, ettei pelkkä väri riitä erotteluun: värisokea käyttäjä ei näe eroa, joten tieto on oltava myös tekstinä. - Lisää galleriaan kuudes kuva. Toimiiko asettelu itsestään oikein molemmissa toteutuksissa?
- Kokeile, mitä tapahtuu, kun poistat
.galleriakuva-lohkolta kiinteän korkeuden. Miksi floatilla tehty galleria menee sekaisin, mutta flexboxilla tehty ei?
5. Testaus
- Validoi sivut HTML-validaattorilla ja tyylitiedosto CSS-validaattorilla.
- Liiku sivulla Tab-näppäimellä. Näetkö koko ajan, missä olet?
- Kavenna selainikkuna noin 360 pikseliin. Kumpi galleria kestää sen paremmin?
- Suurenna tekstin kokoa 200 prosenttiin. Katoaako kuvatekstejä?
- Tarkista kontrastit kehittäjätyökalujen värivalitsimella.
Käyttäjien kommentit