6. Diseño Responsivo

En anteriores temas hemos visto como con grid y flex ya podíamos hacer algunas cosas que se ajustaran al tamaño de la pantalla, lo que llamamos responsivo. En este tema vamos a ver mas formas de hacer responsivo una página.

Mas información:

La Guía para Principiantes del Diseño Web Responsivo (muestras de códigos y ejemplos de diseño)

Responsivo vs Adaptativo

Hacer un diseño responsivo es que la misma página se adapte a distintos tamaños de pantalla. Hacer un diseño adaptativo es hacer páginas distintas según el tamaño de la pantalla.

Ejemplo de diseño adaptativo es la página de AliExpress:

https://es.aliexpress.com/: Versión para escritorio

https://m.es.aliexpress.com/: Versión para móvil.

La ventaja de las webs adaptativas es que en la versión móvil solo se cargan las cosas que se necesitan para el movil además de que está hecha pensando en móvil. El inconveniente es que hay que desarrollar dos páginas.

viewport

Añadir a todas las páginas la siguiente linea en el <head> del HMTL

Con esto se consigue que la página tenga el tamaño del dispositivo, ya que sino se pone , el dispositivo podría hacer que la página se haga mas grande y crear barras de desplazamiento.

Mas información:

Responsive Meta Tag

Usando la etiqueta meta viewport para controlar la composición en los navegadores móviles

Configurar la ventana de visualización

Todo sobre la cabecera <HEAD>

Unidades

View Port

Podemos hacer ciertos tamaños que sean en función del tamaño de la pantalla. Para ello se usan las unidades como vw o vh que hacen referencia al tamaño de la pantalla. CSS Viewport Units: A Quick Start

vh Es la altura de la ventana. Un valor de 1vh es igual al 1% del alto.

vw Es el ancho de la ventana. Un valor de 1vw es igual al 1% del ancho.

vmin Mínimo entre el ancho y el alto. Es la dimensión más pequeña de la ventana. Si el alto de la ventana gráfica es menor que el ancho, el valor de 1vmin será igual al 1% de la altura. De manera similar, si el ancho es menor que la altura, el valor de 1vmin será igual al 1% del ancho.

vmax Máximo entre el ancho y el alto. Es la dimensión más grande de la ventana. Si el alto de la ventana gráfica es mayor que el ancho, el valor de 1vmin será igual al 1% de la altura. De manera similar, si el ancho es mayor que la altura, el valor de 1vmin será igual al 1% del ancho.

En el ejemplo anterior, el tamaño de la fuente se hace mas grande a medida que se hace mas ancha la ventana.

Podemos pensar que 100vw es similar a 100%, pero hay dos diferencias Difference between Width:100% and width:100vw?.

100% hace referencia al tamaño de donde está el elemento donde estamos , no al tamaño de la ventana.

100% no incluye el tamaño de las barras de desplazamiento , mientras que 100vw si que lo hace.

Para ésto último a veces se hace lo siguiente:

rem

La unidad rem hace referencia al tamaño de fuente del HTML. El tamaño en píxeles se obtiene de multiplicar el valor de rem por el tamaño de la fuente de la página

em

La unidad rem hace referencia al tamaño de fuente del elemento donde está. El tamaño en píxeles se obtiene de multiplicar el valor de em por el tamaño de la fuente de ese elemento

Mi recomendación es usar siempre px ya que con los modificadores responsivos y nuestro sistema de tamaños , podemos controlar como queda todo.

Cálculos en CSS

Podemos usar funciones en CSS para calcular valores.

Introducción a las funciones Min, Max, y Clamp de CSS

La función calc() en CSS

min()

Retorna el mínimo de los dos valores.

En el ejemplo el tamaño máximo de la fuente nunca será mayor que 100px por mucho que se haga grande la ventana.

max()

Retorna el máximo de los dos valores.

En el ejemplo el tamaño mínimo de la fuente nunca será menor que 40px por mucho que se haga pequeña la ventana.

clamp()

Retorna un valor pero sin ser menos que un mínimo ni mayor que un máximo

En el ejemplo el tamaño mínimo de la fuente nunca será menos que 40px por mucho que se haga pequeña la ventana ni será mayor que 100px por mucho que se haga grande la ventana.

Mas información:

Linearly Scale font-size with CSS clamp() Based on the Viewport

calc()

Permite hacer cálculos en CSS

Imágenes

Hay muchas opciones al respecto de las imágenes responsivas. La técnica consiste principalmente en usar una imagen u otra en función de:

Ancho o alto del dispositivo

Pixel-ratio del dispositivo

Tipos soportados por el navegador.

Una explicación completa la puedes ver en el siguiente enlace: Responsive Images.

Aquí solo vamos a ver como carga una imagen u otra en función del ancho del dispositivo.

Veamos un ejemplo: Según la resolución , no queremos cargar siempre la misma imagen sino que cambiamos la perspectiva de la foto ya que tenemos menos sitio.

Pantallas grandes:

Pantallas medianas:

Pantallas pequeñas:

Tablas

Para hacer tablas responsivas, realmente lo único que podemos hacer es que haya barras de Scroll. Para eso ponemos un div sobre la tabla con la propiedad overflow: auto;

Mas información:

Under-Engineered Responsive Tables

Under-Engineered Responsive Table Example

CSS Media Queries

Permiten tener un CSS distinto según el tamaño de la pantalla

Como vemos para cada resolución se usa un CSS distinto y por lo tanto el tamaño es distinto según la resolución.

