Flexbox vs CSS Grid: Un ejemplo práctico

Para muchos de nosotros, cuando maquetábamos una web, era muy usual el uso de tablas, floats y otras propiedades que nos daba CSS, aunque resultaban unas herramientas algo ortopédicas si el diseño resultaba complejo.

Hace algunos año apareció Flexbox, que fue especialmente diseñado para crear pagina con un diseño responsive. Flexbox hizo que alinear elementos y su contenido sea mucho más sencillo, permitiéndonos crear páginas fluidas, flexibles y dinámicas, que funcionan en un amplio catálogo de dispositivos, simplemente usando CSS. Flexbox eliminó de una vez el desafió que suponía crear este tipo de páginas.

Pero desde hace algunos meses existe una nueva herramienta, CSS Grid, que es compatible de forma nativa con Chrome 57 y Firefox 52, por lo que si tenéis vuestros navegadores actualizados, ya tendréis estas versiones, y esperemos que en un futuro próximo, sea compatible con el resto de navegadores.

Por esto, la pregunta es clara: ¿debo seguir usando Flexbox, o me conviene empezar a trabajar en mis proyectos con CSS Grid? Pues para sacarnos de dudas, vamos a crear una pequeña plantilla, e intentaremos aplicar nuestro diseño usando tanto Flexbox como CSS Grid, para ver que nos resulta más adecuado.

Flexbox vs CSS Grid: nuestro HTML base

Como hemos dicho, vamos a trabajar sobre un HTML básico, sobre el que aplicaremos nuestro CSS, por una parte usando Flexbox, y por otra CSS Grid. Podéis trabajar directamente en CodePen, para poder seguir paso por paso todo lo que hacemos en el artículo.

HTML base para trabajar en con Flexbox y CSS Grid

Enlace a CodePen

Como veis, el diseño es muy simple, y ahora mismo un poco feo, pero queremos que sean bastante reconocibles cada una de sus secciones. Como vemos, nuestro HTML consiste básicamente en un header con varios links, una sección principal, un sidebar y un footer, todo dentro de un contenedor. Con todo esto, intentaremos marcarnos varias metas, intentando mantener el la limpieza de nuestro código:

  • Posición general de cada una de las cuatro secciones del HTML.
  • Alinear los diferentes elementos del header.
  • Hacer que la web tenga un diseño responsive.

Posicionamiento de las secciones

FLEXBOX

Empezaremos con la solución que usaríamos con Flexbox. Añadiremos un display: flex al contenedor, y posicionaremos a sus elementos hijos de forma vertical. Esto hará que las secciones se coloquen una debajo de otra.

.container {

display: flex;

flex-direction: column;

}

A continuación, necesitamos que la sección principal y el sidebar estén una junto a la otra. Como los contenedores flex normalmente van en una dirección, añadiremos un wrapper a nuestro HTML, que tendrá dentro tanto la sección principal como el sidebar. Y a este wrapper le añadiremos un display: flex, pero en esta ocasión en dirección horizontal.

.wrapper {
    display: flex;
    flex-direction: row;
}

Solo nos queda por decidir las proporciones tanto de la sección principal como del sidebar. Por ejemplo, diremos que la sección principal tendrá cuatro veces el tamaño del sidebar, y al primero le añadiremos un margen para que haya cierto espacio entre cada sección.

.main {
    flex: 4;
    margin-right: 40px;
}
.sidebar {
   flex: 1;
}
CSS GRID

Existen varias maneras de usar CSS Grid, pero en esta ocasión nos ayudaremos de esta sintaxis. En primer lugar, definiremos nuestras cuatro grid áreas:

header {
    grid-area: header;
}
.main {
    grid-area: main;
}
.sidebar {
    grid-area: sidebar;
}
footer {
    grid-area: footer;
}

A continuación, podemos configurar la disposición de cada grid-area, con sus márgenes correspondientes:

.container {
    display: grid;   
    grid-template-columns: 4fr 1fr;
    grid-template-areas: 
        "header header"
        "main sidebar"
        "footer footer";
    grid-gap: 40px;
}

Aunque en un principio pueda parecer menos comprensible, una vez que sepamos usar la sintaxis de CSS Grid, vemos como su escritura resulta incluso más sencilla que en Flexbox.

Alinear elementos del header

FLEXBOX

Nuestro header tiene varios links, y por otro un botón, y queremos que los links estén justificados a la izquierda, y el botón a la derecha.

header {
    display: flex;
    justify-content: space-between;
}

Una vez tenemos tanto la lista de con los enlaces como el botón en su respectiva posición, haremos que todos los elementos de la lista de navegación se alineen de forma horizontal.

