Advertisement
  1. Web Design
  2. HTML/CSS
  3. Bootstrap

Truco rápido: crear un diseño adaptable con Floats

Scroll to top
Read Time: 6 min

() translation by (you can also view the original English article)

En el truco rápido de hoy, aprenderemos cómo crear diseños adaptables usando floats de CSS, un método antiguo pero eficaz. Una vez hecho ésto, veremos cómo hacerlo con Bootstrap. Los floats no estaban pensados inicialmente para formar la estructura básica de una página (para eso tenemos los nuevos estándares CSS como flexbox y las rejillas), por lo que trabajar con floats a veces puede resultar complicado. Veamos un ejemplo para ilustrarlo.

Creando un diseño adaptable

Supongamos que queremos crear este diseño de tarjetas:

Echa un vistazo a la versión completa para hacerte una idea.

Estilos básicos

No queremos establecer una altura fija para el texto de las tarjetas. Tampoco queremos que sean de ancho fijo. Por lo tanto, para que las tarjetas sean utilizables y no se aplasten demasiado, necesitamos mostrar un número diferente de columnas dependiendo del tamaño de la ventana.

Hemos creado algunos media queries, de forma que se cumpla lo siguiente:

Ventana Nº de columnas
<400px
1
≥400px
2
≥768px
3
≥1024px
4

Este es el código; los elementos de lista contienen imágenes y textos encerrados en la etiqueta figure:

1
<ul class="clearfix">
2
  <li>
3
    <figure>
4
      <img src="path-to-the-image" alt="">
5
      <figcaption>Some description here</figcaption>
6
    </figure>
7
  </li>
8
       
9
  <!-- more list items here -->
10
</ul>

Este es el CSS que da estilo al diseño:

1
/* stylistic styles */
2
body {
3
  width: 80%;
4
  max-width: 1200px;
5
  margin: 40px auto;
6
  font: normal 14px/1.5 "Montserrat", "Helvetica Neue", sans-serif;
7
  background: #cfd8dc;
8
  color: #37474f;
9
}
10
11
figure {
12
  background: whitesmoke;
13
  margin: 0 0 40px;
14
  box-shadow: 0px 2px 4px rgba(0,0,0,0.2);
15
}
16
17
figcaption {
18
  padding: 20px;
19
}
20
21
img {
22
  max-width: 100%;
23
  height: auto;
24
  display: block;
25
}
26
27
.clearfix:after {
28
  content: "";
29
  display: table;
30
  clear: both;
31
}
32
33
ul {
34
  margin: 0;
35
  padding: 0;
36
}
37
38
/* structural styles */
39
40
li {
41
  list-style-type: none;
42
  float: left;
43
  padding-left: 15px;
44
  padding-right: 15px;
45
  box-sizing: border-box;
46
}
47
48
/* media queries */
49
50
@media screen and (min-width: 400px) {
51
  li {
52
    width: 50%;
53
  }
54
}
55
56
@media screen and (min-width: 768px) {
57
  li {
58
    width: 33.333%;
59
  }
60
}
61
62
@media screen and (min-width: 1024px) {
63
  li {
64
    width: 25%;  
65
  }    
66
}

Fíjate en los media queries al final. Se encargan de indicar el ancho de las tarjetas en los diferentes tamaños de ventana. Este es el resultado:

El problema de este diseño fluido es que, al no despejar cada nueva fila, algunas tarjetas se quedan atascadas cuando tratan de encontrar su camino hacia el lado izquierdo.

Identificando las tarjetas a despejar

Según el ejemplo anterior, cuando la fila contiene cuatro tarjetas, tenemos que despejar la quinta, la novena, y así sucesivamente. Para conseguirlo, usaremos la pseudo-clase CSS :nth-of-type(an+b) donde el parámetro an+b representa el patrón de repetición deseado. Por ejemplo, en pantallas grandes (ej: ≥1024px), usaremos 4n+1. Esta fórmula busca cada elemento que sea factor de cuatro, y entonces selecciona el siguiente elemento.

Así es como podemos cambiar nuestros media queries para alterar qué tarjetas deben ser despejadas:

Ventana Nº de columnas Patrón de repetición
<400px
1 -
≥400px
2 2n+1
≥768px
3 3n+1
≥1024px
4 4n+1

