Caixa flexível , ou Flexbox em suma, é um conjunto de propriedades em CSS introduzido em 2009 para fornecer um sistema de layout novo e excepcional. O módulo Flexbox é identificado como parte da terceira versão do CSS (CSS3).
Você provavelmente já está usando muitas das novas propriedades em CSS3, como box-shadow
, border-radius
, gradientes de fundo , e assim por diante. No entanto, o Flexbox ainda não viu a ampla adoção que merece. Isso pode ser devido a todas as mudanças significativas que sofreu ao longo dos anos, ou porque é apenas parcialmente suportado no Internet Explorer 10, ou apenas porque o Flexbox é um ecossistema completo, enquanto os paradigmas anteriores foram predominantemente baseados em um único, pronto para ir propriedades.
É superpoderoso e oferece um amplo leque de opções para conseguir layouts que, antes, apenas se sonhavam.
Este artigo irá guiá-lo pelos fundamentos do Flexbox e como você pode usá-lo para obter alguns layouts realmente interessantes que, de outra forma, exigiriam hacks CSS complicados ou mesmo JavaScript.
Por padrão, os elementos de nível de bloco HTML empilham, então se você quiser alinhá-los em uma linha, você precisa contar com propriedades CSS como float
, ou manipular o display
propriedade com configurações de table-ish ou inline-block.
Se você optar por usar float
(esquerda ou direita), você deve limpe o invólucro em algum ponto para empurrá-lo até o último elemento flutuante, caso contrário, eles transbordarão de qualquer coisa que vier depois. No entanto, com float, você está limitado a organizar os elementos horizontalmente.
Alternativamente, ou além disso, você pode manipular o display
propriedade para tentar alcançar o layout que deseja! Mas isso muitas vezes parece confuso na melhor das hipóteses, para não mencionar tedioso, e muitas vezes resulta em um layout bastante frágil que não será necessariamente renderizado de forma consistente em todos os navegadores. Essa abordagem é particularmente ineficaz se você tem como alvo vários dispositivos de tamanhos variados - o que quase sempre é o caso hoje em dia.
Entre no Flexbox!
Com uma regra simples aplicada a um elemento pai, você pode controlar facilmente o comportamento do layout de todos os seus filhos.
Com o Flexbox, você pode:
Eu entendo que o Flexbox pode ser difícil no começo. Acho que é mais fácil aprender dez propriedades CSS não relacionadas do que cinco com alguma interdependência. No entanto, com suas habilidades atuais em CSS, e talvez com uma pequena ajuda deste artigo, você se lançará em um novo universo CSS.
display
é uma das propriedades mais básicas em CSS e é bastante importante no contexto do Flexbox, pois é usado para definir um flex wrapper.
Existem dois valores possíveis de flex wrapper: flex
e inline-flex
.
A diferença entre os dois é que a display: flex
wrapper atua como um elemento de bloco enquanto um display: inline-flex
wrapper atua como um bloco embutido. Além disso, inline-flex
os elementos aumentam se não houver espaço suficiente para conter os filhos. Mas, além dessas diferenças, o comportamento dos dois seria o mesmo.
Experimente o código de exemplo abaixo, reduza a largura da janela de visualização quando o inline-flex estiver ativo e ... role.
Veja a caneta Flexbox @ApeeScape - Pai - propriedade `display` por DD ( @Diegue ) em CodePen .
.wrapper inline-flex;
Agora que você viu a primeira amostra, pode inferir que o comportamento padrão é simplesmente criar uma linha dos elementos. Mas tem mais:
Dica: o
column
ecolumn-reverse
os valores podem ser usados para trocar os eixos, de modo que as propriedades que afetariam o eixo horizontal afetariam o eixo vertical.
Veja a caneta Flexbox @ApeeScape - Pai - propriedade `flex-direction` por DD ( @Diegue ) em CodePen .
.wrapper row-reverse
Se você verificar o primeiro exemplo de código, descobrirá que os elementos filho não são empilhados por padrão em um flex wrapper. É aqui que flex-wrap
entra em jogo:
flex-direction
)wrap
, mas o número de linhas (ou colunas) aumenta na direção oposta conforme os itens são agrupadosVeja a caneta Flexbox @ApeeScape - Pai - propriedade `flex-wrap` por DD ( @Diegue ) em CodePen .
.wrapper wrap-reverse;
Você pode combinar flex-direction
e flex-wrap
propriedades em uma única propriedade: flex-flow
.
.wrapper { flex-flow: {flex-direction} {flex-wrap}; }
Esta propriedade é usada para controlar o alinhamento horizontal dos elementos filhos:
text-align: left
)text-align: right
)text-align: center
)space-around
, exceto que os elementos serão separados pela mesma distância e haverá não espaço próximo a uma das bordas da embalagem.Nota: Lembre-se de
flex-direction
, quando definido comocolumn
oucolumn-reverse
, troca o eixo. Se um deles for definido,justify-content
afetará o alinhamento vertical, não horizontal.
Veja a caneta Flexbox @ApeeScape - Pai - propriedade `justify-content` por DD ( @Diegue ) em CodePen .
Esta propriedade é semelhante a justify-content
mas o contexto de seus efeitos são as linhas em vez do próprio invólucro:
Veja a caneta Flexbox @ApeeScape - Pai - propriedade `align-items` por DD ( @Diegue ) em CodePen .
Esta propriedade é semelhante a justify-content
e align-items
mas funciona no eixo vertical e o contexto é o wrapper inteiro (não a linha como no exemplo anterior). Para ver seus efeitos, você precisará de mais de uma linha:
space-around
, exceto que os elementos serão separados pela mesma distância e não haverá espaço nas bordas superior e inferior do wrapper.Veja a caneta Flexbox @ApeeScape - Pai - propriedade `align-content` por DD ( @Diegue ) em CodePen .
Esta propriedade define a proporção relativa do espaço disponível que o elemento deve usar. O valor deve ser um número inteiro, onde 0 é o padrão.
Digamos que você tenha dois elementos diferentes no mesmo pacote flexível. Se ambos tiverem um flex-grow
valor de 1, eles crescerão igualmente para compartilhar o espaço disponível. Mas se um a flex-grow
valor de 1 e o outro a flex-grow
valor de 2, conforme mostrado no exemplo abaixo, este com um flex-grow
o valor de 2 aumentará para ocupar o dobro de espaço do primeiro.
.wrapper .elements { flex-grow: 1; /* Default 0 */ } .wrapper .elements:first-child { flex-grow: 2; }
Veja a caneta Flexbox @ApeeScape - Crianças - propriedade `flex-grow` por DD ( @Diegue ) em CodePen .
Semelhante a flex-grow
, esta propriedade define se o elemento é “encolhível” ou não com um valor inteiro. Semelhante a flex-grow
, flex-shrink
especifica o fator de redução de um item flexível.
Veja a caneta Flexbox @ApeeScape - Crianças - propriedade `flex-shrink` por DD ( @Diegue ) em CodePen .
.wrapper .element { flex-shrink: 1; /* Default 0 */ }
Esta propriedade é usada para definir o tamanho inicial de um elemento antes que o espaço disponível seja distribuído e os elementos sejam ajustados de acordo.
Dica:
flex-basis
não suportacalc()
ebox-sizing: border-box
em todos os navegadores, então recomendo usarwidth
se você precisar usar um deles (observe que você também precisará definirflex-basis: auto;
).
Veja a caneta Flexbox @ApeeScape - Crianças - propriedade `flex-basis` por DD ( @Diegue ) em CodePen .
.wrapper .element
Você pode combinar flex-grow
, flex-shrink
e flex-basis
propriedades em uma única propriedade: flex
do seguinte modo:
.wrapper { flex: {flex-grow} {flex-shrink} {flex-basis}; }
Dica: se você planeja usar
flex
, certifique-se de definir todos os valores (mesmo se desejar usar valores padrão) porque alguns navegadores podem não reconhecê-los (um bug comum está relacionado ao não ter definido oflex-grow
valor).
Esta propriedade é semelhante a align-items
mas o efeito é aplicado individualmente a cada elemento. Os valores possíveis são:
Veja a caneta Flexbox @ApeeScape - Crianças - propriedade `align-self` por DD ( @Diegue ) em CodePen .
Uma das melhores coisas incluídas no Flexbox é a capacidade de reordenar elementos (usando a propriedade order
) sem a necessidade de modificar o DOM ou usar JavaScript. A forma como o order
obras de propriedade é super simples. Da mesma forma que z-index
controla a ordem em que os itens são renderizados, order
controla a ordem em que os elementos são posicionados dentro do invólucro; ou seja, elementos com um menor order
valor (que pode até ser negativo, aliás) são posicionados antes daqueles com maior order
valor.
Veja a caneta Flexbox @ApeeScape - Filhos - propriedade `ordem` por DD ( @Diegue ) em CodePen .
.wrapper .elements { order: 1; /* this one will be positioned second */ } .wrapper .elements:last-child { order: -1; /* this one will be positioned first */ }
Quando se trata de criar layouts, o Flexbox abre um mundo de possibilidades. Abaixo, você pode encontrar alguns exemplos de uso das propriedades do Flexbox.
Com o Flexbox, você pode alinhar qualquer coisa verticalmente, incluindo vários elementos de uma vez. Sem o Flexbox, você precisava usar técnicas de posicionamento ou de mesa que exigiam que criássemos um filho para conter vários elementos. Mas com o Flexbox, você pode deixar essas técnicas tediosas e frágeis para trás e simplesmente definir algumas propriedades no invólucro e pronto, independentemente de quantas vezes o conteúdo dentro do contêiner muda ou o tipo de mudança!
.wrapper { display: flex; /* always present for Flexbox practices */ flex-direction: column; /* elements stack */ justify-content: center; /* now that flex-direction is a column, the axis are swapped so this centers the content vertically */ min-height: 100vh /* make sure wrapper is taller enough */ }
Veja a caneta Flexbox @ApeeScape - Usos reais que podemos dar - Alinhamento vertical por DD ( @Diegue ) em CodePen .
Um layout “meio / meio” é um layout de altura total com duas colunas, cada uma com seu conteúdo centralizado verticalmente. Geralmente é implementado 'acima da dobra' (ou seja, antes que os usuários rolem para baixo após o carregamento da página).
Usando técnicas mais tradicionais, você pode criar este layout com elementos flutuantes (de largura 50% cada), limpando os flutuadores no invólucro (“clearfix” :before
e :after
, overflow: hidden
, ou um whackywith clear: both;
no final). Ainda assim, é muito trabalhoso e o resultado não é tão estável quanto o que o Flexbox oferece.
No trecho de código a seguir, você verá como é fácil definir o layout e também como os filhos se tornam também wrappers Flexbox, já que tudo está alinhado verticalmente também.
Wrapper externo:
.wrapper { display: flex; flex-direction: column; /* only for mobile */ }
Wrappers internos:
.inner-wrapper { flex-grow: 1; /* Allow the element to grow if there is available space */ flex-shrink: 1; /* Elements shrink at the same rate */ flex-basis: 100%; /* Elements will cover the same amount, if is possible the 100% of the width */ }
Veja a caneta Flexbox @ApeeScape - Usos reais que podemos dar - Seção de meio sangramento por DD ( @Diegue ) em CodePen .
Uma barra de navegação de largura total distribui o espaço igualmente na mesma linha de itens da barra de navegação, independentemente do número de elementos.
No exemplo abaixo, também existem alguns botões icônicos sem esse comportamento, demonstrando que você pode combinar os dois da maneira que quiser. Sem o Flexbox, atingir esses tipos de layouts exigiria código JavaScript para calcular o espaço disponível e, em seguida, distribuí-lo programaticamente, dependendo de quais botões abrangem e quais não.
O Flexbox torna isso muito mais simples.
Propriedades do invólucro:
.navbar { display: flex; }
Abrangendo propriedades filho:
.navbar-item { flex-grow: 1; /* They will grow */ }
Propriedades filho não abrangentes:
.navbar-other { flex-grow: 0; // They won’t grow }
Veja a caneta Flexbox @ApeeScape - Usos reais que podemos oferecer - Barra de navegação de botões sem margens por DD ( @Diegue ) em CodePen .
Quantas vezes você teve que implementar um conjunto de caixas de informações com ícones e texto em diferentes projetos?
Essa distribuição de elementos é principalmente útil em marketing digital, mas pode ter alguns outros usos no desenvolvimento de software. Com o poder do Flexbox, você pode definir uma espécie de grade e também alinhar elementos, independentemente de quantos existem.
Propriedades do invólucro:
.wrapper { display: flex; flex-wrap: wrap; }
Propriedades filho:
.blurb { flex-grow: 0; /* elements don’t grow */ flex-shrink: 0; /* elements don’t shrink in a flexible way */ flex-basis: auto; /* the width of the elements will be set by proportions in `width` due to flex-basis not support workaround */ width: calc(33.33% - 60px); /* calculate proportional width without space taken by padding (workaround for IE 11) */ }
Para telas de tablet e celular, a largura varia entre 50% e 100%.
Veja a caneta Flexbox @ApeeScape - Usos reais que podemos dar - Blurbs por DD ( @Diegue ) em CodePen .
A sintaxe do Flexbox mudou inúmeras vezes nas diferentes versões do navegador. Isso pode ser um problema ao implementar um layout com Flexbox e tentar oferecer suporte a navegadores da web mais antigos, especialmente versões mais antigas do Internet Explorer.
Felizmente, muitas técnicas e soluções alternativas para fazer seu código funcionar na mais ampla gama de navegadores da web estão listadas em Flexbugs , que é um ótimo recurso. Se você seguir as informações desse site, terá resultados melhores e consistentes em diferentes navegadores da web.
Tarefas de prefixo são particularmente úteis nesse sentido. Para automatizar a prefixação de regras CSS, você pode escolher uma das seguintes ferramentas:
Rubi:
Node.js:
Flexbox é uma ótima ferramenta para acelerar, aperfeiçoar e dimensionar nosso trabalho. O limite está apenas na imaginação do desenvolvedor.
Se precisar de ajuda visual para planejar seu próximo layout, você pode tentar este playground bacana:
Veja a caneta Flexbox @ApeeScape - Flexbox playground por DD ( @Diegue ) em CodePen .
Abra-o em um nova janela .
Com a crescente adoção de navegadores da web modernos pela maioria dos usuários, o uso do Flexbox permitirá que você crie layouts incríveis facilmente, sem a necessidade de mergulhar em código JavaScript confuso ou criar CSS desordenado.