Basic concepts of grid layout
CSS Grid Layout presenta un sistema de cuadrÃcula bidimensional para CSS. Las cuadrÃculas se pueden utilizar para posicionar áreas principales de la página o pequeños elementos de la interfaz de usuario. Este artÃculo lo introduce a Grid Layout de CSS y la nueva terminologÃa que forma parte de la especificación CSS Grid Layout Nivel 1. Las caracterÃsticas mostradas en este resumen se explicarán con mayor detalle en el resto de esta guÃa.
¿Qué es una cuadrÃcula(grid)?
Una cuadrÃcula es un conjunto de lÃneas horizontales y verticales que se intersectan - un grupo define columnas y el otro filas. Los elementos se pueden colocar en la cuadrÃcula respetando estas columnas y filas. El diseño de cuadrÃcula CSS tiene las siguientes caracterÃsticas:
Tamaños fijos y flexibles
Usted puede crear una cuadrÃcula con tamaños fijos, utilizando pÃxeles, por ejemplo. También se puede crear una cuadrÃcula utilizando tamaños flexibles con porcentajes o con la nueva unidad de medida fr (fracción), diseñada para este propósito.
Posicionamiento de elementos
Puede colocar elementos en una ubicación precisa en la cuadrÃcula utilizando números de lÃnea, nombres o seleccionando un área de la cuadrÃcula. Grid también contiene un algoritmo para controlar la ubicación de elementos que no tienen una posición explÃcita en la cuadrÃcula.
Creación de lÃneas adicionales para alojar contenido
Usted puede definir una cuadrÃcula explÃcita con grid layout. La especificación Grid Layout es lo suficientemente flexible como para permitir agregar filas y columnas adicionales cuando sea necesario. CaracterÃsticas como la adición de "tantas columnas como caben en un contenedor" también fueron incuidas.
Control de alineación
Grid contiene caracterÃsticas de alineación para poder controlar la forma cómo se alinean los elementos una vez colocados en un área de cuadrÃcula y cómo está alineada toda la cuadrÃcula.
Control de contenido superpuesto
Se puede colocar más de un elemento en una celda de la cuadrÃcula o área, las cuales pueden solaparse o superponerse total o parcialmente entre sÃ. Esta estratificación puede ser controlada con la propiedad z-index.
Grid es una poderosa especificación que, cuando se combina con otras partes de CSS como flexbox, puede ayudarle a crear diseños que antes eran imposibles de construir en CSS. Todo comienza creando una cuadrÃcula en su contenedor de cuadrÃcula.
El contenedor de Grid
Creamos un contenedor de cuadrÃcula al declarar display: grid o display: inline-grid en un elemento. Tan pronto como hagamos esto todos los hijos directos de ese elemento se convertirán en elementos de la cuadrÃcula.
En este ejemplo, se tiene un contenedor div con una clase wrapper y dentro hay cinco elementos hijos.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Hago de .wrapper un contenedor de cuadrÃcula.
.wrapper {
display: grid;
}
Todos los descendientes directos son ahora elementos de la cuadrÃcula. En un navegador web, usted no verá ninguna diferencia en cómo son mostrados estos elementos antes de convertirlos en una cuadrÃcula ya que grid ha creado una cuadrÃcula de una sola columna para los elementos. En este punto usted puede encontrar útil trabajar en Firefox Developer Edition, el cual tiene disponible el Grid Inspector (Inspector de cuádricula) como parte de las Herramientas de Desarrollador. Si ve este ejemplo en Firefox e inspecciona la cuadrÃcula, verá un icono pequeño junto al valor grid. Haga clic sobre este y la cuadrÃcula de este elemento se superpondrá en la ventana del navegador.

Mientras usted aprende y luego trabaja con CSS Grid Layout esta herramienta le dará una mejor idea de lo que está sucediendo con sus cuadrÃculas visualmente.
Si queremos empezar a hacer esto más parecido a una cuadrÃcula necesitamos agregar columnas.
Vias, filas y columnas del Grid
Definimos filas y columnas en nuestra cuadrÃcula con las propiedades grid-template-columns y grid-template-rows. Ãstas definen las vÃas de la cuadrÃcula. Una vÃa de cuadrÃcula es el área entre las dos lÃneas -horizontales o verticales- dentro de la cuadrÃcula. En la imagen inferior se puede ver una vÃa resaltada - esta es la vÃa de la primera fila en nuestra cuadrÃcula.

Ejemplo básico
Puedo modificar nuestro ejemplo anterior al agregar la propiedad grid-template-columns, para asà definir el tamaño (ancho) de las vÃas de cada columna.
Ahora he creado una cuadrÃcula con tres vÃas por columna de 200 pÃxeles. Los elementos hijo se posicionarán en esta cuadrÃcula uno en cada una de las celdas de la cuadrÃcula.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 200px 200px 200px;
}
La unidad fr
Las vÃas se pueden definir usando cualquier unidad de medida. Grid también introduce una unidad de longitud adicional para ayudarnos a crear vÃas de cuadrÃcula flexibles. La nueva unidad fr representa una fracción del espacio disponible en el contenedor de la cuadrÃcula. La siguiente definición de cuadrÃcula crearÃa tres vias con el mismo ancho, que se expanden y se encogen de acuerdo el espacio disponible.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
Tamaño desigual
En el próximo ejemplo creamos una definición con una vÃa de 2fr y luego dos vÃas de 1fr. El espacio disponible se divide en cuatro. Dos partes corresponden a la primera vÃa y una parte a cada una de las dos vias restantes.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
}
Mezclando tamanaños absolutos y flexibles
En este ejemplo final mezclamos las vÃas de tamaño absoluto con unidades de fracción(fr). La primera vÃa tiene 500 pÃxeles, por lo que este ancho fijo se sustrae del espacio disponible. El espacio restante se divide en tres y se asigna en proporción a las dos vÃas flexibles.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 500px 1fr 2fr;
}
Listando vÃas con la notación repeat()
Las cuadrÃculas grandes con muchas vÃas o celdas pueden utilizar la notación repeat() con el fin de repetir todas o una sección de la lista de vÃas. Por ejemplo la definición de cuadrÃcula:
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
También puede ser escrita asÃ:
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
La notación de repetición se puede utilizar para una parte del listado de vÃas. En este siguiente ejemplo he creado una cuadrÃcula con una vÃa inicial de 20 pÃxeles luego una sección repetitiva de 6 vÃas de 1fr y luego una vÃa final de 20 pÃxeles.
.wrapper {
display: grid;
grid-template-columns: 20px repeat(6, 1fr) 20px;
}
La notación de repetición toma una lista de vÃas especÃficas, por lo tanto, puede utilizarla para crear un patrón de iteración de vÃas. En el próximo ejemplo, mi cuadrÃcula consistirá de 10 vÃas, una vÃa 1fr seguida por una vÃa 2fr, repetida cinco veces.
.wrapper {
display: grid;
grid-template-columns: repeat(5, 1fr 2fr);
}
La cuadrÃcula implÃcita y explÃcita
Al crear nuestra cuadrÃcula de ejemplo definimos nuestras vÃas de columna con la propiedad grid-template-columns, pero dejamos que grid creara filas para el contenido según fuera necesario. Estas filas se crean en la cuadrÃcula implÃcita. La cuadrÃcula explÃcita consiste en las filas y columnas que se definen con las propiedades grid-template-columns y grid-template-rows.
Si coloca algo fuera de la cuadrÃcula ya definida, o si debido a la cantidad de contenido, se necesitarán más vÃas o celdas, entonces grid crea filas y columnas en la cuadrÃcula implÃcita. Estas vÃas varÃan su tamaño automáticamente de forma predeterminada, asà que ajustarán su tamaño basadas en el contenido dentro de ellas.
También puede definir un tamaño para el conjunto de vÃas creadas en la cuadrÃcula implÃcita con las propiedades grid-auto-rows y grid-auto-columns.
En el siguiente ejemplo usamos grid-auto-rows para asegurar que las vÃas creadas en la cuadrÃcula implÃcita tengan 200 pÃxeles de alto.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px;
}
Tamaño de vÃa y minmax()
Al configurar una cuadrÃcula explÃcita o definir el tamaño de las filas o columnas creadas automáticamente, es posible que desee dar a las vÃas un tamaño mÃnimo, pero asegurarse que se expandan para adaptarse a cualquier contenido que se pueda agregar. Por ejemplo, tal vez quiera que mis filas nunca se colapsen a menos de 100 pÃxeles, pero si mi contenido se extiende a 300 pÃxeles de altura, me gustarÃa que la fila se expandiera a esa altura.
Grid tiene una solución para esto con la función minmax(). En el siguiente ejemplo estoy usando minmax() en el valor de la propiedad grid-auto-rows. Las filas creadas automáticamente tendrán como mÃnimo de 100 pÃxeles de alto y un máximo de auto. El uso de auto significa que el tamaño mirará el tamaño del contenido y se estirará para dar espacio al elemento más alto en una celda en esta fila.
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}
<div class="wrapper">
<div>One</div>
<div>
Two
<p>I have some more content in.</p>
<p>This makes me taller than 100 pixels.</p>
</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
LÃneas de la cuadrÃcula
Debe tenerse en cuenta que cuando definimos una cuadrÃcula definimos las vÃas de la cuadrÃcula, no las lÃneas. Grid luego nos da las lÃneas numeradas a utilizar al posicionar elementos. En nuestra cuadrÃcula de tres columnas y dos filas, tenemos cuatro lÃneas de columna.

