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
Implemente os blocos descritos e verifique por medição que a largura dos elementos será realmente igual à que calculamos.
Calcule a largura dos blocos e depois verifique os cálculos por medição:
<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;
}
Calcule a largura dos blocos e depois verifique os cálculos por medição:
<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;
}
Calcule a largura dos blocos e depois verifique os cálculos por medição:
<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;
}