Una imagen mal servida puede estropear dos métricas a la vez: si pesa demasiado retrasa el LCP, y si llega sin hueco reservado empuja el texto hacia abajo y sube el CLS. Las dos cosas se arreglan en el HTML, sin herramientas exóticas. Hay que decidir tres cosas para cada imagen: en qué formato, a qué tamaño y con qué atributos.
Elegir formato por tipo de imagen
La guía de MDN resume la recomendación general: para imágenes de mapa de bits, preferir WebP o AVIF, que suelen comprimir mejor que JPEG, PNG y GIF; para diagramas, gráficas e iconos que deben verse nítidos a cualquier tamaño, SVG. MDN cita que el WebP con pérdida queda, de media, entre un 25 % y un 35 % por debajo de un JPEG de calidad visual parecida. Hoy los navegadores principales admiten WebP y AVIF, pero MDN sigue aconsejando ofrecer una alternativa en JPEG o PNG con <picture> cuando uses AVIF.
| Formato | Úsalo para | Evítalo para | Nota |
|---|---|---|---|
| JPEG | Fotografías cuando necesitas máxima compatibilidad o como alternativa en <picture> | Capturas con texto, logotipos, transparencias | Con pérdida, sin canal alfa |
| PNG | Capturas de pantalla, imágenes con transparencia que necesitan reproducción exacta | Fotografías (pesan mucho más que en JPEG o WebP) | Sin pérdida |
| WebP | Fotografías (con pérdida) y capturas o transparencias (sin pérdida) | Ilustraciones vectoriales sencillas | Admite ambos modos y transparencia |
| AVIF | Fotografías donde cada kilobyte cuenta, como la imagen principal | Casos donde el tiempo de codificación en tu flujo es un problema | MDN recomienda alternativa con <picture> |
| SVG | Logotipos, iconos, diagramas, gráficas | Fotografías | Vectorial; un SVG con miles de nodos también pesa |
Criterio de taller: si la imagen tiene bordes nítidos y pocos colores, piensa primero en SVG o WebP sin pérdida; si tiene degradados y textura de foto, en AVIF o WebP con pérdida. Las ilustraciones de este sitio, por ejemplo, son SVG de pocos kilobytes.
El tamaño justo: srcset y sizes
El error más común no es el formato, sino servir una foto de 2400 píxeles a una columna que mide 800. El navegador la descarga entera y luego la reduce. Con srcset le ofreces varias versiones con su ancho real (descriptor w), y con sizes le dices qué ancho ocupará la imagen en la maqueta. Con esas dos pistas, y la densidad de píxeles de la pantalla, el navegador elige el archivo más pequeño que se verá bien.
<img
src="/img/taller-1600.jpg"
srcset="/img/taller-800.jpg 800w,
/img/taller-1200.jpg 1200w,
/img/taller-1600.jpg 1600w,
/img/taller-2400.jpg 2400w"
sizes="(max-width: 860px) 100vw, 800px"
width="1600" height="1067"
alt="Banco de trabajo con herramientas de encuadernación">
Ese sizes dice: en pantallas de hasta 860 px de ancho la imagen ocupa todo el viewport; en las demás, 800 px CSS. Si mientes en sizes (por ejemplo, dejas 100vw en una imagen que en escritorio ocupa media pantalla), el navegador descargará una versión más grande de la necesaria. Y sizes debe describir la maqueta real: si cambias el CSS de la columna, revísalo.
Para combinar formato y tamaño, usa <picture> con un <source type="image/avif"> y otro type="image/webp", cada uno con su srcset, y deja el <img> final con JPEG como alternativa. Los atributos width, height, alt, loading y fetchpriority van siempre en el <img>.
Cuántos bytes ahorras: un cálculo ilustrativo
Ejemplo de cálculo
Supongamos una foto de 2400 × 1600 px (proporción 3:2) en JPEG que pesa 480 KB, y que se muestra en una caja de 800 px CSS de ancho. El peso es inventado; las proporciones son las que importan.
- Píxeles necesarios. En una pantalla 1x hacen falta 800 × 533 px; en una 2x (densidad habitual en móviles; muchos llegan a 3x), 1600 × 1067 px.
- Proporción de píxeles. El original tiene 2400 × 1600 = 3 840 000 px. La versión 1x tiene 426 400 px (un 11 %, aproximadamente 1/9). La 2x tiene 1 707 200 px (un 44 %, aproximadamente 4/9).
- Peso estimado, suponiendo que escala con los píxeles: 1x ≈ 480 × 0,111 ≈ 53 KB; 2x ≈ 480 × 0,444 ≈ 213 KB.
- Ahorro. En 1x se dejan de descargar unos 427 KB (−89 %). En 2x, unos 267 KB (−56 %).
Si además pasas a WebP con pérdida y te sitúas en el 25–35 % de reducción que cita MDN, la versión 2x quedaría entre unos 138 y 160 KB. Estas cifras son orientativas: la compresión no es lineal (las imágenes pequeñas comprimen algo peor por píxel), así que el ahorro real suele ser algo menor que el calculado. Mídelo con tus propios archivos.
Lo que este cálculo enseña: el ancho importa al cuadrado. Pasar de 2400 a 1600 px elimina más de la mitad de los datos aunque parezca un cambio modesto. En un móvil con red lenta, esos 267 KB pueden ser una parte apreciable del tiempo de LCP.
Reservar el hueco: width, height y aspect-ratio
Cuando el navegador encuentra un <img> sin dimensiones, no sabe cuánto espacio reservar hasta descargar los primeros bytes. Mientras tanto, el bloque mide 0 px de alto; cuando la imagen llega, empuja todo lo de debajo. Ese empujón es un desplazamiento de diseño que suma al CLS (cómo se calcula está en LCP, INP y CLS: qué miden).
web.dev recomienda incluir siempre width y height en imágenes y vídeos, o reservar el espacio con la propiedad CSS aspect-ratio. No fijan el tamaño en pantalla: el navegador usa los dos números para calcular la proporción y reservar el alto correcto antes de la descarga. Para que la imagen siga siendo adaptable, acompáñalos de este CSS:
img {
max-width: 100%;
height: auto;
}
Los valores deben corresponder a la proporción real de la imagen, normalmente su tamaño intrínseco (en el ejemplo, 1600 × 1067). Si en <picture> ofreces recortes distintos según el ancho de pantalla, cada <source> admite sus propios width y height. Para contenedores sin imagen propia (un iframe, un hueco para un anuncio), usa aspect-ratio o al menos una altura mínima razonable.
Prioridad de carga: lazy fuera, fetchpriority dentro
loading="lazy" pide al navegador que espere a que la imagen esté cerca del viewport para descargarla. Es útil para las imágenes de más abajo, pero web.dev es tajante con la imagen LCP: nunca debe llevar carga diferida, porque retrasa su petición hasta después de calcular el diseño. Ojo con los gestores de contenido y componentes de frameworks que ponen lazy a todas las imágenes por defecto.
A la inversa, fetchpriority="high" indica que esa imagen merece prioridad alta. Las imágenes no bloquean el renderizado y por eso no empiezan con la prioridad más alta; esta pista compensa eso. web.dev advierte de que marcar como prioritarias más de una o dos imágenes le quita utilidad. Además, el navegador debe poder encontrar la imagen en el HTML inicial: si la inserta JavaScript o es un fondo CSS, el navegador no la ve hasta tarde. En ese caso, una precarga con <link rel="preload" as="image" fetchpriority="high"> ayuda.
Lista de comprobación por imagen
Pasa esta lista por cada plantilla (portada, artículo, listado), no por cada imagen suelta: casi siempre los fallos se repiten en todas las páginas que comparten plantilla.
- El formato encaja con el contenido: foto en AVIF o WebP con alternativa; diagrama o logotipo en SVG.
- Hay versiones en varios anchos y
srcsetlas describe con su ancho real enw. sizesrefleja el ancho que ocupa la imagen en la maqueta actual, no un100vwgenérico.- La versión más grande no supera el doble del ancho CSS máximo de la caja (salvo que necesites zoom).
widthyheightestán presentes y respetan la proporción, conheight: autoen CSS.- La imagen LCP no lleva
loading="lazy", llevafetchpriority="high"y aparece en el HTML inicial. - Las imágenes por debajo del primer pantallazo llevan
loading="lazy". - El texto alternativo describe la imagen o está vacío (
alt="") si es decorativa.
Cómo se ha elaborado este artículo
Se basa en la guía de formatos de imagen de MDN y en los artículos de web.dev sobre optimización de LCP, CLS e imágenes. El cálculo de bytes es ilustrativo: parte de un peso inventado y supone que el peso escala con el número de píxeles, lo que en la práctica sólo es aproximado. No incluye pruebas propias.
Fuentes consultadas
- MDN Web Docs: Image file type and format guide
- MDN Web Docs: Responsive images
- web.dev: Optimize Largest Contentful Paint
- web.dev: Optimize Cumulative Layout Shift
- web.dev: Key performance issues (Learn Images)
- Chrome for Developers: LCP request discovery
¿Has visto un dato erróneo o desactualizado? Escribe a [email protected] indicando la URL. Las correcciones se aplican según la política editorial.