header nav {
    display: flex;
    align-items: baseline;
}

También se podía haber usado un display: inline-block, pero como queremos hacer Flexbox, vamos a usarlo para solucionar todo.

CSS GRID

Para separar la lista de navegación del botón, convertiremos el header en un dispaly: grid a dos columnas, y justificaremos cada una de ellas.

header{
    display: grid;
    grid-template-columns: 1fr 1fr;
}
header nav {
    justify-self: start;
}
header button {
    justify-self: end;
}

La alineación correcta de los elementos de la lista de navegación no será tan precisa como queramos, ya que no disponemos de la opción align-items que si tenemos en Flexbox. Por lo tanto, tendremos que definir dentro otro grid.

header nav {
    display: grid;
    grid-template-columns: auto 1fr 1fr;
    align-items: end; 
}

Aquí una de las debilidades de CSS Grid, ya que a pesar de la facilidad que nos da alinear contenedores, no es muy bueno para hacer lo mismo con los elementos que están dentro.

Hacer la web responsive

FLEXBOX

Por último, y no por ello menos importante, vamos a ver la solución que nos da Flexbox para cuando necesitamos hacer nuestra web responsive. Para ello, solo vamos a cambiar la dirección del wrapper, de horizontal a vertical (o de row a column). Como es una página sencilla, solo usaremos un tamaño para nuestro media-query.

