Flex-elementtien ahneus CSS:ssä
Oletetaan, että meillä on kaksi flex-lohkoa,
joita on rivitetty peräkkäin. Näille lohkoille on asetettu leveys
100px, ja niiden vanhemmalle - 300px:
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
</div>
.parent {
display: flex;
width: 300px;
height: 200px;
border: 1px solid red;
}
.child {
width: 100px;
height: 100px;
border: 1px solid green;
}
:
Kuten näet, elementtiemme kokonaisleveys on pienempi kuin vanhemman leveys, joten oikealle jää tyhjää tilaa.
Halutessa tämä tyhjä tila voidaan
jakaa suhteellisesti elementtiemme kesken.
Tämä tehdään käyttämällä ominaisuutta flex-grow,
joka asetetaan flex-elementeille. Tämän ominaisuuden
arvona on dimensioton numero.
Katsotaan käytännössä, miten tämä ominaisuus toimii.
Esimerkki
Nyt meillä on kaksi flex-lohkoa, joiden leveys on
100px. Niiden kokonaisleveys on
200px, ja vanhemman leveys - 300px.
Saadaan, että jäljelle jää vapaa tila
100px.
Jos elementeille ei ole asetettu flex-grow,
niin näemme vain tämän vapaan tilan.
Jos se on asetettu, niin elementtien todellinen leveys
tulee olemaan suurempi kuin asetettu - ne jakavat vapaan tilan
suhteellisesti
keskenään ja lisäävät sen omaan leveyteensä.
Olkoon esimerkiksi ensimmäisen elementin flex-grow
yhtä suuri kuin 1, ja toisen - 3. Lasketaanpa,
minkä osan vapaasta tilasta
kukin elementti saa.
Aluksi on saatava kaikkien elementtiemme
flex-grow-yksiköiden kokonaismäärä.
Ensimmäisen elementin arvo on 1, ja
toisen - 3. Tämä tarkoittaa, että yhteensä
se on 4.
Jaetaan nyt 100px vapaata tilaa
4:llä ja saadaan, että 25px kohdistuu
yhteen flex-grow-yksikköön. Saadaan,
että ensimmäiseen elementtiin lisätään yksi yksikkö
flex-grow, eli 25px, ja
toiseen - kolme yksikköä, eli
75px.
Ensimmäisen elementin leveys tulee olemaan 125px,
ja toisen - 175px:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.parent {
display: flex;
width: 300px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 100px;
flex-grow: 1;
}
.elem2 {
width: 100px;
flex-grow: 3;
}
:
Esimerkki
Olkoon nyt vanhemman leveys yhtä suuri kuin 400px,
ensimmäisen elementin leveys 200px, ja toisen elementin leveys - 100px. Saadaan,
että vapaa tila on jälleen
yhtä suuri kuin 100px.
Asetetaan jokaiselle elementille flex-grow,
yhtä suuri kuin 1. Yhteensä saadaan 2,
eli 100px vapaata tilaa
on jaettava 2:lla. Saadaan, että
50px kohdistuu yhteen
ahneusyksikköön.
Koska kaikilla elementeillä on sama arvo
flex-grow, niin kaikkiin elementteihin lisätään
sama arvo, 50px. Tämä tarkoittaa,
että ensimmäinen elementistä tulee 250px, ja
toinen tulee 150px:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.parent {
display: flex;
width: 400px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 200px;
flex-grow: 1;
}
.elem2 {
width: 100px;
flex-grow: 1;
}
:
Esimerkki
Olkoon jälleen vanhemman leveys yhtä suuri kuin 400px,
ensimmäisen elementin leveys 200px, ja toisen elementin leveys - 100px.
Asetetaan nyt ensimmäiselle elementille
flex-grow arvoksi 3, ja toiselle
- arvoksi 1. Saadaan, että ahneus
yhteensä on 4. Silloin yksi ahneusyksikkö
on yhtä suuri kuin .
100px / 4 = 25px
Ensimmäiseen elementtiin lisätään 75px,
ja siitä tulee 275px, ja toiseen -
25px, siitä tulee 125px:
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
</div>
.parent {
display: flex;
width: 400px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 200px;
flex-grow: 3;
}
.elem2 {
width: 100px;
flex-grow: 1;
}
:
Käytännön tehtävät
Kaikissa alla olevissa tehtävissä sinulle esitetään
koodi, jossa on flex-elementtejä, joilla on
leveys ja flex-grow. Esitetyn
koodin perusteella laske, mitkä mitat kullakin
elementeistä on. Suorita sitten koodi
ja tarkista laskelmat mittaamalla elementtien todelliset
leveydet.
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.parent {
display: flex;
width: 500px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 200px;
flex-grow: 3;
}
.elem2 {
width: 100px;
flex-grow: 1;
}
.elem3 {
width: 100px;
flex-grow: 1;
}
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.parent {
display: flex;
width: 700px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 100px;
flex-grow: 1;
}
.elem2 {
width: 100px;
flex-grow: 2;
}
.elem3 {
width: 200px;
flex-grow: 3;
}
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
</div>
.parent {
display: flex;
width: 500px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 100px;
flex-grow: 1;
}
.elem2 {
width: 100px;
flex-grow: 1;
}
.elem3 {
width: 100px;
flex-grow: 1;
}
<div class="parent">
<div class="child elem1">1</div>
<div class="child elem2">2</div>
<div class="child elem3">3</div>
<div class="child elem4">4</div>
</div>
.parent {
display: flex;
width: 1000px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 200px;
flex-grow: 1;
}
.elem2 {
width: 100px;
flex-grow: 2;
}
.elem3 {
width: 100px;
flex-grow: 4;
}
.elem4 {
width: 100px;
flex-grow: 3;
}