Acerca de este problema HTML
El atributo srcset te permite proporcionar múltiples fuentes de imagen para que el navegador pueda elegir la más apropiada según el dispositivo del usuario y el viewport. Hay dos modos distintos para srcset:
-
Modo descriptor de ancho — Cada candidato especifica el ancho intrínseco de la imagen usando un descriptor
w(por ejemplo,640w). Este modo requiere el atributosizespara que el navegador sepa cuánto espacio ocupará la imagen en el diseño, permitiéndole elegir el mejor candidato. -
Modo descriptor de densidad — Cada candidato especifica una densidad de píxeles usando un descriptor
x(por ejemplo,2x). Este modo no usa el atributosizes; el navegador simplemente hace coincidir los candidatos con la densidad de píxeles del dispositivo.
Estos dos modos son mutuamente excluyentes. No puedes mezclar descriptores w y x en el mismo srcset, y no puedes usar descriptores x (o URLs simples sin descriptor) cuando sizes está presente. La especificación HTML es explícita sobre esto: si se especifica sizes, todas las cadenas candidatas de imagen deben incluir un descriptor de ancho.
Por qué esto importa
-
Cumplimiento de estándares: El estándar HTML Living Standard de WHATWG define reglas de análisis estrictas para
srcset. Cuandosizesestá presente, el algoritmo de selección de fuente del navegador espera descriptores de ancho. Proporcionar descriptores de densidad o candidatos simples en este contexto viola la especificación y produce comportamiento indefinido. -
Selección de imagen rota: Los navegadores dependen del atributo
sizespara calcular qué imagen descrita conwse ajusta mejor al ancho de diseño actual. Si proporcionas descriptoresxjunto consizes, el navegador puede ignorar completamente elsrcseto recurrir al atributosrc, anulando el propósito de las imágenes responsivas. -
Accesibilidad y rendimiento: Las imágenes responsivas existen para servir archivos de tamaño apropiado a diferentes dispositivos. Una combinación inválida de
srcset/sizespuede resultar en imágenes sobredimensionadas descargándose en pantallas pequeñas (desperdiciando ancho de banda) o imágenes subdimensionadas en pantallas grandes (reduciendo la calidad visual).
Cómo solucionarlo
Tienes dos opciones:
-
Mantener
sizesy cambiar a descriptores de ancho — Reemplaza cada descriptorx(o descriptor faltante) ensrcsetcon el ancho de píxeles intrínseco real de cada archivo de imagen, expresado con un sufijow. -
Eliminar
sizesy mantener descriptores de densidad — Si solo necesitas servir diferentes resoluciones para pantallas de alta densidad en un tamaño de diseño fijo, elimina el atributosizesy usa descriptoresx.
Cuando uses descriptores de ancho, el valor debe coincidir con el ancho intrínseco real del archivo de imagen en píxeles. Por ejemplo, si photo-640.jpg tiene 640 píxeles de ancho, su descriptor debería ser 640w.
Ejemplos
Inválido: sizes presente con descriptores de densidad
Esto desencadena el error porque 1x y 2x son descriptores de densidad, pero sizes requiere descriptores de ancho.
<img
src="photo-640.jpg"
srcset="photo-640.jpg 1x, photo-1280.jpg 2x"
sizes="(max-width: 600px) 100vw, 600px"
alt="Un paisaje montañoso">
Inválido: sizes presente con un candidato simple (sin descriptor)
Un candidato sin descriptor por defecto es 1x, que es un descriptor de densidad — aún inválido cuando sizes está presente.
<img
src="photo-640.jpg"
srcset="photo-640.jpg, photo-1280.jpg 2x"
sizes="(max-width: 600px) 100vw, 600px"
alt="Un paisaje montañoso">
Solución: usar descriptores de ancho con sizes
Cada candidato ahora especifica el ancho intrínseco del archivo de imagen. El navegador usa el valor de sizes para determinar qué imagen descargar.
<img
src="photo-640.jpg"
srcset="photo-320.jpg 320w, photo-640.jpg 640w, photo-1280.jpg 1280w"
sizes="(max-width: 600px) 100vw, 600px"
alt="Un paisaje montañoso">
Solución alternativa: eliminar sizes y usar descriptores de densidad
Si no necesitas que el navegador elija imágenes basándose en el ancho de diseño — por ejemplo, la imagen siempre se renderiza en un tamaño CSS fijo — elimina sizes y usa descriptores x.
<img
src="photo-640.jpg"
srcset="photo-640.jpg 1x, photo-1280.jpg 2x"
alt="Un paisaje montañoso">
Usar descriptores de ancho con source dentro de picture
La misma regla se aplica a elementos source dentro de un picture. Si sizes está presente, cada candidato debe usar un descriptor w.
<picture>
<source
srcset="hero-480.webp 480w, hero-960.webp 960w, hero-1920.webp 1920w"
sizes="(max-width: 768px) 100vw, 50vw"
type="image/webp">
<img
src="hero-960.jpg"
srcset="hero-480.jpg 480w, hero-960.jpg 960w, hero-1920.jpg 1920w"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Una imagen de banner principal">
</picture>
Encuentra problemas como este automáticamente
Rocket Validator escanea miles de páginas en segundos, detectando problemas de HTML en todo tu sitio web.