@media (max-width: 660px) {
    .main-and-sidebar-wrapper {
        flex-direction: column;
    }
CSS GRID

Como tenemos varias grid-areas definidas, las reordenaremos dentro de nuestro media-query.

@media (max-width: 660px) {
    .container {	
        grid-template-areas: 
            "header header"
            "main main"
            "sidebar sidebar"
            "footer footer";
    }
}

Conclusiones

Como se ha podido ver durante todo el artículo, no hay una solución mejor que otra. El mejor sistema de trabajo por el que podemos optar es usar tanto Flexbox como CSS Grid en nuestros proyectos de forma conjunta, ya que cada uno tiene sus puntos fuertes en diferentes cosas.

  • CSS Grid es mejor para la construcción general de nuestra página, ya que es más fácil modelar nuestra plantilla, y se pueden crear diseños más asimétricos y peculiares.
  • CSS Grid en diseños con filas y columnas.
  • Flexbox es mejor alineando el contenido dentro de los diferentes elementos de la web.
  • Flexbox en diseños con filas o columnas. Funciona mejor en una dimensión.

Por todo esto, no hay motivos para usar solo Flexbox o CSS Grid. Te recomendamos aprender ambos y usarlos de manera conjunta en tus proyectos.

Comentarios (5)

  1. Todo muy lindo y adhiero, pero el problema es siempre el mismo las distintas versiones de navegadores que aceptan o no estos cambios, según las versiones de cada navegador. Que pasa si se usa IE <= Edge?, Firefox < 52? Chrome <57?. Opera ?, Safari ? ….. Al final caemos en Bootstrap o Fundation, o bien maquetamos nosotros con float y propiedades CSS que compatibilicen las mayoría de las versiones utilizadas.

    1. Hola Roberto. Lo primero de todo, gracias por comentar!

      La verdad es que una de las dudas que siempre vamos a tener al empezar un proyecto es, como bien dices, que funciones en la mayoría de los navegadores. Por eso, antes que nada, lo que debemos proponer es hacer un pequeño «estudio de mercado» para comprobar desde que navegadores web entran nuestros visitantes y/o potenciales visitantes. Si vemos que la mayoría entran desde navegadores que no son compatibles con CSS Grid, seguramente no nos merezca la pena trabajar con esta nueva herramienta.

      Pero, a pesar de esto, la implementación de CSS Grid es mucho mayor de la que podemos pensar. Si entras en la web de Can I Use It verás como a día de hoy es compatible con las versiones de navegador que usan casi el 87% de los usuarios. Incluida Opera y Safari, que cuando escribimos esta artículo no eran compatibles, pero actualmente si lo son. Por lo que poco a poco esta cifra va en aumento conforme los usuarios van actualizando sus navegadores. Y es que, a pesar de lo que nos pueda parecer, las cifras de usuarios que navegan con IE 9 o menor, por ejemplo, apenas superan el 0,5%. Por suerte, atrás quedaron esos días en los que suponía el 60% del mercado.

      A pesar de todo, si queremos que nuestras webs tengan una compatibilidad prácticamente total, te recomiendo que eches un vistazo a este artículo de la MDN sobre CSS Grid y Progressive Enhancement, en el que habla como podemos usar tanto los clasicos floats como CSS Grid en nuestro proyectos de forma conjunta. Y es que, aunque nunca van a tener el mismo aspecto visual en viejos navegadores, al menos nos aseguramos de que visualmente van a funcionar, y que en navegadores modernos, vamos a poder usar todas las bondades de nuevas herramientas como CSS Grid.

      Un saludo!

  2. Saludos.
    Los conceptos que exponen están bien y tienen su coherencia.
    Pero los ejemplos que has puesto hacen agua por todos lados

    El ejemplo que usas tiene varios fallos , haces un elemento lista pero no la encierras dentro de

    Tampoco te has preocupado mucho de alinear los elementos con Grid-Layout , es como si quisieras demostrar a la fuerza que para alinear elementos o componentes con Grid-Layout fuera más dificil que con Flexbox.
    Cuando haciendo una plantilla suficiente dividida es muy fácil organizar y alinear los elementos y componentes individuales.

    Vamos , que has demostrado por las malas la diferencia entre ambos.
    Sino me crees , haz un .grid-container principal que englobe todos los elementos y divide su anchura en 28 columnas de 1fr
    mediante grid-template-columns : repeat(28,1fr)
    y luego con las filas haz lo mismo grid-template-rows: repeat(28,1fr)
    Este ejemplo lo ví en otro diseñador web y el resultado era factible.

    No quiero decir que no tengas razón en tu exposicón pero tampoco veo correcto tu forma de demostrar con ejemplo la diferencia entre ambos modulos de CSS.

    Gracias por el articulo y la atención.

    1. Hola! Lo primero de todo, gracias por tu comentario.

      En este artículo simplemente hemos querido poner sobre la mesa que Grid y Flebox no son excluyentes una de la otra, y que es mejor usa una u otra en según que situaciones. De hecho, casi para cualquier maquetación, podemos realizar todo con Grid, o todo con Flexbox, pero ello no quiere decir que sean las soluciones más optimas.

      Como bien comentas, a la hora de hacer una rejilla (en dos direcciones), el uso de Grid es mucho más sencillo para crear dicha plantilla y designar en que posición va a estar cada elemento. Esto está muy bien cuando tenemos un diseño ya cerrado, o una maquetación completamente definida. De hecho, es lo mejor cuando tenemos maquetaciones con cierta complejidad.

      Por otra parte, Flexbox nos da la libertad de que, en una dirección (una fila o una columnas), designar de que forma queremos que se comporten ciertos elementos, sin importar cuantos sean, ya que se van a organizar «solos». Esto es algo que se podría hacer también con Grid gracias a auto-fit, pero no nos da tantas posibilidades como Flexbox, donde podemos usar space-between, space-evenly, space-around… Por ejemplo, para crear un menú de navegación horizontal, sin un número de elementos cerrado (que puede crecer o disminuir con el tiempo), quizás nos convenga más usar Flexbox y en un par de lineas definir el comportamiento de dichos elementos, que usar Grid, donde tendríamos que definir una rejilla, que quizás con el tiempo debemos cambiar si cambia el diseño. Como digo, ambas soluciones son válidas y correctas, y usaremos una u otra según nos parezca más sencillo en ese momento, veamos que sea más óptimo en el futuro, o nos sintamos más cómodos trabajando con Flexbox o Grid.

      Con todo esto no quiero decir que la solución que has aportado sea incorrecta. De hecho, está muy bien ya que esa rejilla tan densa da la posibilidad de jugar mucho más con la maquetación. Pero, para ciertos elementos que solo hacen uso de una dirección, personalmente prefiero el uso de Flexbox, ya que de alguna forma se autogestiona si introduzco o sustraigo elementos, y no tengo que volver al CSS para cambiar su posición dentro de la rejilla.

      Lo bueno de estos nuevos sistemas de maquetación es que muchas veces nos dan herramientas con los que podemos trazar diferentes caminos para llegar a la misma meta. Simplemente la elección de esos caminos viene de nuestra experiencia y la facilidad que tengamos al usar unas herramientas u otras.

      Un saludo, y de nuevo gracias por tu comentario.

      1. Saludos!
        Gracias por la rápida respuesta.
        Esta claro que funsionar ambos modulos «Grid-Layout» y «Flexbox» ayuda muchísimo a la hora de diseña websites responsivos y de gran calidad.

        Son 2 herramientas formidables , nativas y que considero mucho mejores que framework como Bootstrap ya que no se le añade cogido superfluo a los desarrollos webs ni se carga con tanto codigo de todo tipo como librerias JQuery y Javascript.

        Bueno blog está muy bien y es bastante didáctico.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *