Saltar al contenido principal
Leyendo: Flexbox parte 1
Apuntes de clase

Clase 07 · Flexbox parte 1

Estos apuntes siguen la séptima clase de Edición Web I: cómo funciona Flexbox, el sistema de maquetación para colocar elementos en una sola dimensión (filas o columnas). Verás display: flex, justify-content, flex-wrap, gap y flex-grow, con ejemplos y ejercicios. El código de cada ejemplo es el mismo que se mostró en clase.

Descargar PDF

01 · Display: flex

Flexbox · display: flex;

Flexbox es un sistema de maquetación especialmente apropiado para hacer estructuras de una sola dimensión (filas o columnas, en lugar de una rejilla de elementos).

style.css
.container {
  display: flex;
}

Flex ocupará todo el ancho del padre. Con display: flex; conseguimos que cualquier elemento, incluyendo los contenedores <div>, se pongan en línea, uno al lado del otro.

index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Document</title>
  </head>
  <style>
    div {
      border: 1px solid black;
      padding: 5px;
    }

    .probando-flex {
      background-color: greenyellow;
      display: flex;
    }
  </style>
  <body>
    <div class="container">
      <h1>Contenedor principal</h1>
      <div class="probando-flex">
        <div>Elemento 1</div>
        <div>Elemento 2</div>
        <div>Elemento 3</div>
      </div>
    </div>
  </body>
</html>
Resultado

Contenedor principal

Elemento 1
Elemento 2
Elemento 3

Sin display: flex, los <div> (elementos en bloque) se apilarían uno debajo de otro. Con flex, los hijos directos del contenedor pasan a colocarse en una fila.

02 · justify-content

justify-content

Alineación de los elementos horizontalmente.

style.css
.contenedor{
  display:flex;
  justify-content:space-around;
}
Valores de justify-content
flex-start
flex-end
center
space-between
space-around
space-evenly
Esquema de la diapositiva
Esquema de los valores de justify-content: flex-start, flex-end, center, space-between, space-around y space-evenly.
03 · flex-wrap

flex-wrap

  • wrap: los elementos de la capa se distribuirán en una o varias filas en función de su tamaño.
  • nowrap: los elementos de la capa estarán sí o sí en una sola fila.
style.css
.container-wrap {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}

.container-no-wrap {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
}
03 · flex-wrap

flex-wrap: wrap;

index.html
<style>
  div {
    border: 1px solid black;
    padding: 5px;
  }

  .container-wrap {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
  }
</style>
<body>
  <div class="container-wrap">
    <div>Elemento 1</div>
    <div>Elemento 2</div>
    <div>Elemento 3</div>
    <div>Elemento 4</div>
    <div>Elemento 5</div>
    <div>Elemento 6</div>
    <div>Elemento 7</div>
  </div>
</body>
Resultado (contenedor estrecho)
Elemento 1
Elemento 2
Elemento 3
Elemento 4
Elemento 5
Elemento 6
Elemento 7
03 · flex-wrap

flex-wrap: nowrap;

index.html
<style>
  div {
    border: 1px solid black;
    padding: 5px;
  }

  .container-no-wrap {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
  }
</style>
<body>
  <div class="container-no-wrap">
    <div>Elemento 1</div>
    <div>Elemento 2</div>
    <div>Elemento 3</div>
    <div>Elemento 4</div>
    <div>Elemento 5</div>
    <div>Elemento 6</div>
    <div>Elemento 7</div>
  </div>
</body>
Resultado (contenedor estrecho)
Elemento 1
Elemento 2
Elemento 3
Elemento 4
Elemento 5
Elemento 6
Elemento 7

Con nowrap todos los elementos se quedan en una sola fila: el navegador los comprime para que quepan, en lugar de pasarlos a otra línea.

03 · flex-wrap

flex-wrap: wrap-reverse;

Invierte el orden en que mostramos los elementos.

style.css
.container-wrap-reverse {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap-reverse;
}
Resultado (contenedor estrecho)
Elemento 1
Elemento 2
Elemento 3
Elemento 4
Elemento 5
Elemento 6
Elemento 7
04 · gap

gap

gap: 8px; — espacio entre elementos. Si utilizamos justify-content: flex-start; todos los elementos estarían pegados; con gap creamos un espacio de 8px entre cada elemento.

style.css
.container-no-wrap {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  gap: 8px;
}
Con gap y sin gap

gap: 8px

Elemento 1
Elemento 2
Elemento 3

Sin gap

Elemento 1
Elemento 2
Elemento 3
05 · Grow

Grow

Grow es una forma de asignar tamaño horizontal de forma flexible, por lo que asignaremos la propiedad flex-grow al elemento hijo y no al contenedor. También se puede utilizar solo flex: 1;

style.css
.contenedor{
  display:flex;
  justify-content: space-between;
  flex-wrap: wrap;
}

.item{flex-grow: 1;}
05 · Grow

flex-grow: 1; · Factor de crecimiento

Es un valor proporcional al ancho de pantalla: sería como si lo definiéramos por fracciones.

Factores de crecimiento

Sin factor de crecimiento

Grow 0
Grow 0
Grow 0

Factor de crecimiento solo al primer elemento

Grow 1
Grow 0
Grow 0

Mismo factor de crecimiento

Grow 1
Grow 1
Grow 1

Diferente factor de crecimiento

Grow 2
Grow 4
Grow 1

Ir al ejemplo (CodePen) →

06 · Ejemplos

Ejemplo 1

Centrar 3 contenedores hijo con una imagen cada uno de ellos:

style.css
.contenedor-padre{
  display:flex;
  justify-content:center;
  border:1px solid black;
  padding:8px;
}

.contenedor{
  width:800px;
  display:flex;
  justify-content:center;
  gap:8px;
  padding:8px;
  background-color:gray;
}
index.html
<div class="contenedor-padre">
  <div class="contenedor">
    <div><img src="https://picsum.photos/200/300?random=1"></div>
    <div><img src="https://picsum.photos/200/300?random=2"></div>
    <div><img src="https://picsum.photos/200/300?random=3"></div>
  </div>
<div>
Resultado (imágenes sustituidas por bloques de color)

Hay dos contenedores flex anidados: el padre centra al .contenedor y el .contenedor centra sus tres imágenes.

06 · Ejemplos

Ejemplo 2: barra de navegación

Una barra con un logo a la izquierda, tres botones centrados y tres iconos a la derecha, todo con display: flex y justify-content: space-between.

index.html
<nav>

  <div>
    <img class="logo" src="https://picsum.photos/100/100/?blur">
  </div>

  <div class="botones">
    <a href="" class="link">Boton 1</a>
    <a href="" class="link">Boton 2</a>
    <a href="" class="link">Boton 3</a>
  </div>

  <div>
    <a href=""><img class="logo" src="https://picsum.photos/100/100/?blur"></a>
    <a href=""><img class="logo" src="https://picsum.photos/100/100/?blur"></a>
    <a href=""><img class="logo" src="https://picsum.photos/100/100/?blur"></a>
  </div>

</nav>
style.css
nav{
  display:flex;
  justify-content:space-between;
  Background-color:gray;
  padding:16px;
  margin:6px;
  border-radius:8px;
}

.logo{
  border-radius:500px;
  width:30px;
}

.botones{
  background-color:rgba(255,255,255,0.4);
  padding:16px;
  border-radius:8px;
  display:flex;
}

.link{
  font-size:18px;
  color:white;
  text-decoration:none;
  border:2px solid white;
  border-radius:24px;
  padding: 6px 16px;
}
Resultado (imágenes sustituidas por círculos)

Ir al ejemplo (CodePen) →

06 · Ejemplos

Ejemplo 3: dado en CSS

