Asemointi CSS:n avulla
Tällä luennolla käsitellään sivun ulkoasun asemointia CSS:n avulla.
Tämän luennon jälkeen sinun pitäisi osata:
- selittää lohko- ja tekstitason elementtien ero ja kertoa, miten
display-ominaisuudella vaihdetaan elementin käyttäytymistapaa; - päätellä elementin koko laatikkomallista ja käyttää
box-sizing-ominaisuutta; - liu'uttaa lohkon
float-ominaisuudella ja korjata siitä seuraava äitilohkon korkeusongelma; - rakentaa monisarakkeisen asettelun flexboxilla: valita akselin suunta, jakaa
tila
flex-lyhenteellä ja tasata alkiotjustify-content- jaalign-items-ominaisuuksilla; - rakentaa ruudukon gridillä, jakaa tilan
fr-yksiköllä ja nimetä alueetgrid-template-areas-ominaisuudella; - keskittää sisällön sekä vaaka- että pystysuunnassa;
- siirtää, kiertää ja skaalata elementtiä
transform-ominaisuudella ja kertoa, miksi se ei siirrä elementtiä dokumenttivirrassa; - valita
position-ominaisuuden arvon ja selittää, mihinabsolutejafixedsuhteutuvat; - perustella, missä järjestyksessä sivun asettelu kannattaa suunnitella, ja miksi sisällön järjestys koodissa on tärkeä myös silloin kun CSS siirtää sen muualle.
Saavuttaaksesi arvosanan kolme on sinun ymmärrettävä vähintään lohko- ja tekstitason elementtien ero, float, flexbox ja keskitys. Parhaaseen arvosanaan (5) päästäksesi on lisäksi osattava ainakin grid ja transformointi.
Aihe on käsitelty hyvin myös MDN:n dokumentissa CSS layout.
1. CSS Flow Layout
HTML:n elementit voidaan ryhmitellä kahteen kategoriaan: block-tason elementteihin
ja inline-elementteihin. Block-tason elementeillä, joita ovat esimerkiksi
div ja p, merkitään osioita tai isompia kokonaisuuksia.
Inline-tason elementit, kuten a ja img, ovat pienempi osa
joko toista inline-elementtiä tai block-elementtiä.
1.1 Block (lohko) -tason elementti
- Voi sisältää block-elementtejä (esimerkiksi
divtoisendiv-elementin sisällä) ja inline-elementtejä (esimerkiksiimgp-elementin sisällä). - Oletuksena alkaa ja päättyy rivinvaihtoon, eli lohkot tulevat pystysuunnassa peräkkäin.
- Käytetään rakennuspalikkana isompien layout-rakenteiden luomiseen, toisin kuin inline-elementtejä.
- Vie vaakasuunnassa kaiken käytettävissä olevan tilan.
- Yhdistelee pystysuunnassa peräkkäisiä marginaaleja. Jos dokumentissa on
peräkkäin kaksi
p-elementtiä, joista ensimmäisellä on 1 em alamarginaalia ja toisella 2 em ylämarginaalia, väliin jää 2 em eikä 3 em. Katso Mastering margin collapsing. vertical-align-ominaisuus ei vaikuta block-elementteihin vaan ainoastaan inline-elementteihin.
1.2 Inline (teksti) -tason elementti
- Sisältää dataa (esimerkiksi
asisältää linkin tekstin) ja muita inline-elementtejä (esimerkiksispanvoi sisältääem-merkittyä tekstiä). - Ei oletuksena ala eikä pääty rivinvaihtoon. Tulee vaakasuunnassa peräkkäin samalle riville, ja jatkuu seuraavalle riville jos tila ei riitä.
- Ylä- ja alamarginaalilla ei ole vaikutusta, ellei kyseessä ole
inline-block-tyyppinen elementti. width- jaheight-ominaisuuksilla ei ole vaikutusta.text-align-ominaisuudella ei ole vaikutusta itse inline-elementtiin. Se asetetaan sen sisältävään lohkoon.
Normaalisti block-tason elementit järjestyvät allekkain äitilohkon vasempaan laitaan ja inline-elementit vierekkäin, kunnes äitilohkon leveys on täyttynyt. CSS-ominaisuuksilla voidaan kuitenkin irrottaa tietyt elementit perusjärjestyksestä ja asemoida ne sivulle uuteen paikkaan. Katso Visual formatting model.
2. display-ominaisuus
CSS:n display-ominaisuudella voi vaihtaa elementin
käyttäytymistapaa. Yksinkertaisimmillaan muutetaan lohko tekstitason elementiksi tai
toisin päin.
| Arvo | Merkitys |
|---|---|
block | Lohkotason elementti |
inline | Tekstitason elementti |
inline-block | Asettuu kuten tekstitason elementti, mutta käyttäytyy sisäisesti kuin lohko: leveys, korkeus ja pystymarginaalit toimivat |
none | Elementtiä ei esitetä sivulla lainkaan eikä se vie tilaa |
list-item | Listan alkio |
flex | Tekee elementistä flex-säiliön |
grid | Tekee elementistä ruudukon |
flow-root | Kuten block, mutta muodostaa oman sisältökontekstinsa. Ratkaisee floatin korkeusongelman |
display: none piilottaa myös apuvälineiltä
Arvolla none merkitty elementti katoaa kokonaan: ruudunlukija ei lue
sitä eikä siihen voi siirtyä sarkaimella. Se on siis oikea valinta silloin, kun
sisältöä ei todella tarvita, muttei silloin kun jotain halutaan piilottaa vain
visuaalisesti.
2.1 Esimerkki block- ja inline-elementeistä
Lisätietoa: Inline formatting context (MDN).
3. Laatikkomallin koko
Asemoinnin yhteydessä on tärkeä ymmärtää, miten CSS laskee elementin koon. Katso CSS box model sekä CSS-luennon luku 9.
width- jaheight-ominaisuudet asettavat elementin sisältölaatikon koon. Tämän päälle lisätään vielä mahdollinen täyte (padding) ja raja (border).box-sizing: content-boxon oletustoimintamalli.box-sizing: border-boxsisällyttää rajan ja täytteen elementin kokoon, jolloinwidthtarkoittaa koko laatikon leveyttä.- Marginaali lisätään aina elementin koon päälle
box-sizing-arvosta riippumatta.
width: auto ei ole sama kuin width: 100%
Lohkon oletusarvo on width: auto, jolloin se täyttää käytettävissä
olevan tilan marginaalit huomioiden. Arvo 100% taas
tarkoittaa äitilohkon koko leveyttä, jolloin marginaalit tulevat sen päälle ja
lohko vuotaa reunan yli. Jos tarvitset arvoa 100%, käytä sen kanssa
box-sizing: border-box.
3.1 Box-sizing-esimerkki
4. Listojen muotoilu
Listat eli ul- tai ol-elementti ja niihin liittyvä
li-elementti ovat joskus kinkkisiä muotoilla.
- Listan listamerkki määrätään
list-style-type-ominaisuudella. Arvononepoistaa merkin kokonaan. - Listamerkin sijaintipaikka määrätään
list-style-position-ominaisuudella. Oletusarvooutsidesijoittaa merkin listan alkion sisältölaatikon ulkopuolelle, arvoinsidesen sisään osaksi tekstiä. - Kun merkki on ulkopuolella, se piirtyy
ul- taiol-elementin täytteen tai marginaalin alueelle. Jos molemmat ovat nollia, merkki jää elementin alueen ulkopuolelle ja voi leikkautua pois näkyvistä. Varmista siis, että listalla on riittävästi vasenta täytettä. - Listamerkin ulkoasua voi muotoilla
::marker-pseudoelementillä, esimerkiksili::marker { color: red; }.
4.1 Listamuotoiluesimerkki
5. Liu'utus (float)
float-ominaisuudella voidaan irrottaa lohko normaalista
dokumenttivirrasta ja liu'uttaa se vasempaan tai oikeaan laitaan. Muu sisältö kiertää
liu'utetun lohkon rinnalle, ellei tätä kielletä
clear-ominaisuudella.
| Ominaisuus | Arvot | Merkitys |
|---|---|---|
float | left, right, none | Liu'uttaa lohkon reunaan, ja muu sisältö kiertää sen |
clear | left, right, both, none | Estää elementtiä tulemasta liu'utetun sisällön rinnalle |
Tämä on floatin klassisin ongelma: kun lohkon ainoa sisältö on liu'utettu, äiti jää nollan korkuiseksi eivätkä sen tausta ja reunat näy. Ratkaisu on yksi rivi äitilohkolle:
.sisaltaa-floatin {
display: flow-root;
}
Vanhoissa ohjeissa tämä tehdään niin sanotulla clearfix-tempulla, jossa
::after-pseudoelementille annetaan clear: both.
flow-root tekee saman siististi ja on tuettu kaikissa yleisissä
selaimissa.
float on alun perin tehty siihen, että teksti kiertää kuvan tai
tietolaatikon. Siihen se on edelleen paras työkalu. Monisarakkeisen sivusommittelun
tekemiseen käytetään nykyään flexboxia tai
gridiä.
5.1 Esimerkki float-ominaisuudesta
Lisätietoa: float ja clear (MDN).
6. Flexbox-asemointi
Flexbox on yksi kätevimpiä ja skaalautuvimpia tapoja tehdä asemointia. Perusongelma asemoinnin kanssa on saada aikaan monisarakkeinen sivusommittelu, ja flexbox tekee sen helpoksi.
- Flexbox sijoittaa elementit peräkkäin samalle akselille, pystyyn tai vaakaan, ja kutistaa niitä tarvittaessa.
flex-direction-ominaisuudella asetetaan akselin suunta. Arvot ovatrow,row-reverse,columnjacolumn-reverse.- Oletuksena kaikki tungetaan samalle akselille. Rivityksen saa käyttöön
flex-wrap-ominaisuudella. gap-ominaisuudella asetetaan alkioiden väli.order-ominaisuudella voi määrätä alkioille eri järjestyksen kuin dokumentissa oleva.
order-arvot alkavat nollasta, eivät ykkösestä
order-ominaisuuden oletusarvo on 0, ja arvoksi käy
mikä tahansa kokonaisluku, myös negatiivinen. Jos numeroit alkiot ykkösestä alkaen,
kaikki ne alkiot joille et anna arvoa menevät ensimmäisiksi, koska niiden arvo on
nolla. Negatiivinen arvo siirtää alkion muiden edelle.
order muuttaa vain sen, mitä silmä näkee
order ja row-reverse eivät muuta dokumentin järjestystä.
Ruudunlukija lukee sisällön ja sarkain etenee edelleen koodin mukaisessa
järjestyksessä, joten näkevä ja näkemätön käyttäjä saavat eri järjestyksen.
Saavutettavuusvaatimukset edellyttävät, että järjestys on merkityksellinen myös
ilman tyylejä. Kirjoita siis sisältö koodiin siinä järjestyksessä kuin se on
tarkoitettu luettavaksi ja käytä order-ominaisuutta vain
pieniin siirtoihin, jotka eivät muuta luettavaa järjestystä.
6.1 Flexbox-esimerkki 0
6.2 Flexbox-esimerkki 1
6.3 Alkioiden koko: flex-grow, flex-shrink ja flex-basis
Yksittäisen alkion laajenemiseen ja kutistumiseen vaikutetaan kolmella ominaisuudella.
| Ominaisuus | Merkitys | Oletus |
|---|---|---|
flex-grow |
Kuinka suuren osuuden ylijäävästä tilasta alkio saa. Arvo 0 tarkoittaa, ettei alkio laajene lainkaan | 0 |
flex-shrink |
Kuinka herkästi alkio kutistuu, kun tila loppuu. Arvo 0 estää kutistumisen | 1 |
flex-basis |
Alkion perusleveys ennen laajentamista ja kutistamista. Ylimäärittelee
width-ominaisuuden pääakselin suunnassa. Arvo auto
käyttää elementin omaa width-arvoa |
auto |
Useimmiten nämä kolme kirjoitetaan yhteen
flex-lyhennemerkinnällä,
jonka arvot ovat järjestyksessä flex-grow, flex-shrink ja
flex-basis:
.alkio {
flex: 0 1 auto; /* oletus: ei laajene, kutistuu, perusleveys width-arvosta */
flex: initial; /* sama kuin 0 1 auto */
flex: auto; /* sama kuin 1 1 auto: laajenee ja kutistuu */
flex: none; /* sama kuin 0 0 auto: ei laajene eikä kutistu */
flex: 1; /* sama kuin 1 1 0: kaikki alkiot jakavat tilan tasan */
}
flex: 1 on se, jota tarvitset useimmin
Kun annat kaikille alkioille arvon flex: 1, ne jakavat käytettävissä
olevan tilan tasan sisällön määrästä riippumatta. Jos yhden pitää olla kaksi kertaa
leveämpi, anna sille flex: 2.
.container {
display: flex;
gap: 1em;
}
.sivupalkki { flex: 1; }
.sisalto { flex: 3; }
flex-shrink on 1?
Flex-alkion oletusarvo on min-width: auto, mikä estää sitä
kutistumasta sisältönsä vähimmäisleveyttä pienemmäksi. Pitkä sana tai leveä taulukko
aiheuttaa siksi ylivuodon, vaikka kaikki muu näyttäisi oikealta. Korjaus on antaa
alkiolle min-width: 0.
.alkio {
flex: 1;
min-width: 0;
}
6.4 Flexbox-esimerkki 2
6.5 Flexbox-esimerkki 3
6.6 Tasaus ja keskitys flexboxissa
Alkioiden tasaus poikkiakselin suunnassa tapahtuu
align-items-ominaisuudella:
| Arvo | Merkitys |
|---|---|
stretch | Venyttää alkiot äitielementin korkeuteen. Oletus |
flex-start | Tasaa alkuun eli ylös, jos flex-direction on row |
flex-end | Tasaa loppuun |
center | Keskittää |
baseline | Tasaa tekstin perusviivan mukaan |
Yksittäinen alkio voi ylimääritellä oman tasauksensa poikkiakselin suunnassa
align-self-ominaisuudella. Sen arvot ovat samat kuin
align-items-ominaisuudella, ja lisäksi auto, joka on
oletus ja tarkoittaa säiliön arvon perimistä.
Alkioiden tasaus pääakselin suunnassa tapahtuu
justify-content-ominaisuudella. Käytettävissä ovat samat
flex-start, flex-end ja center kuin edellä,
sekä lisäksi kolme tilanjakoarvoa:
| Arvo | Merkitys |
|---|---|
space-between | Jakaa tyhjän tilan tasan alkioiden väleihin, muttei jätä tilaa kumpaankaan päähän |
space-around | Tasaa saman määrän tyhjää kaikkien alkioiden sivuille, jolloin alussa ja lopussa on puolet vähemmän kuin alkioiden välissä |
space-evenly | Kuten edellinen, mutta alussa ja lopussa on sama määrä tilaa kuin alkioiden välissä |
6.7 Flexbox-esimerkki 4
Lisätietoa: Aligning items in a flex container (MDN).
6.8 Flexboxiin liittyvät CSS-ominaisuudet
| Ominaisuus | Asetetaan | Merkitys |
|---|---|---|
display: flex | Säiliöön | Tekee elementistä flex-säiliön |
flex-direction | Säiliöön | Pääakselin suunta: riveittäin vai sarakkeittain, ja kumpaan suuntaan |
flex-wrap | Säiliöön | Rivitetäänkö vai tungetaanko kaikki peräkkäin |
gap | Säiliöön | Alkioiden väli |
justify-content | Säiliöön | Tasaus pääakselin suunnassa |
align-items | Säiliöön | Tasaus poikkiakselin suunnassa |
flex | Alkioon | Lyhennemerkintä ominaisuuksille flex-grow, flex-shrink ja flex-basis |
align-self | Alkioon | Yksittäisen alkion tasaus poikkiakselin suunnassa |
order | Alkioon | Alkioiden esitysjärjestys |
Voit harjoitella flexboxia Flexbox Froggy -pelillä.
7. CSS-ruudukko (grid)
Gridillä voi määritellä sivulle tai sen osaan ruudukon, jonka eri ruutuihin voi sijoittaa haluttuja lohkoja. Ruudukko koostuu riveistä ja sarakkeista.
grid-template-columnsasettaa sarakkeiden lukumäärän ja leveyden,grid-template-rowsvastaavasti rivit.- Grid tuntee oman
fr-yksikön.1frtarkoittaa yhtä joustavaa osuutta käytettävissä olevasta tilasta, ja2fron kaksi kertaa leveämpi kuin1fr. gapasettaa ruutujen välit. Erikseencolumn-gapjarow-gap.- Grid säätää rivien ja sarakkeiden koon automaattisesti sisällön mukaan. Koon voi
määrätä itse ominaisuuksilla
grid-auto-rowsjagrid-auto-columns.
.ruudukko {
display: grid;
grid-template-columns: 1fr 3fr; /* kaksi saraketta suhteessa 1:3 */
gap: 1em;
}
7.1 Itsestään mukautuva ruudukko
Yhdistelmä repeat(), auto-fit ja minmax() on
gridin hyödyllisin yksittäinen rakenne. Se sovittaa sarakkeiden määrän tilan mukaan
ilman yhtäkään mediakyselyä:
.galleria {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15em, 1fr));
gap: 1em;
}
Sääntö tarkoittaa: tee niin monta saraketta kuin mahtuu, kunkin vähimmäisleveys on 15 em, ja jaa ylijäävä tila sarakkeiden kesken tasan. Kapealla näytöllä sarakkeita on yksi, leveällä niitä on useita.
7.2 Ruutujen nimeäminen
Suositeltavin tapa sijoittaa lohkot ruudukkoon on nimetä alueet
grid-template-areas-ominaisuudella ja sijoittaa lohkot nimien perusteella.
Näin tyylitiedostosta näkee yhdellä silmäyksellä, miltä sivu näyttää.
.sivu {
display: grid;
grid-template-columns: 12em 1fr;
grid-template-areas:
"otsake otsake"
"valikko sisalto"
"alatunniste alatunniste";
gap: 1em;
}
header { grid-area: otsake; }
nav { grid-area: valikko; }
main { grid-area: sisalto; }
footer { grid-area: alatunniste; }
Yksittäisiä lohkoja voi sijoittaa myös ruutunumeroilla ominaisuuksilla
grid-column ja grid-row, esimerkiksi
grid-column: 1 / 3 ulottaa lohkon ensimmäisestä viivasta kolmanteen eli
kahden sarakkeen yli.
Gridillä tehdään kaksiulotteinen rakenne, jossa on sekä rivejä että sarakkeita. Flexbox sopii yksiulotteiseen: yhteen riviin tai yhteen sarakkeeseen. Tavallinen ratkaisu on tehdä sivun päälayout gridillä ja yksittäisten osien sisältö flexboxilla.
Alkioiden tasaus ruuduissaan tapahtuu ominaisuuksilla justify-items
ja align-items, tai molemmat kerralla lyhenteellä
place-items.
7.3 Grid-esimerkki
Voit harjoitella gridiä Grid Garden -pelillä.
8. Keskittäminen
Keskittäminen vaatii erilaisia toteutustapoja sen mukaan, millaista sisältöä keskitetään. Yleisimmät tavat on käyty läpi MDN:n dokumentissa Box alignment.
8.1 Yleiskäyttöiset tavat
Nämä kaksi keskittävät sisällön sekä vaaka- että pystysuunnassa:
.keskitys {
display: grid;
place-items: center;
}
.keskitys2 {
display: flex;
align-items: center; /* pystysuunnassa */
justify-content: center; /* vaakasuunnassa */
}
flex-direction-arvoa
Vanhoissa ohjeissa näkee flex-keskityksessä rivin
flex-direction: center. Sellaista arvoa ei ole olemassa:
flex-direction hyväksyy vain arvot row,
row-reverse, column ja column-reverse. Rivi
hylätään kokonaan, eikä sitä tarvita: keskitys syntyy kahdesta muusta
määrityksestä.
Pelkkä vaakakeskitys onnistuu yksinkertaisemmin, kun lohkolla on leveys:
.lohko {
max-width: 40em;
margin-left: auto;
margin-right: auto;
}
8.2 Sisällön mittainen lohko
Tavallinen ongelma on saada keskitettyä kuvateksti tai muu sisältö, joka ei täytä
koko lohkon leveyttä. Lohkon, jonka display-tyyppi on
block, leveys on oletuksena kaikki käytettävissä oleva tila. Jos
elementin esitystavaksi vaihdetaan display: inline-block, se käyttäytyy
sisäisesti kuin lohko mutta asemoituu kuten tekstitason elementti, jolloin sen koko
määräytyy sisällön mukaan.
<figure class="inlineblock">
<img src="hamahakki.jpg" alt="Hämähäkki rinkan kankaalla" />
<figcaption>Hämähäkki</figcaption>
</figure>
.inlineblock {
display: inline-block;
text-align: center;
}
Sama onnistuu nykyään myös arvolla width: fit-content, jolloin
elementti pysyy lohkona.
text-align asetetaan lohkoon
text-align vaikuttaa lohkon sisällä olevaan tekstiin, joten se
asetetaan lohkoon (block tai inline-block). Jos yrität
asettaa sen esimerkiksi strong-elementille, joka on tekstitason
elementti, mitään ei tapahdu.
8.3 Keskitysesimerkki
Lisätietoa: Center an element (MDN) ja Centering in CSS: A Complete Guide.
9. Transformointi
transform-ominaisuudella elementtiä voi siirtää, kääntää, vääntää,
suurentaa ja pienentää. transform-origin asettaa pisteen, jonka suhteen
muunnokset tehdään; oletus on elementin keskipiste.
| Funktio | Merkitys |
|---|---|
rotate() | Kiertää elementtiä kaksiulotteisesti, esimerkiksi rotate(15deg) |
rotateX(), rotateY() | Kiertää X- tai Y-akselin ympäri |
scale() | Skaalaa elementin kokoa, esimerkiksi scale(1.5) |
translate() | Siirtää elementtiä vaaka- ja pystysuunnassa |
translateX(), translateY() | Siirtää vain toiseen suuntaan |
skew() | Vääntää elementtiä |
Muunnettu elementti vie edelleen alkuperäisen tilansa, vaikka se näyttää siirtyneen. Muut elementit eivät siis siirry sen tieltä, ja muunnettu elementti voi peittää niitä. Tämä on tarkoituksellista: siksi muunnokset ovat nopeita eivätkä aiheuta koko sivun uudelleenlaskentaa.
Jos elementillä on transform-määritys, sen sisällä oleva
position: fixed suhteutuu siihen eikä
näkymäikkunaan. Sama koskee ominaisuuksia filter ja
perspective. Tämä on yleinen syy siihen, miksi kiinnitetty valikko
lakkaa yhtäkkiä toimimasta.
Jos animoit muunnoksia, kirjoita animaatio
prefers-reduced-motion: no-preference -kyselyn sisään. Katso
mediatyyppiluennon
luku 3.2.
9.1 Transform-esimerkki
Lisätietoa: Using CSS transforms (MDN).
10. CSS-sarakkeet (columns)
CSS:llä on erittäin helppo toteuttaa sanomalehtityyppisiä sarakkeita, joissa teksti
jatkuu sarakkeesta toiseen. Käytä column-count-ominaisuutta, jos tiedät
montako saraketta haluat, tai column-width-ominaisuutta, jos tiedät kuinka
leveitä sarakkeita haluat. Selain tekee automaattisesti sopivan määrän tai sopivan
levyisiä sarakkeita.
Tällä tavalla ei voi määrätä, mikä elementti tulee mihinkin sarakkeeseen. Jos tarvitset sitä, käytä gridiä.
| Ominaisuus | Merkitys |
|---|---|
column-count | Sarakkeiden lukumäärä |
column-width | Sarakkeen tavoiteleveys |
column-gap | Sarakkeiden väli |
column-rule | Sarakkeiden välissä oleva viiva. Sama merkintätapa kuin border-ominaisuudella |
column-span | Arvolla all lohko laajenee kaikkien sarakkeiden yli. Muita vaihtoehtoja ei ole, eli lohkoa ei voi laajentaa vain osan sarakkeista yli |
break-inside | Arvolla avoid estetään lohkon jakautuminen kahdelle sarakkeelle |
Sarakkeet toimivat hyvin paperilla mutta huonosti näytöllä, jos sarake on
korkeampi kuin näkymäikkuna: lukijan on vieritettävä alas ja takaisin ylös jokaisen
sarakkeen kohdalla. Käytä sarakkeita vain lyhyeen sisältöön, tai rajaa ne leveälle
näytölle column-width-ominaisuudella.
10.1 Sarake-esimerkki
11. Asemointi position-ominaisuudella
position-ominaisuudella määritellään, kuinka elementti sijoittuu
sivulle. Käytä sitä vain erikoistapauksissa. Useimmiten on parempi
käyttää flexboxia, gridiä tai
floatia.
| Arvo | Merkitys |
|---|---|
static | Normaali sijoittuminen. Oletus. top, left, right ja bottom eivät vaikuta |
relative | Sijoittuminen suhteessa elementin omaan normaaliin paikkaan |
absolute | Sijoittuminen suhteessa lähimpään asemoituun esi-isään |
fixed | Sijoittuminen suhteessa näkymäikkunaan. Ei vieri sisällön mukana |
sticky | Kuten relative, kunnes vieritys saavuttaa annetun rajan, jonka jälkeen elementti käyttäytyy kuin fixed |
Sijainti annetaan ominaisuuksilla top, bottom,
left ja right, jotka kertovat etäisyyden kustakin reunasta.
z-index-ominaisuudella määritellään, mikä elementti on päällimmäisenä.
11.1 Absoluuttinen asemointi (absolute)
Absoluuttisessa asemoinnissa elementti sijoitetaan top-,
left-, right- ja bottom-ominaisuuksilla
välittämättä normaalista sijainnistaan. Se ei myöskään vie tilaa muilta elementeiltä.
Elementti vierii dokumentin sisällön mukana.
Elementti sijoittuu suhteessa lähimpään esi-isään, jonka
position on jokin muu kuin static. Kelvollisia
ankkureita ovat siis relative, absolute,
fixed ja sticky. Jos sellaista esi-isää ei ole, elementti
suhteutuu koko dokumenttiin.
Käytännössä ankkuri tehdään lähes aina antamalla äitilohkolle
position: relative ilman koordinaatteja. Se ei siirrä äitilohkoa
mihinkään mutta tekee siitä asemoidun.
.aitilohko {
position: relative; /* tekee ankkurin, ei siirrä mitään */
}
.vasenylanurkka {
position: absolute;
top: 10%;
left: 10%;
width: 30%;
}
11.2 Kiinnitetty asemointi (fixed)
Kiinnitetyssä asemoinnissa elementti sijoitetaan suhteessa näkymäikkunaan, eikä se vieri dokumentin sisällön mukana. Paljon tilaa vieviä lohkoja ei yleensä kannata kiinnittää, koska ne vievät tilaa sivun muulta sisällöltä — erityisesti kapealla näytöllä.
.vasenylanurkka {
position: fixed;
top: 10%;
left: 10%;
width: 30%;
}
Jos jollakin esi-isällä on transform, filter tai
perspective, fixed-elementti suhteutuu siihen eikä
näkymäikkunaan, ja alkaa vieriä sisällön mukana. Katso
luku 9.
11.3 Suhteellinen asemointi (relative)
Suhteellisessa asemoinnissa elementti siirretään top-,
left-, right- ja bottom-ominaisuuksilla
suhteessa sen omaan normaaliin sijaintiin. Elementti vie edelleen
alkuperäisen tilansa, eivätkä muut elementit siirry sen tieltä.
.ylos {
position: relative;
top: -1em;
}
11.4 Tarttuva asemointi (sticky)
sticky yhdistää kaksi edellistä: elementti on normaalilla paikallaan,
kunnes vieritys saavuttaa annetun rajan, jonka jälkeen se jää siihen kiinni. Tavallisin
käyttö on kiinnittyvä otsikko tai taulukon otsikkorivi.
thead th {
position: sticky;
top: 0; /* raja on pakollinen, muuten mitään ei tapahdu */
background-color: #ffffff;
}
Kaksi asiaa kannattaa muistaa. Vähintään yksi rajoista
(top, bottom, left tai right)
on annettava, muuten elementti käyttäytyy kuin
relative. Ja elementti pysyy kiinni vain oman äitielementtinsä alueella:
kun äiti vierii pois näkyvistä, myös tarttuva elementti lähtee mukana.
11.5 Asemointi z-suunnassa
z-index-ominaisuudella määritellään elementin taso. Mitä suurempi
arvo, sitä lähempänä elementti on käyttäjää. Negatiivinen arvo vie elementin taakse.
z-index ei vaadi position-määritystä
Vanhoissa ohjeissa sanotaan, että z-index toimii vain asemoitujen
elementtien kanssa. Se toimii nykyään myös flex- ja
grid-alkioissa ilman position-arvoa.
Muissa tapauksissa elementille on annettava jokin muu kuin
position: static; tavallisesti relative ilman
koordinaatteja riittää.
11.6 Position-esimerkki
Lisätietoa: position (MDN).
12. Asemoinnin suunnittelu
CSS antaa useita erilaisia mahdollisuuksia WWW-sivujen visuaaliseen muotoilemiseen. Käytetystä tavasta huolimatta sivu kannattaa suunnitella seuraavan ohjeistuksen mukaan.
- Mieti sivun eri osien (navigointi, koristeet, sisältö) paikat tarkkaan.
- Jaa sivun rakenne loogisiin lohkoihin. Rakenne voi olla esimerkiksi tällainen:
- yläreunassa lohko perusnavigoinnille ja ylätunnistetiedoille;
- vasemmassa reunassa tarkempi linkkilista asiakirjan sisältöön;
- oikeassa reunassa sivun varsinainen sisältö.
- Sijoita sivun pääsisältö ensimmäiseksi html-tiedostoon, jos suinkin mahdollista. Tämä ratkaisee samalla sen, missä järjestyksessä ruudunlukija lukee sivun ja mihin sarkain siirtyy ensin.
- Merkitse lohkot
header-,nav-,main- jafooter-elementeillä, ja käytädiv-elementtiä vasta kun merkityksellistä elementtiä ei löydy. Katso HTML5-luennon luku 7. - Tee päälayout gridillä tai flexboxilla, jos layout tarvitsee useita eri osille sivua sijoitettavia alueita.
- Jollain tavalla asemoidun lohkon sisällön asemointiin voi käyttää mitä tahansa asemointitapaa. Sivun päälayout voidaan esimerkiksi määritellä gridillä, navigointilohkon sisällä käyttää flexboxia ja pääsisällössä floatia.
- Käytä
position-ominaisuutta vain, jos mikään muu tapa ei toimi. - Tarkista lopuksi, miten layout käyttäytyy kapealla näytöllä. Katso mediatyyppien ja mediakyselyjen luento.
Nopein tapa varmistaa, että rakenne ja lukujärjestys ovat kunnossa, on katsoa sivua ilman tyylitiedostoa. Jos sisältö on silloin luettavassa järjestyksessä, se on sitä myös ruudunlukijalla riippumatta siitä, mihin CSS on sen siirtänyt.
13. Lisätietoa
- MDN: CSS layout, laaja oppimateriaali harjoituksineen.
- A Complete Guide to Flexbox ja A Complete Guide to Grid.
- Flexbox Froggy ja Grid Garden, harjoituspelit.
- MDN: CSS layout cookbook, valmiita ratkaisuja tavallisiin asetteluihin.
- Kurssin CSS-luento ja mediatyyppien luento.
Käyttäjien kommentit