1. Web Design
  2. UX/UI
  3. Responsive Design

Como Crear el Maquetado De Un Sitio de Noticias con Flexbox

No es necesario entender cada aspecto de Flexbox antes de que te decidas y empieces. En éste tutorial, vamos a presentar varias funcionalidades de Flexbox mientras diseñamos un "maquetado de noticias" como el que puedes encontrar en The Guardian.
Scroll to top

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

No es necesario entender cada aspecto de Flexbox antes de que te decidas y empieces. En éste tutorial, vamos a presentar varias funcionalidades de Flexbox mientras diseñamos un "maquetado de noticias" como el que puedes encontrar en The Guardian.

La razón por la que usamos Flexbox es que proporciona características muy poderosas:

  • podemos fácilmente crear columnas responsivas (adaptables)
  • podemos crear columnas de igual altura
  • podemos poner contenido en la parte inferior de un contenedor

¡Asi que comencemos!

1. Comenzamos con Dos Columnas

Crear columnas en CSS siempre ha sido un desafío. Por un largo tiempo, las únicas opciones eran utilizar floats o tablas, pero presentaban sus inconvenientes.

Flexbox facilita el proceso, dándonos:

  • código más limpio: solo necesitamos un contenedor con display: flex
  • no necesitamos despejar los floats, evitando un comportamiento inesperado del maquetado
  • marcado semántico
  • flexibilidad: podemos redimensionar, estirar, alinear las columnas en unas cuantas líneas de CSS

Comencemos creando dos columnas; una que es de 2/3 de la anchura de nuestro contenedor, y uno que es de 1/3.

1
<div class="columns">
2
  <div class="column main-column">
3
    2/3 column
4
  </div>
5
  <div class="column">
6
    1/3 column
7
  </div>
8
</div>

Hay dos elementos aquí:

  1. el contenedor columns
  2. Dos hijos column, uno con una clase adicional de main-column que usaremos para hacerla mas ancha
1
.columns {
2
  display: flex;
3
}
4
5
.column {
6
  flex: 1;
7
}
8
9
.main-column {
10
  flex: 2;
11
}

Como la columna principal tiene un valor flex de 2, ocupará el doble del espacio de la otra columna.

Al agregar algunos estilos visuales, esto es lo que tenemos:

Please accept marketing cookies to load this content.

2. Hacer Cada Columna un Contenedor Flexbox

Cada una de éstas dos columnas contendrán varios artículos apilados verticalmente, asi que también vamos a convertir los elementos column en contenedores Flexbox. Queremos:

  • que los artículos sean apilados verticalmente
  • que los artículos se estiren y llenen el espacio disponible
1
.column {
2
  display: flex;
3
  flex-direction: column; /* Makes the articles stacked vertically */
4
}
5
6
.article {
7
  flex: 1; /* Stretches the articles to fill up the remaining space */
8
}

La regla flex-direction: column en el contenedor, combinada con la regla flex: 1 en los hijos asegura que los artículos llenarán el espacio vertical, manteniendo nuestras dos primeras columnas con la misma altura.

Please accept marketing cookies to load this content.

3. Haz Cada Artículo un Contenedor Flexbox

Ahora, para darnos control extra, convertimos también cada artículo en un contenedor Flexbox.  Cada uno de ellos contendrán:

  • un título
  • un párrafo
  • una barra de información con el autor y el número de comentarios
  • una imagen responsiva opcional

Estamos usando Flexbox aquí para "empujar" la barra de información al área inferior. Como recordatorio, éste es el maquetado de artículo que tenemos como objetivo:

Aquí está el código:

1
<a class="article first-article">
2
  <figure class="article-image">
3
    <img src="">
4
  </figure>
5
  <div class="article-body">
6
    <h2 class="article-title">
7
      <!-- title -->
8
    </h2>
9
    <p class="article-content">
10
      <!-- content -->
11
    </p>
12
    <footer class="article-info">
13
      <!-- information -->
14
    </footer>
15
  </div>
16
</a>
1
.article {
2
  display: flex;
3
  flex-direction: column;
4
}
5
6
.article-body {
7
  display: flex;
8
  flex: 1;
9
  flex-direction: column;
10
}
11
12
.article-content {
13
  flex: 1; /* This will make the content fill up the remaining space, and thus push the information bar at the bottom */
14
}

