O poder de flex-grow em Flexbox

Conheça uma maneira de usar flex-grow, uma das propriedades de Flexbox, para a solução de um problema comum de front-end.

Já faz algum tempo desde o advento de Flexbox. Contudo, tanto para os que ainda não tiveram a oportunidade de estudo/uso da tecnologia, tanto para os que já usam, algumas questões de sua potencialidade podem passar despercebidas. Por exemplo, o uso de flex-grow.

Neste artigo, veja como é possível usar flex-grow para a resolução de um problema comum em desenvolvimento front-end e quais as vantagens do uso de Flexbox em comparação a outras tecnologias.

Criar um web site pode ser um desafio, especialmente quando parte (ou o todo) do conteúdo é dinâmico. Às vezes, é preciso adicionar ou remover conteúdo com base em inputs de quem usa o usa ou em outras condições.

Por exemplo:

Flex grow: 3 exemplos de layouts usando tecnologias diferentes

Aqui, tem-se a mesma janela e o objetivo a ser alcançado são botões uniformemente espaçados em uma seção da página — algo como uma barra de navegação ou algum outro bloco de conteúdo. Normalmente, uma maneira fácil de fazer isso é definir a largura em pixels de cada botão, como no primeiro exemplo. Se se sabe a largura máxima para a página, simplesmente mede-se os px necessários para cada botão.

Uma segunda opção, mostrada no exemplo 2, é com porcentagens. Com 3 botões em um cenário que ocupem a largura total, se a janela estivesse configurada para 100vw, seria possível definir cada botão com aproximadamente 33% de largura — também funcionaria se o contêiner/janela fosse definidos em pixels.

A terceira opção seria trabalhar com Flexbox usando as propriedades flex-basis e flex-grow. Se as dimensões estiverem definidas para 100px — ou qualquer que seja o caso –, é possível adicionar uma base flexível. Mantendo os diferentes contextos, flex-basis é semelhante a min-width: basicamente, 100px é a largura-base do conteúdo, mas, com o flexbox, essa largura será alterada dependendo do conteúdo adicional adicionado ou removido.

flex-basis e flex-grow são determinados em que “espaço negativo” está disponível no contêiner dos botões. Se houver 3 botões com larguras de 100px e flex-basis for 0, é possível definir a flex-grow para 1.5. Isto significa que, se qualquer um dos 3 botões for removido, os 2 restantes ajustarão sua largura para considerar o espaço extra usando 100px como base para suas larguras ajustadas.

Retirando um botão desse layout, o que usa flex-grow tem uma clara vantagem em manutenção.

Os elementos que usam px ou % permaneceriam os mesmos. Dependendo das configurações de alinhamento, o conteúdo poderia mudar para o meio da tela — e, é claro, a porcentagem de elementos definidos mudar se o container em que eles estão fosse definido pela largura da viewport –, mas a consistência de ambos os exemplos nem sempre seria ótima.

No terceiro caso, os elementos se ajustam com base no fator de crescimento 1.5. Se o valor de flex-grow fosse definido como 0, os elementos se comportariam exatamente como no primeiro exemplo e permaneceriam com 100px de largura — seria possível, também, alterar o crescimento flexível de cada componente individualmente. Se o primeiro elemento tivesse flex-grow: 1.2 e o segundo flex-grow: 1.7, quando o terceiro elemento fosse removido, o segundo seria maior que o primeiro, pois ocuparia mais espaço restante no tela.

E para casos em que se adicionam elementos?

Ao adicionar um botão, o layout que usou flex-grow continua com a vantagem no quesito manutenção.

No primeiro caso, um elemento adicional extrapolaria a janela/container. No caso de porcentagens, o caso ficaria ainda mais complicado. Como cada elemento quer pegar sua porcentagem de espaço, eles vão ou se sobrepor ou reagir como o primeiro caso, dependendo de quaisquer valores de z-index especificados. Em ambos os casos, o resultado é menos que desejável. Em nosso terceiro exemplo, o elemento adicional não cria nenhum problema, já que todos se acomodam dentro da nova realidade de espaço disponível.

Conclusão

Mesmo Flexbox já sendo uma tecnologia de uso amadurecido, do dia-a-dia, suas totais potencialidades certamente ainda não foram “reveladas”. Dicas e técnicas com propriedades isoladas da tecnologias, como é o caso de flex-grow, fazem parte deste quadro geral.

É imprescindível conhecer os conceitos e bases de uso da tecnologia, mas, certamente, a experiência e pesquisas sobre soluções criativas na comunidade ampliará sua percepção de uso e prática.

Use Flexbox!