Se há algo em que o flexbox é excelente, são os layouts de doze colunas. Em um layout de doze colunas, a página é dividida em doze colunas invisíveis. Essas colunas têm pequenas quantidades de espaço entre elas, chamadas de calhas. A página é dividida em linhas, e os contêineres nas linhas ocupam um determinado número de colunas.

Uma grade de doze colunas com colunas e calhas

Se o senhor começar a procurar por eles, verá layouts de doze colunas em toda parte. Dê uma olhada nessas páginas de destino de Heroku, ChowNow e Quadrado. Percebeu como as seções são divididas em metades, terços e quartos?

Exemplos de layouts de doze colunas do Heroku, ChowNow e Square

Neste artigo, mostrarei aos senhores como usar a função flexbox do flex-grow, flex-shrink e flex-basis para criar layouts de doze colunas, sem a necessidade de uma biblioteca!

Este artigo é um extrato de Desvendando o Flexbox, um livro e uma série de vídeos sobre a criação de layouts flexbox para o mundo real. Se você gostou deste post, dê uma olhada em a série completa e assine a Curso gratuito de Flexbox para iniciantes.

Configuração do contêiner

Digamos que o senhor queira que cada um dos <div> no HTML a seguir ocupe um terço do espaço do <section>.

<section>
  <div class="column">First</div>
  <div class="column">Second</div>
  <div class="column">Third</div>
</section>


Por padrão, o <section> ocupa 100% da largura da tela. Comece limitando sua largura a 740 pixels. Enquanto o senhor faz isso, adicione também algum espaço ao redor das colunas.

section {
  max-width: 740px;
  margin: 0 auto;
}

.column {
  margin: 10px;
}


Abra os exemplos de código e tente arrastar a janela do navegador até que ela fique menor que 740 pixels. Observe como o <section> fica menor à medida que a tela diminui, mas permanece fixo quando a tela é maior que 740 pixels?

Flexin’ It Up

Faça o <section> um contêiner flexível, definindo seu display para flex.

section {
  max-width: 740px;
  margin: 0 auto;
  display: flex;
}


Por padrão, o flexbox define as larguras das colunas de acordo com o tamanho de seu conteúdo. O senhor pode alterar esse comportamento usando o parâmetro flex-grow e flex-shrink propriedades.

O flex-grow informa ao flexbox como fazer o item crescer para ocupar espaço adicional, se necessário. flex-shrink informa ao flexbox como reduzir quando necessário. Como queremos que as colunas se comportem da mesma forma ao crescer e encolher, defina essas duas propriedades como 1.

.column {
  margin: 10px;
  flex-grow: 1;
  flex-shrink: 1;
}


Uau! O contêiner flexbox agora preenche três colunas. Os valores para flex-grow e flex-shrink são proporcionalou seja, elas mudam em relação a outros itens no contêiner flexível. O Flexbox soma os valores das propriedades e, em seguida, divide o valor de cada coluna por essa soma. Assim, cada coluna ocupa 1 ÷ (1 + 1 + 1), ou ⅓ do espaço total.

O que acontecerá se uma das colunas tiver um valor diferente?

.column:first-of-type {
  flex-grow: 2;
  flex-shrink: 2;
}


A primeira coluna ocupa a mesma quantidade de espaço que as outras duas. Isso ocorre porque os valores somam 4, portanto a primeira coluna é:

2 ÷ (2 + 1 + 1) = ½


Os outros dois são:

1 ÷ (2 + 1 + 1) = ¼


Tudo sobre essa base

Se o senhor observar atentamente o último exemplo, verá que a primeira coluna não cobre nem a metade do contêiner. Se o senhor adicionar mais conteúdo à terceira coluna, poderá realmente ver o problema.

<section>
  <div class="column">First</div>
  <div class="column">Second</div>
  <div class="column">
    The third column, with more content than
    before!
  </div>
</section>


O que está acontecendo? Por que o flexbox não está flexionando corretamente?

