Imágenes de fondo responsivas con relación de aspecto fijo o fluido

by Janeth Kent Date: 06-05-2021 css

¿Cuál es la forma más fácil de escalar las imágenes de fondo en los diseños responsivos? Utilizamos una antigua técnica y la mejoramos para cambiar con fluidez la ratio de aspecto de las imágenes de fondo.

Los diseños responsivos permiten escalar dinámicamente el ancho de un sitio web para que se adapte tanto a los dispositivos móviles pequeños como a los ordenadores de sobremesa más grandes.

Un elemento <img> con una anchura porcentual tendrá su altura ajustada automáticamente. Su relación de aspecto sigue siendo la misma cuando se redimensiona.

Si queremos conseguir lo mismo con las imágenes de fondo, debemos averiguar cómo mantener la proporción de un elemento HTML.

 

Relación de aspecto fija

 

El truco que utilizaremos para mantener la relación de aspecto es aplicar un relleno vertical. Establecemos el relleno como un porcentaje basado en la anchura del elemento. Esta técnica se describió originalmente para los vídeos incrustados en un antiguo artículo de A List Apart, pero funciona igual de bien para cualquier elemento.

Supongamos que queremos tener una imagen de 800 por 450 píxeles. Queremos crear un elemento que mantenga la relación de aspecto de 16:9 cuando cambie su anchura. A continuación se muestra un ejemplo de código. En este ejemplo utilizamos px, pero funciona igualmente bien con unidades em. También utilizamos el elemento figure de HTML5.

 
 
<div class="column">
<figure class="fixedratio"></figure>
</div>
div.column {
max-width: 800px;
}
figure.fixedratio {
padding-top: 56.25%;  /* 450px/800px = 0.5625 */
}
 

Añadir una imagen de fondo

 

El elemento se escala y mantiene su relación de aspecto. Pero si añadimos una imagen de fondo no se escalará automáticamente junto con el elemento. Para conseguirlo añadimos background-size: cover.

Debemos asegurarnos de que la imagen es al menos tan ancha como el max-width del elemento. De esta manera el elemento nunca será más grande que la imagen. Si el elemento es más pequeño que la imagen se recortará.

