Flexbox

Você quer três botões em uma linha, espaçados uniformemente, todos com a mesma altura e centralizados verticalmente não importa quanto texto cada um contém. Nos velhos tempos isso significava floats, clearfixes e muito chute. Flexbox é a ferramenta construída exatamente para isso: você diz a um contêiner para organizar seus filhos em uma linha, e depois os empurra ao longo de dois eixos até ficarem onde você quer. A maioria dos layouts do dia a dia que você vê na web, barras de navegação, barras de ferramentas, linhas de cartões, tem um contêiner flex por baixo.
O contêiner flex
Flexbox começa com uma linha em um elemento pai. Defina display: flex em um contêiner e seus filhos diretos se alinham em uma linha, lado a lado. Esse contêiner é agora um contêiner flex, e cada filho dentro dele se torna um item flex.
.nav {
display: flex; /* os filhos agora ficam em uma linha */
}Os itens se organizam ao longo de duas direções. O eixo principal vai da esquerda para a direita, a forma como os itens se alinham. O eixo transversal vai de cima para baixo, atravessando a linha. Você vai orientar itens ao longo de ambos, então ajuda visualizá-los agora: o eixo principal é a linha em que os itens ficam, o eixo transversal é a direção atravessando-a.
.nav {
display: flex;
}Uma única declaração, e os filhos de qualquer bloco deixam de se empilhar de cima para baixo e começam a ficar em uma linha. Tudo mais neste capítulo é sobre orientar esses itens uma vez que estão no contêiner.
display: flex em um pai e seus filhos diretos se alinham em uma linha. Esse pai é o contêiner flex, os filhos são itens flex. Os itens se movem ao longo de duas direções: o eixo principal é a linha em que ficam, o eixo transversal corre atravessando-a, e você vai empurrar itens ao longo de ambos. Alinhando ao longo dos eixos
Uma vez que seus itens estão em uma linha, duas propriedades os movem. justify-content espaça itens ao longo do eixo principal, a direção em que ficam. align-items os move ao longo do eixo transversal, para cima e para baixo dentro da linha.
.nav {
display: flex;
justify-content: space-between; /* empurra itens para longe um do outro ao longo da linha */
align-items: center; /* alinha-os no meio vertical */
}Os valores comuns para justify-content são flex-start (amontoados à esquerda), center (amontoados no meio), flex-end (amontoados à direita), space-between (espaços entre itens, nenhum nas extremidades), e space-around (espaços em ambos os lados de cada item). Para align-items, center é o que você alcança com mais frequência.
Para centralizar algo dos dois lados, o movimento que todos aprendem primeiro: defina ambos para center.
.hero {
display: flex;
justify-content: center; /* centralizado ao longo do eixo principal */
align-items: center; /* centralizado ao longo do eixo transversal */
}justify-content espaça itens ao longo do eixo principal, align-items os move ao longo do eixo transversal. Os valores para lembrar do primeiro são center, space-between, e flex-start. Defina ambos para center e o que estiver dentro fica bem no meio, que é o movimento de layout que você vai usar uma e outra vez. Direção e quebra
Por padrão um contêiner flex organiza itens em uma linha. Mude isso com flex-direction. Defina para column e os itens se empilham de cima para baixo em vez de ficarem lado a lado.
.sidebar {
display: flex;
flex-direction: column; /* itens agora se empilham verticalmente */
}Quando itens em uma linha ficam sem espaço, eles ficam cada vez mais finos. Para deixá-los cair em uma nova linha, adicione flex-wrap: wrap.
.card-row {
display: flex;
flex-wrap: wrap; /* itens que não cabem se movem para a próxima linha */
}Para o espaço entre itens, use gap. Ele adiciona um espaço consistente entre cada item sem adicionar espaço nas extremidades.
.card-row {
display: flex;
gap: 16px; /* 16px entre cada item */
}flex-direction: column empilha itens verticalmente em vez de em uma linha. flex-wrap: wrap deixa itens cair para uma nova linha quando ficam sem espaço, em vez de ficarem comprimidos. E gap coloca espaço mesmo entre itens sem adicionar nenhum nas extremidades, então recorra a ela antes de margens. Dimensionamento flexível de itens
O ponto do flexbox é que itens podem flexionar, crescendo ou encolhendo para compartilhar o espaço. O atalho que você vai usar mais é flex: 1 em um item, que diz a ele para crescer e pegar uma parte igual de qualquer espaço disponível.
.card {
flex: 1; /* cada cartão cresce para preencher uma parte igual da linha */
}Coloque flex: 1 em três cartões em uma linha e eles dividem o contêiner em três larguras iguais. Dê a um cartão flex: 2 e ele toma o dobro do espaço dos outros. Esse número único é como itens dividem o espaço sobrado entre eles.
Por trás de flex: 1 estão três controles separados: quanto um item cresce, quanto encolhe e seu tamanho inicial. Você raramente os define um por um no começo, o atalho cobre os casos comuns, mas ajuda saber que estão lá.
.layout {
display: flex;
gap: 24px;
}
.sidebar {
flex: 0 0 240px; /* fixo 240px, nunca cresce ou encolhe */
}
.main {
flex: 1; /* toma todo o espaço restante */
}Uma barra lateral fixa ao lado de uma coluna principal flexível, três linhas de intenção. Esse padrão único, mais a barra de navegação alinhada de antes, cobre uma grande fatia dos layouts que você vai construir.
flex: 1 em um item diz a ele para crescer e pegar uma parte igual da linha, então três cartões com flex: 1 saem com a mesma largura. Aumente um para flex: 2 e ele toma o dobro do espaço. Esse número único é como itens flex dividem o espaço entre eles. 
