Regulamento da compressão de blocos flex em CSS

Por padrão, pedaços são "beliscados" de todos os elementos, proporcionalmente à largura do elemento. No entanto, é possível fazer com que de alguns elementos sejam "beliscados" pedaços maiores ou menores. Para isso, existe uma propriedade especial flex-shrink.

Esta propriedade representa um certo peso, pelo qual a largura do elemento será multiplicada ao calcular o pedaço a ser "beliscado" pela fórmula já mencionada acima. Por exemplo, se a largura do elemento for 200px, e seu flex-shrink for 3, então a largura ponderada (ou seja, multiplicada pelo peso) do elemento será:

200px * 3 = 600px

A fórmula considerando o flex-shrink terá a seguinte aparência: espaço livre negativo * (largura ponderada do elemento / soma de todas as larguras ponderadas dos elementos).

Vamos ver um exemplo. Suponha que temos 4 elementos. Deixe a largura do primeiro elemento ser 400px, e o flex-shrink ser 2; a largura dos demais elementos - 200px, e seu flex-shrink ser 1. Deixe a largura do pai ser 900px.

A largura total dos elementos é:

400px + 3 * 200px = 1000px

O espaço livre negativo será:

1000px - 900px = 100px

A largura ponderada total dos elementos é:

400px * 2 + 200px * 1 + 200px * 1 + 200px * 1 = 1400px

A largura ponderada do primeiro elemento é:

400px * 2 = 800px

O seguinte pedaço será "beliscado" do primeiro elemento:

100px * (800px / 1400px) = 100px * 0.57 = 57.14px

A largura do elemento será:

400px - 57.14px = 342.86px ~ 343px

A largura ponderada de cada um dos outros elementos é:

200px * 1 = 200px

O seguinte pedaço será "beliscado" de cada elemento:

100px * (200px / 1400px) = 100px * 0.1428 = 14.28px ~ 14.2px

A largura do elemento será:

200px - 14.2px = 185.8px ~ 186px
Задание 1

Implemente os blocos descritos e verifique por medição que a largura dos elementos será realmente igual à que calculamos.

Задание 2

Calcule a largura dos blocos e depois verifique os cálculos por medição:

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: 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;
}
Задание 3

Calcule a largura dos blocos e depois verifique os cálculos por medição:

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: 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;
}
Задание 4

Calcule a largura dos blocos e depois verifique os cálculos por medição:

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: 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;
}