Sobes.tech
Junior

Como funcionam as propriedades flex-grow e flex-shrink?

sobes.tech IA

Resposta da IA

O flex-grow determina até que ponto um elemento pode crescer na presença de espaço livre no contêiner. Um valor de 0 (padrão) significa que o elemento não crescerá. Valores positivos indicam um coeficiente de crescimento em relação a outros elementos flex na mesma linha.

flex-shrink determina até que ponto um elemento pode encolher em caso de falta de espaço livre no contêiner. Um valor de 1 (padrão) significa que pode encolher. Um valor de 0 impede a encolha. Valores positivos indicam um coeficiente de encolhimento em relação a outros elementos flex.

Vamos ver um exemplo:

<div class="container">
  <div class="item item-1">Item 1</div>
  <div class="item item-2">Item 2</div>
  <div class="item item-3">Item 3</div>
</div>
.container {
  display: flex;
  width: 400px; /* Largura do contêiner */
}

.item {
  flex-basis: 100px; /* Tamanho base de cada elemento */
  background-color: lightblue;
  margin: 5px;
}

.item-1 {
  flex-grow: 1; /* Vai ocupar 1 parte do espaço livre */
  flex-shrink: 0; /* Não vai encolher */
}

.item-2 {
  flex-grow: 2; /* Vai ocupar 2 partes do espaço livre */
  flex-shrink: 1; /* Pode encolher */
}

.item-3 {
  flex-grow: 1; /* Vai ocupar 1 parte do espaço livre */
  flex-shrink: 1; /* Pode encolher */
}

Neste caso, o tamanho base total dos elementos é de 300px (3 * 100px). O espaço livre é de 100px (400px - 300px). Este espaço será distribuído entre os elementos 1, 2 e 3 na proporção de seus flex-grow: 1 + 2 + 1 = 4. O elemento 1 receberá 1/4 * 100px = 25px de espaço adicional. O elemento 2 receberá 2/4 * 100px = 50px de espaço adicional. O elemento 3 receberá 1/4 * 100px = 25px de espaço adicional.

Se a largura do contêiner fosse insuficiente (por exemplo, 200px), seria necessário encolher. Em caso de falta de espaço para encolher, consideram-se flex-shrink e o tamanho dos elementos. O espaço que falta é distribuído para encolher entre os elementos cujo flex-shrink é maior que 0, proporcionalmente ao seu flex-shrink multiplicado pelo tamanho atual (após considerar flex-basis). O algoritmo de encolhimento é um pouco mais complexo, mas a ideia principal é que os elementos com maior flex-shrink ou maior tamanho atual encolherão mais.

É importante lembrar que flex-basis, flex-grow e flex-shrink são frequentemente usados juntos como a propriedade abreviada flex. Por exemplo, flex: 1 1 auto; é equivalente a flex-grow: 1; flex-shrink: 1; flex-basis: auto;.

Prioridade na distribuição do espaço:

  1. flex-basis: Define o tamanho inicial do elemento.
  2. flex-grow: Distribui o espaço livre positivo.
  3. flex-shrink: Distribui o espaço livre negativo (necessidade de encolhimento).