Flex-elementtien kutistumisen säätely CSS:ssä
Oletusarvoisesti kaikilta elementeiltä leikataan
paloja suhteessa elementin leveyteen.
Kuitenkin voidaan tehdä niin, että joistakin
elementeistä leikataan suurempia tai pienempiä
paloja. Tätä varten on olemassa erityinen ominaisuus
flex-shrink.
Tämä ominaisuus edustaa tiettyä
painokerrointa, jolla elementin leveyttä kerrotaan
leikattavan palan laskemisessa jo
esitetyn kaavan mukaisesti. Esimerkiksi, jos
elementin leveys on 200px, ja sen
flex-shrink on 3, niin painotettu
(eli painokertoimella kerrottu) elementin leveys
on:
200px * 3 = 600px
Kaava flex-shrink huomioiden on
seuraavanlainen: neg. vapaa tila
* (painotettu elementin leveys / kaikkien
elementtien painotettujen leveyksien summa).
Katsotaanpa esimerkkiä. Oletetaan, että meillä
on 4 elementtiä. Oletetaan, että ensimmäisen
elementin leveys on 400px, ja flex-shrink
on 2, muiden elementtien leveys
- 200px, ja niiden flex-shrink on
1. Oletetaan, että vanhemman leveys on 900px.
Elementtien yhteenlaskettu leveys on:
400px + 3 * 200px = 1000px
Negatiivinen vapaa tila on:
1000px - 900px = 100px
Elementtien yhteenlaskettu painotettu leveys on:
400px * 2 + 200px * 1 + 200px * 1 + 200px * 1 = 1400px
Ensimmäisen elementin painotettu leveys on:
400px * 2 = 800px
Ensimmäiseltä elementiltä leikataan seuraava pala:
100px * (800px / 1400px) = 100px * 0.57 = 57.14px
Elementin leveys on:
400px - 57.14px = 342.86px ~ 343px
Muiden kunkin elementin painotettu leveys on:
200px * 1 = 200px
Jokaiselta elementiltä leikataan seuraava pala:
100px * (200px / 1400px) = 100px * 0.142 = 14.2px
Elementin leveys on:
200px - 14.2px = 185.8px ~ 186px
Toteuta kuvatut lohkot ja tarkista mittauksella, että elementtien leveys todella vastaa laskemaamme arvoa.
Laske lohkojen leveydet ja tarkista sitten laskelmat mittauksella:
<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: 200px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 100px;
flex-shrink: 2;
}
.elem2 {
width: 100px;
flex-shrink: 1;
}
.elem3 {
width: 100px;
flex-shrink: 1;
}
Laske lohkojen leveydet ja tarkista sitten laskelmat mittauksella:
<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: 200px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 100px;
flex-shrink: 3;
}
.elem2 {
width: 100px;
flex-shrink: 2;
}
.elem3 {
width: 100px;
flex-shrink: 1;
}
Laske lohkojen leveydet ja tarkista sitten laskelmat mittauksella:
<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: 500px;
height: 200px;
border: 1px solid red;
}
.child {
height: 50px;
border: 1px solid green;
}
.elem1 {
width: 300px;
flex-shrink: 3;
}
.elem2 {
width: 200px;
flex-shrink: 2;
}
.elem3 {
width: 200px;
flex-shrink: 1;
}
.elem4 {
width: 200px;
flex-shrink: 1;
}