Grid

Tienes una página con un encabezado en la parte superior, una barra lateral a la izquierda, un área de contenido principal y un pie de página. Podrías anidar un montón de contenedores y ajustar cada uno en su lugar, y funcionaría bien hasta el día en que necesites cambiar la disposición. CSS grid fue construido exactamente para este tipo de problema: distribuir una página en filas y columnas al mismo tiempo. Una vez que puedas describir un layout como un conjunto de tracks, la mayoría de los ajustes con wrappers y floats desaparece.
El contenedor grid
Conviertes cualquier elemento en un grid asignándole display: grid. Ese elemento se convierte en el contenedor grid, y sus hijos directos se convierten en elementos que se ajustan a un grid que defines. Por sí solo, display: grid no hace mucho, así que también le dices cuántas columnas y filas quieres y cuán grande debe ser cada una.
Describes las columnas con grid-template-columns y las filas con grid-template-rows. Cada valor en la lista es un track, y un track es una sola columna o fila:
.layout {
display: grid;
grid-template-columns: 200px 1fr; /* dos columnas: una fija, luego el resto */
grid-template-rows: 80px 400px; /* dos filas: una corta, luego una alta */
}display: grid a un elemento y se convierte en un contenedor grid, con sus hijos directos sentados dentro como elementos. Luego dices cuántas columnas y filas quieres con grid-template-columns y grid-template-rows, un valor por track. Nada se alinea hasta que defines esos tracks, así que ese es siempre tu primer paso. Tracks flexibles
Las columnas de píxeles fijas están bien, pero la mayoría de los layouts quieren columnas que compartan el espacio de manera uniforme y crezcan con la pantalla. Para eso está la unidad fr. Un fr significa una porción del espacio restante, así que tres columnas de 1fr cada una toman un tercio del contenedor:
.gallery {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* tres columnas iguales */
}Escribir 1fr tres veces es tedioso, así que repeat() lo escribe por ti. Y gap establece el espacio entre los tracks, así que no necesitas usar márgenes en cada elemento:
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr); /* las mismas tres columnas iguales */
gap: 16px; /* espacio entre filas y columnas */
}fr es una porción del espacio restante, así que 1fr 1fr 1fr te da tres columnas iguales. Usa repeat(3, 1fr) para no escribir el mismo valor una y otra vez, y gap para el espacio entre tracks. Una vez que fr hizo clic para mí, dejé de recurrir a porcentajes que nunca se sumaban correctamente. Colocación de elementos
Por defecto cada elemento cae en la siguiente celda libre, una por celda, en orden. Cuando quieres que un elemento ocupe más de una celda, lo dices con grid-column y grid-row. Las líneas entre tracks se numeran comenzando en 1, así que grid-column: 1 / 3 significa "empieza en la línea 1, termina en la línea 3", cubriendo dos columnas:
.featured {
grid-column: 1 / 3; /* abarca desde la línea de columna 1 a la línea 3, dos columnas de ancho */
}Si no quieres contar líneas, span dice cuántas celdas cubrir desde donde el elemento cae:
.featured {
grid-column: span 2; /* cubre dos columnas, empezando donde se siente este elemento */
}grid-column o grid-row. Los números de línea comienzan en 1, así que grid-column: 1 / 3 cubre dos columnas, u usa span 2 si prefieres no contar. Eso es suficiente para construir la mayoría de los layouts antes de nombrar una sola área. Grids responsivos sin media queries
Una fila de tarjetas debe mostrar tres en una pantalla ancha, dos en una tablet, una en un teléfono. Puedes hacer eso con grid solo, sin breakpoints que escribir. El truco es una línea:
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}Léelo de adentro hacia afuera. minmax(200px, 1fr) significa que cada columna es al menos 200px y como máximo una porción del espacio. auto-fit luego encaja tantas de esas columnas como el contenedor tenga espacio. Pantalla ancha, más columnas caben; pantalla estrecha, menos caben, y las tarjetas fluyen automáticamente.
repeat(auto-fit, minmax(200px, 1fr)) hace que las tarjetas se reordenen por su cuenta, sin breakpoints necesarios. Cada columna es al menos 200px y como máximo una porción del espacio, y auto-fit empaca tantas como quepan. Cambia 200px y cambias cuántas tarjetas se sientan lado a lado. 