Acontece que o flexbox não distribui o espaço uniformemente para cada coluna. Ele calcula quanto espaço cada coluna tem. começa com, especificado pelo flex-basis propriedade. Então, o restantes restante é distribuído usando o flex-grow e flex-shrink propriedades.

Isso pode parecer confuso, e é porque é mesmo. A forma como essas coisas se somam é a seguinte muito complicadomas não se preocupe, o senhor não precisa entender as nuances para usar o flexbox.

Como não nos importamos com a quantidade de espaço que o conteúdo ocupa originalmente, defina flex-basis para 0.

.column {
  margin: 10px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}

.column:first-of-type {
  flex-grow: 2;
  flex-shrink: 2;
  flex-basis: 0;
}


Tah-dah! Está funcionando! Bem, mais ou menos – há uma última coisa a ser corrigida.

Mais Flex Basis

Se o senhor adicionar outra seção abaixo da primeira, poderá ver o problema.

<section>
  <div class="column">First</div>
  <div class="column">Second</div>
  <div class="column">Third</div>
</section>
<section>
  <div class="column">First</div>
  <div class="column">Second</div>
  <div class="column">Third</div>
  <div class="column">Fourth</div>
</section>


.column {
  margin: 10px;
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}

section:first-of-type .column:first-of-type {
  flex-grow: 2;
  flex-shrink: 2;
  flex-basis: 0;
}


Por que as colunas não se alinham? Isso ocorre porque o flexbox inclui o preenchimento, a borda e a margem na base quando calcula o tamanho do item.

A primeira e a segunda colunas da segunda linha têm 22 pixels entre elas (20 pixels para a sarjeta e 2 pixels para as bordas). Podemos adicionar esse espaço ausente à primeira coluna da primeira linha definindo flex-basis para 22px.

section:first-of-type .column:first-of-type {
  flex-grow: 2;
  flex-shrink: 2;
  flex-basis: 22px;
}



Taquigrafia

Juntos, flex-grow, flex-shrink e flex-basis formam a base do que torna o flexbox flexível. Como essas propriedades estão intimamente ligadas, há uma propriedade abreviada muito útil, flex, que permite que o senhor defina todas as três. O senhor pode usá-la da seguinte forma:

flex: <flex-grow> <flex-shrink> <flex-basis>;


Podemos reescrever nosso CSS da seguinte forma:

.column {
  flex: 1 1 0px;
}

section:first-of-type .column:first-of-type {
  flex: 2 2 22px;
}


Ahh, assim está melhor. Por que o 0px no primeiro flex declaração? Há um erro no Internet Explorer 10 e 11 que ignora a flex se a base não incluir uma unidade.


É isso aí!

O senhor cobriu uma tonelada de coisas excelentes neste artigo, incluindo flex-grow, flex-shrink e flex-basis. O senhor também viu como essas propriedades podem ser usadas para implementar layouts de doze colunas.

Se o senhor estiver procurando um desafio, tente terminar a grade inteira. Quando estiver pronto, consulte o CodePen abaixo para ver como isso foi feito.


Veja a caneta Exemplo de grade de 12 colunas Flexbox por Landon Schropp (@LandonSchropp) em CodePen.


Se o senhor ainda estiver confuso sobre como flex-grow, flex-shrink e flex-basis trabalho, não se preocupe. Essas propriedades são a coisa mais difícil de entender sobre o flexbox. O senhor as revisará novamente em lições posteriores, incluindo a próxima, na qual criará um layout de player de vídeo incrível! Para ter certeza de que entendeu, vá para a seção Curso gratuito para iniciantes em Flexbox e inscreva-se. Além disso, confira meu livro completo, Unraveling Flexboxpara ver a série completa.

Landon Schropp

Sobre Landon Schropp

Landon é um desenvolvedor, designer e empresário que mora em Kansas City. Ele é o autor do livro Desvendando o Flexbox. Ele é apaixonado por criar aplicativos simples que as pessoas adoram usar.