Las lÃneas están numeradas según el modo de escritura del documento. En un idioma de izquierda a derecha, la lÃnea 1 está al lado izquierdo de la cuadrÃcula. En un idioma de derecha a izquierda, está en el lado derecho de la cuadrÃcula. Las lÃneas también se pueden nombrar, ya veremos cómo hacer esto en una guÃa posterior de esta serie.
Posicionando elementos de acuerdo a las lÃneas
Estaremos explorando la colocación basada en lÃneas en detalle en un artÃculo posterior, el siguiente ejemplo demuestra cómo hacer esto de una manera sencilla. Cuando colocamos un elemento y tomamos como punto de referencia la lÃnea - en lugar de la vÃa.
En el siguiente ejemplo, estoy posicionando los dos primeros elementos en la cuadrÃcula de tres vÃas de columna, usando las propiedades grid-column-start, grid-column-end, grid-row-start y grid-row-end. Trabajando de izquierda a derecha, el primer elemento se coloca partiendo de la lÃnea de la columna 1, y se extiende a la lÃnea de la columna 4, que en nuestro caso es la lÃnea que está mas a la derecha en la cuadrÃcula. Y comienza en la lÃnea de la fila 1 y termina en la lÃnea de fila la 3, por lo tanto, se extiende sobre dos filas.
El segundo elemento comienza en la lÃnea de columna 1 de la cuadrÃcula y se extiende por toda la fila. Este es el valor por defecto, por lo que no necesito especificar la lÃnea final. También se extiende dos vÃas de fila de la lÃnea de fila 3 a la lÃnea de fila 5. Los otros elementos se colocarán a sà mismos en espacios vacÃos en la cuadrÃcula.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three</div>
<div class="box4">Four</div>
<div class="box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 3;
grid-row-end: 5;
}
No olvide que puede utilizar Grid Inspector en las Herramientas de Desarrollador de Firefox para ver cómo se posicionan los elementos en las lÃneas de la cuadrÃcula.
Celdas de cuadrÃcula
Una celda de cuadrÃcula es la unidad más pequeña en una cuadrÃcula, conceptualmente es como una celda de tabla. Como vimos en nuestros ejemplos anteriores, una vez que se define una cuadrÃcula en un padre, los elementos hijo se posicionarán a sà mismos de una vez en cada celda de la cuadrÃcula definida. En la imagen de abajo he resaltado la primera celda de la cuadrÃcula.

Ãreas de cuadrÃcula
Los elementos pueden extenderse a través de una o más celdas tanto por fila como por columna, lo que crea un área de cuadrÃcula. Las áreas de la cuadrÃcula tienen que ser rectangulares - no es posible crear un área en forma de L, por ejemplo. El área de cuadrÃcula resaltada abarca dos vÃas de fila y dos de columna.