Un dado con la cara del 5 hecho solo con flex: el contenedor tiene tres filas (display: flex) y cada fila alinea sus puntos con un justify-content distinto.

El dado
Esquema de la diapositiva · style.css
/* Contenedor del dado */
display: flex;
width: 33%;

/* Fila superior y fila inferior */
display: flex;
justify-content: space-between;

/* Fila central */
display: flex;
justify-content: center;

/* Cada punto */
width: 120px;
height: 120px;
background-color: black;
border-radius: 500px;
padding: 8px;

En el demo los puntos se reducen para que el dado quepa en la página; en clase miden 120px.

Ir al ejemplo (CodePen) →

07 · Resumen propiedades flex

Resumen propiedades flex

PropiedadQué hace
display: flex;Permite colocar los elementos en el eje horizontal.
justify-contentDiferentes alineaciones de los elementos.
flex-wrapLos elementos se sitúan en una o varias líneas.
gapEspacio entre los elementos.
flex-growAsignación de anchura flexible o relativa.

Recordatorio importante

Las propiedades flex se aplican al contenedor padre… NO a los elementos que queremos alinear. La excepción es flex-grow, que va en el hijo.

Aquí va el código flex
<div>                 <!-- Padre: aquí va el código flex -->
  <div>hijo 1</div>   <!-- Hijo -->
  <div>hijo 2</div>   <!-- Hijo -->
</div>
08 · Wireframe

Wireframe

Un wireframe es un esquema en blanco y negro de la estructura de una página: dónde va cada bloque (cabecera, imágenes, textos, botones…) antes de programarla. Nos ayuda a ver qué contenedores necesitamos y dónde aplicar flex.

Ejemplo de wireframe
Wireframe de una página web con cabecera y botones, bloque principal con formulario, logotipos, tres textos, imagen con texto y pie de página.

Ejemplo: de la web al wireframe

Web (izquierda) y su wireframe (derecha)
Una página web de una sastrería a la izquierda y su wireframe a la derecha, con las secciones marcadas.

En la diapositiva, cada bloque del wireframe se anota con el flex que necesita:

  • Bloques con el contenido centrado: display: flex; + justify-content: center;
  • Bloque con una rejilla de imágenes que salta de fila: flex-wrap: wrap;
09 · Ejercicios

Ejercicio 1 · Ordenando cajas

Tenemos que probar las propiedades de justify-content.

  1. Crearemos una clase .box que será de 100 de alto y 100 de ancho.
  2. Dentro de un padre meteremos tantas cajas como vemos en la imagen.
  3. Entre cada padre añadiremos un <hr>.
  4. La carpeta se llamará ordenando_cajas.
Resultado esperado
Cuatro filas de cajas rojas separadas por líneas: dos cajas en los extremos, una a la derecha, una a la izquierda y tres juntas.
09 · Ejercicios

Ejercicio 2 · Crear un wireframe

Crea la estructura de la página «wireframe»: puedes utilizar un programa de diseño o hacerlo a mano.

Página de la que hay que crear el wireframe
Página web con cabecera verde azulada, dos fotos de perfil, una sección gris con mapa, una sección turquesa con capturas de juegos, iconos de servicios y un pie naranja.
09 · Ejercicios

Ejercicio 3 · Crear un wireframe (portfolio)

La carpeta se llamará portfolio. Buscaremos 3 o 4 imágenes de la temática que queramos (preferiblemente trabajos vuestros) de un tamaño de 800×420.

Estructura del portfolio
Wireframe de un portfolio: barra superior «Hola soy…», título «Mis fotos preferidas», tres fotos con título y descripción, bloque negro «About me», bloque «Think. Create. Inspire.» y pie con tres columnas.

Ayuda

Cada foto lleva un título y una descripción debajo
Una foto de montañas rocosas con el título «Montañas rocosas» y una pequeña descripción del paisaje debajo.
10 · Página de referencia

Página de referencia

https://css-tricks.com/snippets/css/a-guide-to-flexbox/