====== 15. Sistema de diseño: Layout ======
En los temas de CSS vimos flex y grid. En este tema vamos a ver cómo se usan en nuestro sistema de diseño con bloques de layout de BEM (prefijo ''l-'').
===== Bloque de layout con flex =====
Un bloque de layout con flex sería así:
Item1
Item2
Item3
Item4
Item5
.l-flex {
display: flex;
}
.l-flex--direction-row {
flex-direction: row;
}
.l-flex--justify-content-center {
justify-content: center;
}
.l-flex__area--grow2 {
flex-grow: 2;
}
El padre es el bloque ''l-flex'' y cada hijo es un área ''l-flex__area''. Un área puede contener a su vez otro bloque de layout:
===== Bloques de layout con grid =====
==== Bloque de Layout por columnas ====
Ejemplo de Layout con BEM por columnas.
.l-columns {
display: grid;
grid-template-columns: repeat(1, 1fr);
}
.l-columns--2 {
grid-template-columns: repeat(2, 1fr);
}
.l-columns--3 {
grid-template-columns: repeat(3, 1fr);
}
.l-columns--4 {
grid-template-columns: repeat(4, 1fr);
}
Column A
Column B
Column C
Column D
Column E
Column F
==== span ====
Para que un área ocupe dos columnas se usa el modificador ''l-columns__area--span2'' (ver ''span'' en [[clase:daw:diw:css-flex-grid#span|CSS: Flex y Grid]]).
.l-columns {
display: grid;
}
.l-columns--4 {
grid-template-columns: repeat(4, 1fr);
}
.l-columns__area--span2 {
grid-column: span 2;
}
===== Reglas de Layout =====
Para hacer una clase de Layout hay que seguir las siguientes reglas:
* Siempre con dos elementos.
* El ''div'' principal, al que llamaremos "padre"
* Los ''div'' hijos que llamaremos "áreas" (Es para seguir la nomenclatura de grid)
* El CSS solo debe tener cosas para modificar la posición (y a veces tamaño) de las Áreas pero no cambiar ni sus colores, fuentes, etc.
* Puede ser optativo poner en las areas la clase del elemento si no tiene utilidad.
* Las clases CSS de los elementos que son area se llamará ''__area'' o ''__area-YYYY''.
.l-extremo {
display: flex;
}
.l-extremo__area-izquierda {
margin-right: auto;
}
.l-extremo__area-derecha {
margin-left: auto;
}
* En un área se podría poner un componente ya que sus propiedades CSS no van a //chocar//.
Pulsar Izquierda
Pulsar Derecha
===== Mejorando el layout con SASS =====
Los bloques de layout con el selector padre ''&'':
.l-flex {
display: flex;
&--direction-row {
flex-direction: row;
}
&--justify-content-center {
justify-content: center;
}
&__area {
&--grow2 {
flex-grow: 2;
}
}
}
.l-extremo {
display: flex;
&__area-izquierda {
margin-right: auto;
}
&__area-derecha {
margin-left: auto;
}
}
Y en ''l-columns'' los modificadores de 1 a 12 columnas se generan con un bucle en vez de escribirlos uno a uno:
.l-columns {
display: grid;
grid-template-columns: repeat(1, 1fr);
@for $i from 1 through 12 {
&--#{$i} {
grid-template-columns: repeat($i, 1fr);
}
}
&__area {
&--span2 {
grid-column: span 2;
}
}
}
===== Ejercicios =====
==== Ejercicio 1 ====
Crea los componentes que necesites para que funcione lo siguiente:
CABECERA
IZQUIERDA
CUERPO
DERECHA
PIE