CSS Grid Layout, ¡Está vivo!
Open Source Weekends, Madrid – 10 de Junio, 2017
Feature Queries
Text Orientation
Valores
mixed;
upright;
sideways-right;
sideways;
use-glyph-orientation;
CSS Box Alignment
Preguntas habituales
1 - ¿Compite con Flexbox?
No: Flexbox: 1 dirección. Grid 2
2 - CSS Grid funciona sobre el contenedor, no sobre el item
3 - CSS Grid respeta el writing-mode (LTR, RTL...)
Por en grid se escriben cosas como que es grid-column-start ya que no es igual aquí que en otros paises
4 - Autoplacement - https://codepen.io/rachelandrew/pen/Opaopw
Crear elementos que por definición ocupen una cantidad de 2 columnas en especial y se autocoloquen es tan sencillo como lo siguiente
.box {
grid-column: auto / span 4;
}
5 - Responsive Grid - https://codepen.io/rachelandrew/pen/gmQdgz
6 - CSS Fallback - https://codepen.io/rachelandrew/pen/jBQpXv
Float no funciona dentro de grid así que si usamos floats no tenemos que usar feature queries para sobre escribirlo
7 - Feature queries
Lo habitual que hay que sobreescribir dentro de feature queries son widths y margins
8 - Ojo con Autoprefixer y la implementación de Grid en IExplorer y primeras versiones de Edge
¿Y quién ha sido el último en implementar CSS Grid Layout como siempre?
Conceptos Básicos 1/2
Grid Container
Grid Item
Grid Line
Grid Track: Espacio entre dos líneas
Grid Cell: Espacio entre dos líneas de fila adyacentes y dos líneas de columna adyacente.
Grid Area: Espacio rodeado por cuatro lineas.
Conceptos Básicos 2/2
1 2 3 4 5
+----+-+----+-+----+-+----+ 1
| | | | | | | |
| | | | | | | |
+----+ +----+ +----+ +----+
+----+ +----+ +----+ +----+ 2
| | | | | | | |
| | | | | | | |
+----+ +----+ +----+ +----+
+----+ +----+ +----+ +----+ 3
| | | | | | | |
| | | | | | | |
+----+ +----+ +----+ +----+
+----+ +----+ +----+ +----+ 4
| | | | | | | |
| | | | | | | |
+----+ +----+ +----+ +----+
+----+ +----+ +----+ +----+ 5
| | | | | | | |
| | | | | | | |
+----+-+----+-+----+-+----+ 6
¡Cosas importantes!
minmax()
auto-fill
auto-fit
.
fr
span
nombre de lineas/areas
z-index
Hay valores que son un descriptionhand de otros dos. Si se omite uno, el descriptionhand asignará el valor declarado al segundo (el omitido)
column, float, clear, and vertical-align no afectan al grid container.
Las líneas pueden tener varios nombre [row1-end row2-start]
¿Qué soporte tiene en los navegadores?
CSS Grid Layout support (caniuse.com)
Contenedor
Índice
display
grid-template-columns
grid-template-columns: repeat(number-of-times, width);
grid-template-columns: number repeat(number-of-times, width) number;
grid-template-columns: repeat(number-of-times, width width);
grid-template-columns: repeat(number-of-times, [col] width);
grid-template-rows
grid-template-columns: repeat(number-of-times, [row] width);
grid-template-areas
grid-template
grid-column-gap
grid-row-gap
grid-gap
justify-items
align-items
justify-content
align-content
grid-auto-columns
grid-auto-rows
grid-auto-flow
grid
display
VALORES:
grid
inline-grid
subgrid
.contenedor {
display: grid | inline-grid | subgrid;
}
grid-template-columns - grid-template-rows
VALORES:
- <track-size>
- <line-name>
.contenedor {
grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
}
.contenedor {
grid-template-columns: 100px 100px 300px 20% 1fr;
grid-template-rows: 100px 100px 100px;
}
grid-template-areas
VALORES:
- <grid-area-name>
- .
- none
.item-a {
grid-area: header;
}
.item-b {
grid-area: main;
}
.item-c {
grid-area: sidebar;
}
.item-d {
grid-area: footer;
}
.contenedor {
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: auto;
grid-template-areas:
"header header header header"
"main main . sidebar"
"footer footer footer footer";
}
grid-template
VALORES:
- none
- subgrid
- grid-template-rows / grid-template-columns
.contenedor {
grid-template: none | subgrid | grid-template-rows / grid-template-columns;
}
.contenedor {
grid-template-rows: [fila-inicio] 25px [fila-fin row2-inicio] 25px [row2-fin];
grid-template-columns: auto 50px auto;
grid-template-areas:
"header header header"
"footer footer footer";
}
grid-column-gap - grid-row-gap
VALORES:
- tamaño
.contenedor {
grid-column-gap: <tamaño>;
grid-row-gap: <tamaño>;
}
grid-gap
VALORES:
- <grid-row-gap> <grid-column-gap>
.contenedor {
grid-gap: tamaño;
}
justify-items
fila
VALORES:
- start
- end
- center
- stretch
.contenedor {
justify-items: start | end | center | stretch;
}
align-items
columna
VALORES:
- start
- end
- center
- stretch
.contenedor {
align-items: start | end | center | stretch;
}
justify-content
fila
VALORES:
- start
- end
- center
- stretch
- space-around
- space-between
- space-evenly
.contenedor {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
align-content
columna
VALORES:
- start
- end
- center
- stretch
- space-around
- space-between
- space-evenly
.contenedor {
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
grid-auto-columns y grid-auto-rows
VALORES:
- tamaño del track
.contenedor {
grid-auto-columns: tamaño del track ...;
grid-auto-rows: tamaño del track ...;
}
.contenedor {
grid-template-columns: 60px 60px;
grid-template-rows: 90px 90px
}
grid-auto-flow
Dense puede causar que el orden de los items no sea el mismo que en el DOM
VALORES:
- row
- column
- dense
.contenedor {
grid-auto-flow: row | column | row dense | column dense
}
<section class="contenedor"
<div class="item-a">item-a</div>
<div class="item-b">item-b</div>
<div class="item-c">item-c</div>
<div class="item-d">item-d</div>
<div class="item-e">item-e</div>
</section>
.contenedor {
display: grid;
grid-template-columns: 1fr 200px 200px 200px 1fr;
grid-template-rows: repeat(2, 200px);
grid-auto-flow: row;
}
grid
VALORES:
- none
- grid-template-rows / grid-template-columns
- grid-auto-flow [grid-auto-rows [ / grid-auto-columns] ]
.contenedor {
grid: none | grid-template-rows / grid-template-columns | grid-auto-flow [grid-auto-rows [ / grid-auto-columns]];
}
.contenedor {
grid-template-rows: 200px auto;
grid-template-columns: 1fr auto 1fr;
grid-template-areas: none;
}
Items
Índice
grid-column-start
grid-column-end
grid-row-start
grid-row-end
grid-column
grid-row
grid-area
justify-self
align-self
grid-column-start - grid-column-end
grid-row-start - grid-row-end
VALORES:
- <línea>
- span <número>
- span <nombre>
- auto dense
.item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start
grid-row-end: 3
}
grid-column - grid-row
VALORES:
- <start-line> / <end-line>
.item-c {
grid-column: 3 / span 2;
grid-row: third-line / 4;
}
grid-area
VALORES:
- <name>
- <row-start> / <column-start> / <row-start> / <column-end>
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
item-d {
grid-area: header
}
justify-self
fila
VALORES:
- start
- end
- center
- stretch
.item {
justify-self: start | end | center | stretch;
}
.item-a {
justify-self: start;
}
align-self
columna
VALORES:
- start
- end
- center
- stretch
.item {
align-self: start | end | center | stretch;
}
.item-a {
align-self: start;
}
Recursos
Recursos para profundizar en CSS Grid Layout
¿A quién seguir?
Gente que habla habitualmente de CSS.