Hoja de notas de duduromeroa.com

Revisado en Using responsive images in HTML
Con elemento picture responsivo
The Picture element

INDICAR IMÁGENES HTML RESPONSIVE SOLO CON HTML

El objetivo es indicar que, en ciertos anchos de ventana de navegador, se muestre cada imagen con:

Elemento <picture>

Elemento <source>

Elemento <srcset="...">



Ejercicio 1 foto horizontal

Usando propiedades CSS 'object-position' y 'object-fit'

Solo debe usarse estas propiedades en el elemento hijo <img src="...

Ejercicio 2
responsive image


Usando <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 MDN



Ejercicio 4

Usando valores media="min-height:...

MDN




Entendiendo el Device Pixel Ratio (DPR)

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.


Descriptore W y X en el atributo srcset=""


Entendiendo el píxel CSS (o "píxel lógico")

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.

¿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.






Usando descriptores de ancho/alto (height/width) del atributo <source srcset="..."

Descriptor de ancho (w)

Usar el literal w cuando se desee usar imágenes responsivas.

Ejercicio 5

Logo



Usando el descriptor 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

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)

Ejemplo de imagen con densidades


Usando atributos <source>, en media="..." en elemento <picture>

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>

MDN Web Docs





░░░░ ANEXOS ░░░░

TABLA CON OPCIONES DE ANCHO DE IMÁGENES SEGÚN DEVICE PIXEL RATIO (relación de pixeles del dispositivo)

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


TABLA DE IMÁGENES 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.