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:

html<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
</div>
css.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:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.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:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.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:

html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
</div>
css.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.

Задание 1
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.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;
}
Задание 2
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.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;
}
Задание 3
html<div class="parent">
  <div class="child elem1">1</div>
  <div class="child elem2">2</div>
  <div class="child elem3">3</div>
</div>
css.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;
}
Задание 4
html<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>
css.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;
}