Hoja de notas de duduromeroa.com
Revisado en Using responsive images in HTML
Con elemento picture responsivo
The Picture element
El objetivo es indicar que, en ciertos anchos de ventana de navegador, se muestre cada imagen con:
Elemento <picture>
Elemento <source>
media=""
media=""
contiene valor par de dirección de orientación srcset="..."
Elemento <srcset="...">
Ejercicio 1
media="(orientation: portrait)
será TRUE cuando el alto (de la ventana del navegador) sea mayor que su ancho. media="(orientation: landscape)
será TRUE cuando el ancho es mayor que el alto.media="(orientation: portrait)"
(quiere decir que inicia vertical). media="(orientation: landscape)"
(quiere decir que inicia horizontal). Solo debe usarse estas propiedades en el elemento hijo <img src="...
Ejercicio 2
<source media="(min|max - width|height: 000px)">
Recordemos que la propiedad media="..."
indica una condición a cumplir. Pero esta vez indicará los valores máximos o mínimos según unidad de dimensión (width o height).
Ejercicio 3
min-width...
un poco más ancho que el ancho que el propio ancho de la imagen.Ejercicio 4
Usando valores media="min-height:...
Indica cuántos píxeles físicos (reales) caben dentro de un solo píxel CSS en pantalla.
Sin embargo, cada navegador mostrará con ligeras diferencias esas dimensiones.
En otras palabras, una pantalla con relación DPR de 1 (1:1) significa que por cada px en pantalla (o px CSS) se mostrará un px en físico.
Y una pantalla con relación DPR de 2 (1:2) significa que por cada px en pantalla (o px CSS) se mostrarán DOS px en físico; por lo que se necesitará una imagen con el doble de resolución para poder verla con nitidez.
w como en la forma 120w
: Cuando la imagen cambia de tamaño en función del viewport (es fluida/responsiva). w como en la forma img@2x.png 2x
: Cuando la imagen tiene un tamaño fijo pero quieres adaptarte a diferentes densidades de pantalla.Es una unidad de medida abstracta de los navegadores para renderizar el contenido web de forma coherente en diferentes dispositivos, independientemente de la resolución real.
width
.div{width: 100px;}
siempre ocupará 100px en cualquier pantalla SIEMPRE QUE EL DPR (Device Pixel Ratio) de esa pantalla sea = 1¿Qué sucede si el DPR de ese navegador es de 2? Entonces esos 100px se mostrarán (renderizarán) con 200px; sin embargo, las dimensiones se verán iguales que con el DPR 1, pero el navegador escala el contenido para que en el mundo visual (lo que vos ves), todo siga siendo legible y proporcional.
<source srcset="..."
Descriptor de ancho (w)
Usar el literal w
cuando se desee usar imágenes responsivas.
img.png 100w,
sizes="(max-width: 600px) 100vw"
sizes
no elige imágenes. 100vw, 90vw
.src="imagenX.png"
srcset
Ejercicio 5
srcset="..."
se determinaron 3 imágenes.400.png 400w, 800.png 800w, 1200.png 1200w
sizes="(min-width: 505px) 90vw"
(es decir, cuando el navegador tenga 505px o más de ancho) la imagen ocupará el 90% relativo del viewport.x
de densidad de imagen Útil cuando NO se desea cambiar de tamaño ni de dirección vertical u horizontal, pero sí se desea aplicar una imagen más nítida con (mayor resolución) según condiciones dadas.
En otras palabras, el descriptor X sirve para intercambiar imágenes equivalentes (mismo contenido y proporción) pero con mayor densidad de píxeles.
Finalmente, el valor numeral 1x sí tiene una correspondencia directa con el devicePixelRatio (DPR) del dispositivo. Donde el DPR (device pixel ratio) de 1 es igual a una relación 1:1; y un DPR 2 tiene una relación de 1:2 (por cada un px se mostrarán dos pxs).
Así funciona:
Ejercicio 6
1x
. En otros dispositivos con DPR mayor a 1, entonces se elegirá según la imagen y su nomenclatura. La sintaxis usada en HTML fue:
<img
srcset="
img1x.png 1x,
img2x.png 2x,
img3x.png 3x"
src="img1x.png"
alt="Ejemplo de imagen con densidades">
Y el resultado (según el DPR de cada pantalla)
<source>
, en media="..."
en elemento <picture>media="(min-width: valorpx)"
media=""
sea excedido por el valor de ancho del navegador, se aplicará el llamado de la imagen según ese valor excedido.media=""
más pequeño, se aplicará la imagen por default (es decir, el llamado) del elemento <img src="default.png" ... >
Lo interesante es que esta dinámica puede hacerse directamente desde HTML, sin necesidad de la regla CSS background-image.
Ejercicio 7
La importancia de ordenar los valores de mayor a menor
Los valores deben ser ordenados de mayor valor a menor valor. ¿Por qué? No se supone que si voy abriendo el ancho del navegador de menor a mayor, entonces debería ordenar los valores así mismo (de menor a mayor)?.
Sin embargo, cuando se ordenan los valores de menor (primero) a mayor (final) la imagen elegida siempre será la primera versión. Esto es porque prioridad la establece el orden, no el valor del media.
Si se coloca primero el valor de ancho más pequeño (como min-width: 501px
) el sistema leerá siempre que "a más de 501px
llamar a esa versión de imagen"; entonces esa primera condición siempre se cumplirá, omitiendo evaluar las demás.
La sintaxis y el orden (de mayor a menor) para el siguiente ejemplo es:
<picture>
<!-- Llamar imagen si se cumple el exceso del ancho del browser con este valor -->
<source srcset="w04.png" media="(min-width: 1100px)">
<!-- Llamar si se cumple el exceso del ancho... -->
<source srcset="w03.png" media="(min-width: 830px)">
<!-- Llamar si se cumple el exceso del ancho... -->
<source srcset="w02.png" media="(min-width: 630px)">
<!-- Llamar si se cumple el exceso del ancho... -->
<source srcset="w01.png" media="(min-width: 501px)">
<!-- Llamar a esta imagen cuando el ancho del browser es menor al valor media menor -->
<img src="df.png" alt="MDN Web Docs">
</picture>
░░░░ ANEXOS ░░░░
Tipo de pantalla | Viewport aprox. | DPR | Ancho físico ideal |
---|---|---|---|
Teléfono básico | 320px | 1 | ~320px |
Teléfono moderno | 375px – 428px | 2 | ~750px – 850px |
Teléfono gama alta | 430px – 500px | 3 | ~1200px – 1500px |
Tableta | 768px – 1024px | 2 | ~1500px – 2000px |
Laptop / PC normal | 1024px – 1440px | 1 | ~1000px – 1400px |
Laptop Retina | 1440px – 1920px | 2 | ~2800px – 3840px |
srcset="..."
PARA ALCANZAR RELACIONES DE PÍXELES PROMEDIO En HTML
<html>
<img>
srcset="
// móviles básicos
imagen-400.jpg 400w,
// móviles retina / tablets
imagen-800.jpg 800w,
// tablets / laptops
imagen-1200.jpg 1200w,
// laptops grandes o pantallas retina
imagen-1600.jpg 1600w,
// pantallas 4K o retina grandes
imagen-2400.jpg 2400w"
/* COMPORTAMIENTO DE sizes=""
- Cuando el navegador tenga menos de 600px...
- ...mostrar la imagen al 90% del ancho del navegador.
- Cuando tenga más de 600px...
- ...mostrar la imagen solo a 600px de ancho
*/
sizes="(max-width: 600px) 90vw, 600px"
// Si el navegador es muy antiguo, usar esta
src="imagen-800.jpg" alt="Ejemplo responsive"
>
</html>
Ahora, el cálculo de por qué se elige una de las imágenes del srcset
:
// VALOR DEL ANCHO EN PXs (DEL VIEWPORT) EN TIEMPO REAL
var anchoViewportEnEsteMomento = 400;
// Valor en el atributo sizes=" " (Aqui está en VW, pero puede ser PX u otro)
var valorVWSizesQuery = 0.90;
// Depende del hardware y su densidad de pantalla
var devicePixelRatio = 1;
// Cálculo
// Predicción de espacio que ocupará la imagen cuando sea seleccionada
var anchoCSSdeImagen = anchoViewportEnEsteMomento * valorVWSizesQuery;
// Requisitos en px para que el sistema seleccione la imagen
var anchoImagenElegida = anchoCSSdeImagen * devicePixelRatio;
console.log("Se elegirá una imagen cercana o exacta a " + anchoImagenElegida + "px de ancho.");
// RESPUESTA
// Se elegirá una imagen cercana o exacta a 360px de ancho.