Y aquí está el CSS que lo hace. Date cuenta que nuestros media queries son acumulativos, por lo que tenemos que reiniciar la última tarjeta despejada cada vez que vayamos a definir una nueva:

1
 
2
@media screen and (min-width: 400px) {
3
  li {
4
    width: 50%;
5
  }
6
    
7
  li:nth-of-type(2n+1) {
8
    clear: left;
9
  }
10
}
11
	
12
@media screen and (min-width: 768px) {
13
  li {
14
    width: 33.333%;
15
  }
16
  
17
  li:nth-of-type(2n+1) {
18
    clear: none;
19
  }
20
  
21
  li:nth-of-type(3n+1) {
22
    clear: left;
23
  }
24
}
25
26
@media screen and (min-width: 1024px) {
27
  li {
28
    width: 25%;  
29
  }    
30
  
31
  li:nth-of-type(3n+1) {
32
    clear: none;
33
  }
34
  
35
  li:nth-of-type(4n+1) {
36
    clear: left;
37
  }
38
}

Por último, cabe destacar lo siguiente:

  • En vez de usar la propiedad clear:left, podemos usar clear:both que es más genérica.
  • En vez de usar la pseudo-clase CSS :nth-of-type(an+b), podemos usar :nth-child(an+b).

Ahora que hemos analizado uno de los métodos para despejar los floats, para ampliar nuestros conocimientos vamos a echar un vistazo al método que usa Bootstrap.

Usando el método de Bootstrap

Aprovechándonos del sistema de rejilla de Bootstrap, podremos crear un diseño adaptable similar al anterior. Una vez más, dependiendo del tamaño de la ventana, nuestro diseño será diferente:

Ventana Nº de columnas
<768px
2
≥768px
3
≥992px
3
≥1200px
4

Aquí está el código HTML necesario, indicando que nuestros elementos de lista deben ocupar seis de las doce columnas en ventanas muy pequeñas, cuatro columnas en ventanas pequeñas, y tres columnas en ventanas grandes:

1
<div class="container">
2
  <ul class="row">
3
    <li class="col-xs-6 col-sm-4 col-lg-3">
4
      <figure>
5
        <img src="path-to-the-image" alt="" class="img-responsive">
6
        <figcaption>Some description here</figcaption>
7
      </figure>
8
    </li>
9
    
10
    <!-- more list items here -->
11
  </ul>
12
</div>

Normalmente, este código es todo lo que necesitamos, suponiendo que todas las columnas tengan la misma altura. Sin embargo, en nuestro ejemplo las columnas tienen diferentes alturas, así que necesitaremos despejar los floats. Para ello, usaremos la clase clearfix, así como las clases preparadas para diseños adaptables.

Primero, en pantallas muy pequeñas (<768px), tenemos un diseño de dos columnas, por lo tanto debemos despejar los floats después de cada segundo elemento de lista. Añade el siguiente código después de cada segundo elemento de lista:

1
<li class="clearfix visible-xs-block"></li>

A continuación, en pantallas pequeñas y medianas (≥768px y <1200px), tenemos un diseño de tres columnas, por lo que necesitamos despejar los floats después de cada tercer elemento de lista. Para ello, añadiremos algo de código adicional después de cada tercer elemento de lista (no es necesario para el último elemento):

1
<li class="clearfix visible-sm-block visible-md-block"></li>

Por último, en pantallas grandes (≥1200px), tenemos un diseño de cuatro columnas, por lo que debemos despejar los floats después de cada cuarto elemento de lista. De nuevo, añade algo más de código, esta vez después de cada cuarto elemento de lista:

1
<li class="clearfix visible-lg-block"></li>

Estos bloques adicionales ensucian un poco el código (a mucha gente no le gusta usar código para organizar los estilos), pero se consigue el mismo resultado final que en nuestro método inicial. Cada uno de estos elementos de lista está oculto, excepto bajo ciertos puntos de ruptura que asumen display:block; entonces es cuando actúan eficazmente como divisores horizontales invisibles entre nuestras filas.

Aquí está la demostración asociada:

Conclusión

En este pequeño artículo, hemos visto dos sencillas ténicas para crear diseños adaptables con floats. A pesar de que los floats no vayan a ser (y no deberían serlo) la primera opción en tus diseños adaptables, espero que estas técnicas te resulten útiles en algún momento. Si estás usando cualquier otra técnica, ¡asegúrate de compartirla con nosotros!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.