Flexbox
Quieres tres botones en una fila, espaciados de forma pareja, todos con la misma altura, y centrados verticalmente sin importar cuánto texto tenga cada uno. Antes esto significaba floats, clearfixes y bastante adivinación. Flexbox es la herramienta pensada justo para esto: le dices a un contenedor que acomode a sus hijos en línea, y luego los ajustas a lo largo de dos ejes hasta que queden donde quieres. Buena parte del diseño cotidiano que ves en la web, barras de navegación, barras de herramientas, filas de tarjetas, tiene un contenedor flex por debajo.
El contenedor flex
Flexbox empieza con una sola línea en un elemento padre. Configura display: flex en un contenedor y sus hijos directos se alinean en una fila, uno al lado del otro. Ese contenedor ahora es un contenedor flex, y cada hijo dentro de él se convierte en un elemento flex.
.nav {
display: flex; /* los hijos ahora se acomodan en fila */
}Los elementos se distribuyen a lo largo de dos direcciones. El eje principal va de izquierda a derecha, la forma en que se alinean los elementos. El eje transversal va de arriba hacia abajo, atravesando la fila. Vas a mover elementos a lo largo de ambos, así que conviene visualizarlos desde ahora: el eje principal es la línea sobre la que se apoyan los elementos, el eje transversal es la dirección que la cruza.
.nav {
display: flex;
}Una sola declaración, y los hijos de cualquier bloque dejan de apilarse de arriba hacia abajo y empiezan a acomodarse en fila. Todo lo demás en este capítulo trata de cómo dirigir esos elementos una vez que están dentro del contenedor.
display: flex en un padre y sus hijos directos se alinean en una fila. Ese padre es el contenedor flex, los hijos son elementos flex. Los elementos se mueven a lo largo de dos direcciones: el eje principal es la línea sobre la que se apoyan, el eje transversal la atraviesa, y vas a empujar elementos a lo largo de ambos. Alinear a lo largo de los ejes
Una vez que tus elementos están en fila, dos propiedades los mueven de lugar. justify-content los espacia a lo largo del eje principal, la dirección en la que se acomodan. align-items los mueve a lo largo del eje transversal, hacia arriba y abajo dentro de la fila.
.nav {
display: flex;
justify-content: space-between; /* separa los elementos a lo largo de la fila */
align-items: center; /* los alinea en el centro vertical */
}Los valores comunes de justify-content son flex-start (agrupados a la izquierda), center (agrupados al centro), flex-end (agrupados a la derecha), space-between (espacios entre elementos, ninguno en los extremos) y space-around (espacios a ambos lados de cada elemento). Para align-items, center es el que más vas a usar.
Para centrar algo en ambas direcciones, el truco que todos aprenden primero: pon los dos en center.
.hero {
display: flex;
justify-content: center; /* centrado a lo largo del eje principal */
align-items: center; /* centrado a lo largo del eje transversal */
}justify-content espacia los elementos a lo largo del eje principal, align-items los mueve a lo largo del eje transversal. Los valores que hay que recordar para el primero son center, space-between y flex-start. Pon los dos en center y lo que sea que esté adentro queda exactamente en el medio, un truco de diseño que vas a usar una y otra vez. Dirección y ajuste de línea
Por defecto, un contenedor flex acomoda los elementos en fila. Cambia eso con flex-direction. Configúralo en column y los elementos se apilan de arriba hacia abajo en lugar de quedar uno al lado del otro.
.sidebar {
display: flex;
flex-direction: column; /* ahora los elementos se apilan verticalmente */
}Cuando los elementos en una fila se quedan sin espacio, se van comprimiendo cada vez más. Para que en cambio pasen a una nueva línea, agrega flex-wrap: wrap.
.card-row {
display: flex;
flex-wrap: wrap; /* los elementos que no caben pasan a la siguiente línea */
}Para el espacio entre elementos, usa gap. Agrega un espacio uniforme entre cada elemento sin añadir espacio en los bordes exteriores.
.card-row {
display: flex;
gap: 16px; /* 16px entre cada elemento */
}flex-direction: column apila los elementos verticalmente en lugar de en fila. flex-wrap: wrap deja que los elementos pasen a una nueva línea cuando se quedan sin espacio, en lugar de comprimirse. Y gap pone un espacio uniforme entre elementos sin agregar nada en los bordes, así que úsalo antes que los márgenes. Tamaño flexible de los elementos
El punto de flexbox es que los elementos pueden ser flexibles, creciendo o encogiéndose para compartir el espacio. La abreviatura que más vas a usar es flex: 1 en un elemento, que le dice que crezca y tome una parte igual del espacio disponible.
.card {
flex: 1; /* cada tarjeta crece para llenar una parte igual de la fila */
}Pon flex: 1 en tres tarjetas en una fila y dividen el contenedor en tres anchos iguales. Dale a una tarjeta flex: 2 y toma el doble de espacio que las demás. Ese único número es cómo los elementos se reparten el espacio sobrante entre ellos.
Detrás de flex: 1 hay tres controles separados: cuánto crece un elemento, cuánto se encoge, y su tamaño inicial. Rara vez los configuras uno por uno al principio, la abreviatura cubre los casos comunes, pero ayuda saber que están ahí.
.layout {
display: flex;
gap: 24px;
}
.sidebar {
flex: 0 0 240px; /* fijo en 240px, nunca crece ni se encoge */
}
.main {
flex: 1; /* toma todo el espacio restante */
}Un sidebar fijo junto a una columna principal flexible, tres líneas de intención. Este patrón, sumado a la barra de navegación alineada de antes, cubre una gran parte de los diseños que vas a construir.
flex: 1 en un elemento le dice que crezca y tome una parte igual de la fila, así que tres tarjetas con flex: 1 salen del mismo ancho. Cambia una a flex: 2 y toma el doble de espacio. Ese único número es cómo los elementos flex se reparten el espacio entre ellos. 