Los elementos del artículo están colocados verticalmente gracicas a la regla flex-direction: column;

Aplicamos flex: 1 al elemento article-content para que llene el espacio vacío, y "empuje" hacia el área inferior el article-info, no importa la altura de las columnas.

Please accept marketing cookies to load this content.

4. Agregar Columnas Anidadas

En la columna de la izquierda, lo que queremos es otro conjunto de columnas.  Asi que vamos a reubicar el segundo artículo con el mismo contenedor columns que ya hemos usado.

1
<div class="columns">
2
  <div class="column nested-column">
3
    <a class="article">
4
      <!-- Article content -->
5
    </a>
6
  </div>
7
8
  <div class="column">
9
    <a class="article">
10
      <!-- Article content -->
11
    </a>
12
    <a class="article">
13
      <!-- Article content -->
14
    </a>
15
    <a class="article">
16
      <!-- Article content -->
17
    </a>
18
  </div>
19
</div>

Como queremos que la primera columna anidada sea más ancha, agregaremos una clase nested-column con el estilo adicional:

1
.nested-column {
2
  flex: 2;
3
}

Ésto hará que nuestra columna sea dos veces más ancha que la otra.

Please accept marketing cookies to load this content.

5. Dar al Primer Artículo un Maquetado Horizontal

El primer artículo es realmente grande. Para optimizar el uso del espacio, cambiemos su maquetado para que sea horizontal.

1
.first-article {
2
  flex-direction: row;
3
}
4
5
.first-article .article-body {
6
  flex: 1;
7
}
8
9
.first-article .article-image {
10
  height: 300px;
11
  order: 2;
12
  padding-top: 0;
13
  width: 400px;
14
}

La propiedad order es muy útil aquí, pues nos permite alterar el orden de elemenetos HTML sin afectar el marcado HTML. El article-image realmente está antes del article-body en el marcado, pero se comportará como si estuviera después.

Please accept marketing cookies to load this content.

6. Hacer el Maquetado Responsivo

Esto se está viendo como queremos, aunque está un poco aplastado. Arreglemos eso al hacerlo responsivo.

Una gran característica de Flexbox es que necesitas solamente remover la regla display:flex en el contenedor para deshabilitar Flexbox completamente, mientras mantienes válidas las otras propiedades de Flexbox (como align-items o flex).

Como resultado, puedes generar un maquetado "responsivo" al habilitar Flexbox solamente arriba de cierto punto de quiebre.

Vamos a remover display: flex de ambos selectores .columns y .column, en lugar de encerrarlos en una media query:

1
@media screen and (min-width: 800px) {
2
  .columns,
3
  .column {
4
    display: flex;
5
  }
6
}

¡Ya está! En pantallas más pequeñas, todos los artículos estarán uno arriba de otro. Arriba de 800px, se distribuirán en dos columnas.

7. Agregar Toques Finales

Para hacer el maquetado más atractivo en pantallas más grandes, agreguemos algunas modificaciones en el CSS:

1
@media screen and (min-width: 1000px) {
2
  .first-article {
3
    flex-direction: row;
4
  }
5
6
  .first-article .article-body {
7
    flex: 1;
8
  }
9
10
  .first-article .article-image {
11
    height: 300px;
12
    order: 2;
13
    padding-top: 0;
14
    width: 400px;
15
  }
16
17
  .main-column {
18
    flex: 3;
19
  }
20
21
  .nested-column {
22
    flex: 2;
23
  }
24
}

El primer artículo tiene su contenido distribuído horizontalmente, con el texto a la izquierda y la imagen a la derecha. También, la columna principal es ahora más ancha (75%) y la columna anidada también (66%). ¡Éste es el resultado final!

Please accept marketing cookies to load this content.

Conclusión

¡Espero haber demostrado que no necesitas comprender cada aspecto de Flexbox para que te decidas y comiences a usarlo! Este maquetado de noticias responsivo es un patrón realmente útil; ¡fragméntalo, experimenta con él, déjanos saber como te fue!