Canaletas
Las canaletas o callejones entre las celdas de la cuadrÃcula se pueden crear usando las propiedades grid-column-gap y grid-row-gap, o la propiedad abreviada grid-gap. En el siguiente ejemplo estoy creando una brecha de 10 pÃxeles entre columnas y una brecha de 1em entre filas.
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-column-gap: 10px;
grid-row-gap: 1em;
}
Nota:
Los navegadores más antigüos tienen column-gap, row-gap y gap prefijadas con el prefijo grid- como grid-column-gap, grid-row-gap y grid-gap respectivamente.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Cualquier espacio utilizado por las brechas se tendrá en cuenta antes de que el espacio sea asignado a las vÃas fr de longitud flexible y las canaletas intervienen con propósitos de dimensionamiento como una vÃa de cuadrÃcula regular, sin embargo, no se puede colocar nada en una brecha. En términos de posicionamiento basado en lÃneas, la brecha actúa como una lÃnea gruesa.
Anidamiento de cuadrÃculas
Un elemento de cuadrÃcula puede convertirse en un contenedor de cuadrÃcula. En el ejemplo siguiente tengo la cuadrÃcula de tres columnas creada anteriormente, con nuestros dos elementos posicionados. En este caso, el primer elemento tiene algunos subelementos. Ya que estos elementos no son descendientes directos de la cuadrÃcula, no participan en la disposición de la cuadrÃcula y por lo tanto se muestran en el flujo normal del documento.
<div class="wrapper">
<div class="box box1">
<div class="nested">a</div>
<div class="nested">b</div>
<div class="nested">c</div>
</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>

Si establezco box1 a display: grid puedo darle una definición de vÃa y también se convertirá en una cuadrÃcula, los elementos entonces se posicionan en esta nueva cuadrÃcula.
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
En este caso, la cuadrÃcula anidada no tiene ninguna relación con el padre. Como usted puede ver en el ejemplo, no ha heredado la grid-gap del elemento padre y las lÃneas de la cuadrÃcula anidada no se alinean con las lÃneas de la cuadrÃcula padre.
Subgrid
En la especificación de grid de nivel 1 hay una caracterÃstica llamada subgrid que nos permitirÃa crear cuadrÃculas anidadas que usan la definición de la vÃa de la cuadrÃcula padre.
Nota: Las Subgrids aún no están implementadas en ningún navegador y la especificación está sujeta a cambio.
En la especificación actual, editarÃamos el ejemplo de cuadrÃcula anidada arriba para usar display: subgrid en lugar de display: grid, y luego eliminar la definición de vÃa. La cuadrÃcula anidada utilizará las vÃas de la cuadrÃcula principal para posicionar los elementos.
Cabe señalar que la cuadrÃcula está anidada en ambas dimensiones â filas y columnas. No hay concepto de la cuadrÃcula implÃcita trabajando con subgrids. Esto significa que debe asegurarse de que la cuadrÃcula padre tenga suficientes vÃas de fila y columna para todos los subelementos.
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
display: subgrid;
}
Estratificando elementos con z-index
Los elementos de cuadrÃcula pueden ocupar la misma celda. Si volvemos a nuestro ejemplo con elementos posicionados por número de lÃnea, podemos cambiar esto para hacer que dos elementos se superpongan.
<div class="wrapper">
<div class="box box1">One</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
}
El elemento box2 ahora se superpone a box1, se muestra en la parte superior ya que aparece después en el orden de origen.
Controlando el orden
Podemos controlar el orden en el que los artÃculos se apilan utilizando la propiedad z-index - al igual que con los elementos posicionados. Si le damos a box2 un z-index más bajo que box1, se mostrará debajo de box1 en la pila.
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
z-index: 2;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
z-index: 1;
}
Siguientes Pasos
En este artÃculo hemos tenido una mirada muy rápida a través de la Especificación de Grid Layout. Juegue un poco con los ejemplos de código, y luego pase a la siguiente parte de esta guÃa donde realmente nos vamos a adentrar en detalle dentro de CSS Grid Layout.