Tema
Imágenes
Las imágenes suelen ser lo que más pesa en un sitio web y, a la vez, lo que más vende. En esta lección aprenderás a insertarlas correctamente, a elegir el formato ideal, a optimizarlas y a servir la imagen adecuada para cada pantalla. Esto impacta directamente en la velocidad, el SEO y la experiencia de tus clientes.
Concepto
Una imagen en HTML no se "pega" dentro del documento: el HTML solo contiene una referencia al archivo, y el navegador lo descarga aparte. Por eso cada imagen pesada es una descarga más que hace esperar al usuario, sobre todo en datos móviles.
El elemento básico es <img>, un elemento vacío:
html
<img src="img/latte.webp" alt="Latte con arte en forma de corazón" width="800" height="600">src: ruta del archivo (relativa o absoluta).alt: texto alternativo (obligatorio).widthyheight: dimensiones intrínsecas en píxeles (muy recomendados).
El atributo alt
El alt describe la imagen para quien no puede verla: personas ciegas con lector de pantalla, usuarios con imágenes bloqueadas o mala conexión, y Google.
html
<!-- ✅ Describe lo que importa en este contexto -->
<img src="barista.jpg" alt="Barista sirviendo leche sobre un espresso">
<!-- ✅ Imagen dentro de un enlace: describe el destino -->
<a href="/"><img src="logo.svg" alt="Café Aroma - Ir al inicio"></a>
<!-- ✅ Imagen decorativa: alt vacío para que el lector la ignore -->
<img src="adorno-granos.svg" alt="">
<!-- ❌ Mal -->
<img src="foto1.jpg" alt="imagen">
<img src="foto1.jpg" alt="foto1.jpg">
<img src="foto1.jpg"> <!-- sin alt: el lector lee el nombre del archivo -->Consejos para un buen alt:
- No empieces con "Imagen de…" o "Foto de…": el lector ya anuncia que es una imagen.
- Sé breve (una frase) y concreto.
- Si la imagen contiene texto (un banner con "50% de descuento"), ese texto debe estar en el
alt.
Formatos de imagen
| Formato | Ideal para | Transparencia | Animación | Notas |
|---|---|---|---|---|
| JPG | Fotografías | No | No | Universal; buena compresión con pérdida. |
| PNG | Capturas, gráficos con texto, transparencia | Sí | No | Sin pérdida; pesa mucho en fotos. |
| WebP | Casi todo (fotos y gráficos) | Sí | Sí | 25–35% más ligero que JPG. Soporte universal moderno. |
| AVIF | Fotos de alta calidad | Sí | Sí | Aún más ligero que WebP; codificación más lenta. |
| SVG | Logos, iconos, ilustraciones | Sí | Sí (CSS) | Vectorial: se ve nítido a cualquier tamaño. |
| GIF | Animaciones simples (antiguo) | Sí (1 bit) | Sí | Pesadísimo; mejor usa video MP4 o WebP. |
Regla práctica para proyectos de clientes:
- Logos e iconos → SVG.
- Fotos → WebP (o AVIF con respaldo).
- Capturas de pantalla → WebP o PNG.
Optimización
Una foto directa de un celular puede pesar 4–8 MB y medir 4000px de ancho. En una web basta con 100–300 KB. Proceso profesional:
- Redimensiona al tamaño máximo en que se mostrará (por ejemplo 1600px para un hero a pantalla completa, 800px para una tarjeta).
- Comprime y convierte a WebP/AVIF con herramientas como Squoosh, TinyPNG o la línea de comandos (
sharp,cwebp). - Nombra los archivos de forma descriptiva:
latte-arte-corazon.webp, noIMG_20260312.jpg(también ayuda al SEO). - Para SVG, limpia el código con SVGOMG.
Buena práctica
Como referencia: un hero no debería pasar de ~250 KB, y las imágenes de tarjetas de ~80 KB. Revisa el peso total en la pestaña Network de las herramientas de desarrollador.
width y height: evita saltos de diseño
Si no indicas width y height, el navegador no sabe cuánto espacio reservar hasta que la imagen se descarga, y el contenido "salta" hacia abajo. Google mide esto como CLS (Cumulative Layout Shift) y penaliza los sitios que saltan.
html
<img src="latte.webp" alt="Latte" width="800" height="600">css
/* Con este CSS la imagen sigue siendo responsive y conserva su proporción */
img {
max-width: 100%;
height: auto;
}Los valores de width/height son las dimensiones reales del archivo (o su proporción); el tamaño visual lo controla CSS.
Carga diferida: loading="lazy"
html
<img src="galeria-1.webp" alt="Mesa con postres" width="600" height="400" loading="lazy">Con loading="lazy" la imagen solo se descarga cuando el usuario se acerca a ella al hacer scroll. Ahorra datos y acelera la carga inicial.
Error común
Poner loading="lazy" en la imagen principal (hero o logo) que se ve al abrir la página. Eso la retrasa. Para esa imagen usa lo contrario: fetchpriority="high".
html
<!-- Imagen principal, visible al cargar -->
<img src="hero.webp" alt="Interior de la cafetería" width="1600" height="900" fetchpriority="high">Imágenes responsivas: srcset y sizes
¿Para qué descargar una imagen de 1600px en un celular de 390px de ancho? Con srcset le das al navegador varias versiones y él elige la mejor:
html
<img
src="cafe-800.webp"
srcset="cafe-400.webp 400w,
cafe-800.webp 800w,
cafe-1600.webp 1600w"
sizes="(max-width: 600px) 100vw,
(max-width: 1200px) 50vw,
600px"
alt="Taza de café sobre una mesa de madera"
width="1600" height="1067"
loading="lazy">Cómo leerlo:
srcset: lista de archivos con su ancho real (400w= 400 píxeles de ancho).sizes: qué ancho ocupará la imagen en pantalla: en pantallas de hasta 600px ocupa el 100% del viewport; hasta 1200px, la mitad; en pantallas más grandes, 600px fijos.src: respaldo para navegadores antiguos.
El navegador combina sizes con la densidad de la pantalla (las pantallas retina tienen 2 o 3 píxeles por punto) y descarga el archivo más pequeño que se vea nítido.
Para imágenes de tamaño fijo (como un logo de 200px) puedes usar descriptores de densidad:
html
<img src="logo.png" srcset="logo.png 1x, logo@2x.png 2x" alt="Café Aroma" width="200" height="60">El elemento picture
<picture> te da control total. Dos usos principales:
1. Formatos modernos con respaldo
html
<picture>
<!-- El navegador usa la primera fuente que soporte -->
<source srcset="hero.avif" type="image/avif">
<source srcset="hero.webp" type="image/webp">
<!-- img es obligatorio: respaldo y lugar donde van alt, width, height -->
<img src="hero.jpg" alt="Interior de la cafetería" width="1600" height="900">
</picture>2. Dirección de arte (distinta imagen según pantalla)
html
<picture>
<!-- En móvil, una foto vertical recortada -->
<source media="(max-width: 600px)" srcset="hero-vertical.webp">
<!-- En escritorio, la foto panorámica -->
<img src="hero-panoramica.webp" alt="Barra de la cafetería" width="1600" height="700">
</picture>figure y figcaption
Cuando una imagen tiene un pie de foto, envuélvela en <figure>:
html
<figure>
<img src="productores.webp" alt="Familia de productores en un cafetal de Veracruz" width="800" height="533" loading="lazy">
<figcaption>Nuestros granos vienen de productores de Coatepec, Veracruz.</figcaption>
</figure><figure> también sirve para gráficas, diagramas, fragmentos de código o citas que se entienden por sí solos.
Imágenes de fondo en CSS o img
- Si la imagen es contenido (foto de producto, del equipo, de un platillo) →
<img>conalt. - Si es decoración (textura, degradado, fondo abstracto) →
background-imageen CSS.
Casos de uso reales
- Tienda en línea: fotos de producto en WebP con
srcset,loading="lazy"en la galería ywidth/heightpara evitar saltos. - Hero de una landing:
<picture>con AVIF/WebP/JPG,fetchpriority="high"y una versión vertical para móvil. - Logo: SVG en un enlace al inicio, con
altdescriptivo. - Portafolio de fotógrafo: miniaturas pequeñas que enlazan a la versión grande.
Ejercicios
- Escribe el código de una imagen de producto
taza-negra.webp(1200×1200) que se muestre perezosamente, con buenalty sin saltos de diseño. - Crea un
<picture>que sirvaequipo.avif, luegoequipo.webpy como respaldoequipo.jpg, con pie de foto "Nuestro equipo en 2026". - Escribe un
srcsetcon versiones de 480, 960 y 1440px para una imagen que ocupa todo el ancho en móvil y un tercio en pantallas mayores a 900px.
Ver solución
html
<!-- Ejercicio 1 -->
<img src="img/taza-negra.webp" alt="Taza de cerámica negra mate de 350 ml"
width="1200" height="1200" loading="lazy">
<!-- Ejercicio 2 -->
<figure>
<picture>
<source srcset="img/equipo.avif" type="image/avif">
<source srcset="img/equipo.webp" type="image/webp">
<img src="img/equipo.jpg" alt="Cinco baristas sonriendo detrás de la barra"
width="1200" height="800" loading="lazy">
</picture>
<figcaption>Nuestro equipo en 2026</figcaption>
</figure>
<!-- Ejercicio 3 -->
<img
src="img/foto-960.webp"
srcset="img/foto-480.webp 480w, img/foto-960.webp 960w, img/foto-1440.webp 1440w"
sizes="(min-width: 900px) 33vw, 100vw"
alt="Granos de café recién tostados"
width="1440" height="960" loading="lazy">Resumen
<img>necesitasrc,alty, de preferencia,widthyheight.altdescribe la imagen; usaalt=""para imágenes decorativas.- SVG para logos e iconos; WebP/AVIF para fotos; optimiza siempre antes de subir.
loading="lazy"para imágenes fuera de pantalla;fetchpriority="high"para la principal.srcset+sizessirven el tamaño adecuado;<picture>permite formatos modernos y dirección de arte.<figure>+<figcaption>para imágenes con pie de foto.