<div class="column">                  
<figure class="fixedratio"></figure>                
</div>
div.column {
max-width: 800px;
}
figure.fixedratio {
padding-top: 56.25%;  /* 450px/800px = 0.5625 */
background-image: url(http://voormedia.com/examples/north-sea-regatta.jpg);
background-size: cover;
}
 

Relación de aspecto del fluido

 

Podemos ir un paso más allá. Supongamos que tenemos una imagen de pantalla ancha que se ve muy bien en un ordenador de sobremesa. En un dispositivo móvil no queremos utilizar la misma relación de aspecto o la imagen será demasiado pequeña. Tampoco queremos utilizar exactamente la misma altura o la imagen será demasiado alta. En su lugar, la altura debería disminuir gradualmente cuando se reduzca la anchura. A esto lo llamamos relación de aspecto fluida.


El efecto puede lograrse disminuyendo el relleno porcentual y estableciendo una altura en el elemento. Supongamos que la imagen grande es de 800 por 200 píxeles y decidimos que la imagen debe tener sólo 150 píxeles de altura cuando el ancho se reduce a 300 píxeles. Ahora tenemos que calcular los atributos height y padding-top.


El diagrama anterior muestra la relación entre las dos dimensiones. La pendiente de la línea corresponde al atributo padding-top. La altura inicial corresponde al atributo height. Representa la altura que tendría el elemento si su ancho fuera cero.

Podemos implementar una relación de aspecto fluida ajustando el ejemplo con estos valores calculados.

<div class="column">
<figure class="fluidratio"></figure>
</div>
div.column {
max-width: 800px;
}
figure.fluidratio {
padding-top: 10%; 
height: 120px; 
background-image: url(http://voormedia.com/examples/amsterdam.jpg);
background-size: cover;
}
 

Utilizar SCSS para los cálculos

 

Es posible calcular manualmente los atributos padding-top y height correctos. Por supuesto, también puedes jugar con ellos hasta que se vean bien. Pero una opción más segura es utilizar un preprocesador de CSS como SCSS para que calcule automáticamente los valores por ti. Aquí hay un ejemplo de implementación que genera el CSS mostrado arriba.

@mixin fluid-ratio($large-size, $small-size) {
$width-large: nth($large-size, 1);
$width-small: nth($small-size, 1);
$height-large: nth($large-size, 2);
$height-small: nth($small-size, 2);
$slope: ($height-large - $height-small) / ($width-large - $width-small);
$height: $height-small - $width-small * $slope;
padding-top: $slope * 100%;
height: $height;
background-size: cover;
}
figure.fluidratio {
@include fluid-ratio(800px 200px, 300px 150px);
background-image: url(http://voormedia.com/examples/amsterdam.jpg);
}

Es posible hacer que cualquier elemento HTML escale su altura proporcionalmente a su anchura. Los elementos con un atributo padding-top porcentual se escalarán en función de su anchura. Para hacer que las imágenes de fondo se escalen en los navegadores modernos puedes añadir background-size: cover.

Para hacer que la relación de aspecto cambie gradualmente al cambiar de tamaño, establece también el atributo height. Sobre la base de dos tamaños con una relación de aspecto diferente se puede calcular la altura correcta y el padding vertical.

 
by Janeth Kent Date: 06-05-2021 css visitas : 2134  
 
Janeth Kent

Janeth Kent

Licenciada en Bellas Artes y programadora por pasión. Cuando tengo un rato retoco fotos, edito vídeos y diseño cosas. El resto del tiempo escribo en MA-NO WEB DESIGN AND DEVELOPMENT.

 
 
 

Artículos relacionados

Nuevas unidades de ventana gráfica - CSS

'Intercop 2022' es un proyecto anunciado por Google, Microsoft, Apple y la fundación Mozzilla para que todos los navegadores ofrezcan la misma experiencia web. El proyecto tiene 15 áreas de enfoque…

Container queries: libera el poder de escribir media queries

El diseño web responsivo ha sido una práctica común durante años, permitiendo que los sitios se adapten y se vean bien en una variedad de dispositivos y tamaños de pantalla.…

¿Por qué no deberíamos usar el color negro?

A día de hoy es cada vez más frecuente que las páginas cuenten con la opción de ponerlas en modo oscuro, o que directamente basen su estética en los colores…

Utilidades de los selectores :where y :is

Si aún no has oído hablar de estos selectores de pseudoclases, no te preocupes, aquí te explicamos el funcionamiento y dejamos varios usos que nos pueden ser muy útiles a…

Cómo centrar un Div con CSS - 10 formas diferentes

Para los desarrolladores web, a veces centrar un div parece uno de los trabajos más difíciles del mundo. Pues ya no. En este artículo, aprenderás 10 formas diferentes de centrar un…

Como hacer tu propio cursor personalizado para tu web

Cuando empecé a ojear webs distintas y originales para aprender de ellas, de las primeras cosas que me llamaron la atención fue que algunas de ellas tenían sus propios cursores,…

Explorando la API CSS Paint: Redondeo de formas parte 2

Vamos con la segunda parte de nuestro artícul sobre como manejar la API Paint para redondar bordes complejos   Control de los radios   En todos los ejemplos que hemos visto, siempre consideramos un…

Explorando la API de CSS Paint: Redondeo de formas parte 1

Añadir bordes a las formas complejas es un auténtico rollo (a veces), pero redondear las esquinas de las formas complejas es un suplicio jejeje. Por suerte, la API de pintura…

Las ventanas gráficas o viewports grandes, pequeñas y dinámicas

Recientemente se han introducido algunos cambios en materia de unidades de ventana gráfica o viewport. Las novedades -que forman parte de la especificación de valores y unidades CSS de nivel 4-…

Comenzando con Bootstrap-Vue paso a paso

Hoy te mostraremos cómo usar BootstrapVue, describiremos el proceso de instalación y mostraremos la funcionalidad básica. El proyecto está basado en el framework CSS más popular del mundo - Bootstrap, para…

Bootstrap 5 beta2. ¿Qué ofrece?

Dado que el lanzamiento de Bootstrap 4 es de tres años, en este artículo vamos a presentar lo que es nuevo en el marco más popular del mundo para la…

Creación de un sencillo spinner-loader CSS

En el artículo de hoy mostraremos cómo animar un loader básico que gira cuando se define alguna acción predefinida, como cargar una imagen. Eso se puede utilizar en un sitio…

Clicky