Véase como el CSS por defecto es para tamaños menores de 576px. Es lo que se llama Mobile First Design. Es decir que por defecto el CSS es para móviles y luego ya se añade CSS para otros tamaños. En el ejemplo siguen casi los tamaños que se usan en El sistema de Grid de Bootstrap

Arquitectura responsiva

Pasemos ahora a ver como poder hacer las cosas responsivas con una simple arquitectura.

En el ejemplo por defecto el tamaño de la fuente será de 40px pero en resoluciones mayores de 992px será de 55px.

Lo que hacemos es crear todas los modificadores globales o modificadores de bloques para las distintas resoluciones pero añadiendo el sufijo @movil , @tablet o @desktop. E indicando en el HTML que tamaño usar según la resolución de la pantalla.

Otro ejemplo de ello lo podemos ver en Notes on using CSS Grid in production

Menu responsivo

menu.zip

Resumen técnicas responsivas

Hemos visto varias formas de hacer las cosas responsivas. Veamos ahora una tabla en la que se explican las 4 formas posibles:

Interno	Externo
Fluido	a	b
Escalonado	c	d

Ejercicios

Ejercicio 1

Crea una página HTML con lo siguiente:

1 div cuadrado azul de tamaño 200px

1 div cuadrado verde de tamaño 200px

1 div cuadrado azul de tamaño 400px

1 div cuadrado verde de tamaño 400px

Dentro cada cuadrado azul , añade otro div de color rojo con tamaño 10%

Dentro cada cuadrado verde , añade otro div de color rojo con tamaño 10vw

Ahora:

Explica la diferencia de tamaños entre los de 10% y 10vw

Ahora cambia el tamaño de la página y mira como de modifica el tamaño de los cuadrados. Indica cuales han cambiado de tamaño y explica porqué han cambiado de tamaño

Ejercicio 2

Crea una página HTML con lo siguiente:

3 divs cuadrados de 200 pixeles de lado cada uno, de colores

Rojo

Verde

Azul (Que tenga Tamaño de fuente 20px)

De forma que:

Que el cuadrado Rojo se indique su tamaño usando px

Que el cuadrado Verde se indique su tamaño usando rem

Que el cuadrado Azul se indique su tamaño usando em

Añade ahora el siguiente CSS:

Y comprueba que solo se ha modificado el tamaño del cuadrado Verde.

Ejercicio 3

Crea una página HTML con lo siguiente:

Un div cuadrado de color rojo de forma que como mínimo tenga 100px pero a medida que el ancho de la pantalla se hace mas grande , se hagan también mas grande el cuadrado.

Un div cuadrado de color verde de forma que como máximo tenga 800px pero a medida que el ancho de la pantalla se hace mas pequeña, se hagan también mas pequeño el cuadrado.

Un div cuadrado de color azul de forma que como máximo tenga 800px, de tamaño mínimo tenga 100px, pero a medida que el ancho de la pantalla se hace mas pequeña, se hagan también mas pequeño el cuadrado y si se hace mas grande el ancho de la pantalla, también se haga mas grande el cuadrado.

Un div cuadrado de color rosa de forma que su tamaño siempre sea la mitad de la pantalla mas 20px

Un div cuadrado de color amarillo de forma que su tamaño siempre sea la mitad de la pantalla mas 20px pero no pueda ser menor que 100px ni mayor que 600px

Ejercicio 4

Haz una página HTML de forma que se cargue una imagen distinta según el siguiente ancho de la pantalla:

menos de 500px

entre 500px y 1000px

mas de 1000px

Ejercicio 5

Dado el típico layout de cabecera, menú lateral, cuerpo y pie. Haz una página HTML pero de forma que si el tamaño de la pantalla es menor que 500px no se vea el menú lateral. Deberás hacerlo usando BEM

Ejercicio 6

Crea modificadores globales para las siguientes propiedades CSS:

width

min-width

max-width

Los posibles valores de cada uno de ellos serán: 100px, 150px , 200px, 250px, 300px, 350px, 400px, 450px, 500px, 550px, 600px

Crea también otro modificador global para overflow: auto;

Crea una clase BEM para tablas HTML de forma que:

La tabla tendrá alrededor un borde y un sombreado

Las cabeceras de la tabla serán de otro color.

Con todo los anterior, haz una página HTML con una tabla en la que:

Haya columnas que tengan un ancho mínimo y otro máximo

Haya columnas que tengan un ancho fijo

Haya una columna que tengan un ancho mínimo

Que si la tabla no cabe, aparezcan las barras de scroll.

Ejercicio 7

Modifica el ejercicio anterior de forma que ahora los modificadores globales se puedan usar de forma responsiva con

@movil

@tablet

@desktop

Modifica el ejemplo de la tabla HTML de forma que las columnas ahora tenga siempre tamaños fijos (es decir no usar min o max), pero que cambien según la resolución de la pantalla.

Ejercicio 8

Usando las clases de BEM y los modificadores globales que has ido usando durante el curso, añade de forma que ahora se puedan usar de forma responsiva con

@movil

@tablet

@desktop

Ejercicio 9

Modifica la página del tema anterior para hacerla responsiva de forma que según la resolución se cambie el tamaño :

El tamaño de los títulos

Los padding

Los margins

Los menús sean responsivos. Es decir que cuando la pantalla es pequeña, se muestre la "hamburguesa"

Se oculten imágenes en tamaños pequeños.