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 contenha. Antigamente isso significava floats, clearfixes e muita tentativa e erro. O flexbox é a ferramenta criada exatamente para isso: você diz a um container para organizar seus filhos em linha, e depois ajusta a posição deles ao longo de dois eixos até que fiquem onde você quer. Boa parte do layout que você vê pela web no dia a dia, barras de navegação, barras de ferramentas, fileiras de cards, é um flex container por baixo dos panos.
O flex container
O flexbox começa com uma única linha aplicada a um elemento pai. Defina display: flex em um container e seus filhos diretos se alinham em linha, um ao lado do outro. Esse container agora é um flex container, e cada filho dentro dele se torna um flex item.
.nav {
display: flex; /* os filhos agora ficam em linha */
}Os itens se organizam ao longo de duas direções. O eixo principal vai da esquerda para a direita, na direção em que os itens se alinham. O eixo transversal vai de cima para baixo, cruzando a linha. Você vai posicionar os itens usando esses dois eixos, então já vale a pena visualizá-los agora: o eixo principal é a linha em que os itens se apoiam, o eixo transversal é a direção que a atravessa.
.nav {
display: flex;
}Uma única declaração, e os filhos de qualquer bloco deixam de se empilhar de cima para baixo e passam a ficar em linha. Todo o resto deste capítulo é sobre como direcionar esses itens depois que eles estão dentro do container.
display: flex em um pai e seus filhos diretos se alinham em linha. Esse pai é o flex container, os filhos são os flex items. Os itens se movem ao longo de duas direções: o eixo principal é a linha em que eles se apoiam, o eixo transversal a atravessa, e você vai posicionar itens usando os dois. Alinhando ao longo dos eixos
Depois que seus itens estão em linha, duas propriedades os movem de um lado para o outro. justify-content espaça os itens ao longo do eixo principal, a direção em que eles se apoiam. align-items os move ao longo do eixo transversal, para cima e para baixo dentro da linha.
.nav {
display: flex;
justify-content: space-between; /* afasta os itens ao longo da linha */
align-items: center; /* alinha eles no meio vertical */
}Os valores mais comuns de justify-content são flex-start (agrupados à esquerda), center (agrupados no meio), flex-end (agrupados à direita), space-between (espaços entre os itens, nenhum nas pontas) e space-around (espaços de ambos os lados de cada item). Para align-items, center é o valor que você mais vai usar.
Para centralizar algo nos dois sentidos, o truque que todo mundo aprende primeiro: defina os dois como 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 os 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 os dois como center e o que estiver dentro fica exatamente no meio, um truque de layout que você vai usar repetidamente. Direção e quebra de linha
Por padrão, um flex container organiza os itens em linha. Mude isso com flex-direction. Defina como column e os itens se empilham de cima para baixo em vez de ficarem lado a lado.
.sidebar {
display: flex;
flex-direction: column; /* os itens agora se empilham verticalmente */
}Quando os itens em linha ficam sem espaço, eles vão sendo espremidos cada vez mais finos. Para deixar que caiam para uma nova linha em vez disso, adicione flex-wrap: wrap.
.card-row {
display: flex;
flex-wrap: wrap; /* itens que não cabem passam para a próxima linha */
}Para o espaço entre os itens, use gap. Ele adiciona um espaço uniforme entre cada item sem adicionar espaço nas bordas externas.
.card-row {
display: flex;
gap: 16px; /* 16px entre cada item */
}flex-direction: column empilha os itens verticalmente em vez de em linha. flex-wrap: wrap deixa os itens caírem para uma nova linha quando o espaço acaba, em vez de serem espremidos. E gap coloca espaço uniforme entre os itens sem adicionar nada nas bordas, então use ele antes de recorrer a margens. Dimensionamento flexível dos itens
O ponto central do flexbox é que os itens podem flexionar, crescendo ou encolhendo para dividir o espaço. O atalho que você vai usar mais é flex: 1 em um item, que diz a ele para crescer e ocupar uma fração igual de todo espaço disponível.
.card {
flex: 1; /* cada card cresce para preencher uma fração igual da linha */
}Coloque flex: 1 em três cards em linha e eles dividem o container em três larguras iguais. Dê a um card flex: 2 e ele ocupa o dobro do espaço dos outros. Esse número sozinho é como os itens dividem entre si o espaço restante.
Por trás de flex: 1 existem três controles separados: quanto um item cresce, quanto ele encolhe e seu tamanho inicial. No começo você raramente os define um por um, o atalho cobre os casos comuns, mas ajuda saber que eles existem.
.layout {
display: flex;
gap: 24px;
}
.sidebar {
flex: 0 0 240px; /* fixo em 240px, nunca cresce ou encolhe */
}
.main {
flex: 1; /* ocupa todo o espaço restante */
}Uma sidebar fixa ao lado de uma coluna principal flexível, três linhas que expressam a intenção. Esse padrão, junto com a barra de navegação alinhada de antes, cobre boa parte dos layouts que você vai construir.
flex: 1 em um item diz a ele para crescer e ocupar uma fração igual da linha, então três cards com flex: 1 saem com a mesma largura. Aumente um para flex: 2 e ele ocupa o dobro do espaço. Esse número sozinho é como os flex items dividem entre si o espaço disponível. 
