Función utilitaria diseñada para generar marcas HTML5 de imágenes adaptables (<picture>) en temas de Blogger de forma nativa. Al segmentar dinámicamente un arreglo de dimensiones en múltiples etiquetas <source> y un fallback <img>, optimiza el rendimiento y la descarga de recursos multimedia según las resoluciones de pantalla o dispositivos del cliente.
Esta función forma parte del proyecto Hamlet. Puedes revisar el código fuente en GitHub.
Definición de la función
<b:includable id='@picture'>
<b:comment>
Create a responsive custom picture tag using native Blogger image sizing.
@author zkreations
@param {image} src - Image URL or Blogger image object
@param {number[]} [sourceSet=[700,400]] - Array of widths for the responsive sources
@param {Number} [width] - Explicit image width for the fallback img
@param {Number} [height] - Explicit image height for the fallback img
@param {String} [ratio] - Aspect ratio (e.g., "16:9", "1:1")
@param {String} [id] - Unique identifier for the img tag
@param {String} [class] - Additional CSS classes for the img tag
@param {String} [imgClass] - CSS classes for the fallback img tag
@param {string} [sizes] - Sizes attribute
@param {string} [loading] - Loading attribute
@param {string} [fetchpriority] - Fetch priority attribute
@param {string} [crossorigin] - Cross-origin attribute
@param {string} [decoding] - Decoding attribute
@param {string} [referrerpolicy] - Referrer policy attribute
@param {string} [alt] - Alt text
@param {string} [params] - Additional parameters for proxy images
</b:comment>
<b:if cond='data:src'>
<picture>
<b:class cond='data:class' expr:name='data:class'/>
<b:with value='data:src.isYoutube
? data:src.youtubeMaxResDefaultUrl
: data:src' var='baseImage'>
<b:with value='data:sourceSet ?: [700, 400]' var='availableSizes'>
<b:with value='[
"com/img/a/",
"com/blogger_img_proxy"
] any (server => server in data:baseImage)' var='isProxyImg'>
<b:with value='data:params and data:isProxyImg ? ("-" + data:params) : ""' var='params'>
<b:loop index='i' values='data:availableSizes' var='size'>
<b:if cond='data:i + 1 != data:availableSizes.length'>
<b:with value='resizeImage(data:baseImage, data:size, data:ratio)' var='sourceUrl'>
<source expr:media='"(min-width: " + data:size + "px)"' expr:srcset='data:sourceUrl + data:params'/>
</b:with>
</b:if>
</b:loop>
<b:with value='data:availableSizes.last ?: 600' var='fallbackSize'>
<b:with value='resizeImage(data:baseImage, data:fallbackSize, data:data:ratio)' var='fallbackUrl'>
<b:tag name='img'>
<b:attr name='b:whitespace' value='remove'/>
<b:class cond='data:imgClass' expr:name='data:imgClass'/>
<b:loop values='["id","sizes","loading","fetchpriority","crossorigin","decoding","referrerpolicy","alt"]' var='attr'>
<b:with expr:value='+("data:",data:attr)' var='value'>
<b:attr expr:name='data:attr' expr:value='data:value'/>
</b:with>
</b:loop>
<b:attr name='width' expr:value='data:width ?: data:fallbackUrl.width'/>
<b:attr name='height' expr:value='data:height ?: data:fallbackUrl.height'/>
<b:attr name='src' expr:value='data:fallbackUrl + data:params'/>
</b:tag>
</b:with>
</b:with>
</b:with>
</b:with>
</b:with>
</b:with>
</picture>
<b:else/>
<b:comment render='true'>Parameter [src] is required.</b:comment>
</b:if>
</b:includable>
Especificación de Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
src |
image |
URL u objeto de imagen. Obligatorio. |
sourceSet |
number[] |
Anchos para generar las etiquetas <source>. Por defecto [700,400]. |
width |
number |
Ancho del elemento <img>. |
height |
number |
Alto del elemento <img>. |
ratio |
string |
Relación de aspecto (Ej: "16:9", "1:1"). |
id |
string |
Valor del atributo id del <img>. |
class |
string |
Clases CSS del elemento <picture>. |
imgClass |
string |
Clases CSS del elemento <img>. |
sizes |
string |
Valor del atributo sizes. |
loading |
string |
Modo de carga (Ej: "lazy", "eager"). |
fetchpriority |
string |
Prioridad de descarga. |
crossorigin |
string |
Modo CORS de la petición. |
decoding |
string |
Método de decodificación. |
referrerpolicy |
string |
Política de referencias. |
alt |
string |
Texto alternativo. |
params |
string |
Parámetros adicionales del proxy. |
Modo de uso
Para implementar esta función, añade el fragmento en los marcados predeterminados (<b:defaultmarkups type='Common'>) de tu tema.
src
Determina la dirección o el objeto nativo multimedia. La función valida de manera automática si proviene de un flujo de YouTube para resolver la miniatura de alta resolución (maxresdefault).
<b:include data='{ src: data:view.featuredImage }' name='@picture'/>
<picture>
<source media='(min-width: 700px)' srcset='/w700/demo.png'/>
<img width='400' height='225' src='/w400/demo.png'/>
</picture>
sourceSet
Arreglo numérico para generar los quiebres de pantalla (breakpoints) del elemento. El último valor de la colección actuará como dimensión para la etiqueta de respaldo.
<b:include data='{ src: data:view.featuredImage, sourceSet: [600, 300] }' name='@picture'/>
<picture>
<source media='(min-width: 600px)' srcset='/w600/demo.png'/>
<img width='300' height='168' src='/w300/demo.png'/>
</picture>
width
Establece un ancho fijo numérico o porcentual para la etiqueta HTML final.
<b:include data='{ src: data:view.featuredImage, width: 500 }' name='@picture'/>
<picture>
<source media='(min-width: 700px)' srcset='/w700/demo.png'/>
<img width='500' src='/w400/demo.png'/>
</picture>
height
Establece una altura fija numérica o porcentual para la etiqueta HTML final.
<b:include data='{ src: data:view.featuredImage, height: 300 }' name='@picture'/>
<picture>
<source media='(min-width: 700px)' srcset='/w700/demo.png'/>
<img height='300' src='/w400/demo.png'/>
</picture>
ratio
Modifica estructuralmente las proporciones de las URLs generadas, aplicando relaciones fijas y calculando las alturas nativas en el árbol HTML final.
<b:include data='{ src: data:view.featuredImage, ratio: "1:1" }' name='@picture'/>
<picture>
<source media='(min-width: 700px)' srcset='/w700-c/demo.png'/>
<img width='400' height='400' src='/w400-c/demo.png'/>
</picture>
id
Inyecta un identificador único de control exclusivo para la etiqueta de imagen interna de la función.
<b:include data='{ src: data:view.featuredImage, id: "lead-image" }' name='@picture'/>
<picture><img id='lead-image' src='/w400/demo.png'/></picture>
class
Aplica nombres de estilo CSS directamente sobre la envoltura HTML principal (<picture>).
<b:include data='{ src: data:view.featuredImage, class: "responsive-wrapper" }' name='@picture'/>
<picture class='responsive-wrapper'><img src='/w400/demo.png'/></picture>
imgClass
Aplica selectores o clases útiles sobre la etiqueta de renderizado final de la imagen.
<b:include data='{ src: data:view.featuredImage, imgClass: "img-fluid object-cover" }' name='@picture'/>
<picture><img class='img-fluid object-cover' src='/w400/demo.png'/></picture>
sizes
Añade directrices explícitas para indicar al intérprete cómo responder frente a distribuciones y retículas complejas.
<b:include data='{ src: data:view.featuredImage, sizes: "(max-width: 768px) 100vw, 700px" }' name='@picture'/>
<picture><img sizes='(max-width: 768px) 100vw, 700px' src='/w400/demo.png'/></picture>
loading
Especifica el comportamiento y retraso de la descarga del elemento multimedia nativo en el navegador. Valores: "lazy" | "eager".
<b:include data='{ src: data:view.featuredImage, loading: "lazy" }' name='@picture'/>
<picture><img loading='lazy' src='/w400/demo.png'/></picture>
fetchpriority
Configura la importancia de descarga del nodo con respecto al resto de peticiones críticas de la página activa.
<b:include data='{ src: data:view.featuredImage, fetchpriority: "high" }' name='@picture'/>
<picture><img fetchpriority='high' src='/w400/demo.png'/></picture>
crossorigin
Establece directrices de seguridad CORS aplicadas al recurso multimedia en implementaciones avanzadas externas.
<b:include data='{ src: data:view.featuredImage, crossorigin: "anonymous" }' name='@picture'/>
<picture><img crossorigin='anonymous' src='/w400/demo.png'/></picture>
decoding
Le provee un indicio analítico al hilo del navegador para indicar si procesar el renderizado de forma asíncrona.
<b:include data='{ src: data:view.featuredImage, decoding: "async" }' name='@picture'/>
<picture><img decoding='async' src='/w400/demo.png'/></picture>
referrerpolicy
Define la configuración de las cabeceras de procedencia al invocar la dirección IP o dominio del servidor de almacenamiento remoto.
<b:include data='{ src: data:view.featuredImage, referrerpolicy: "no-referrer" }' name='@picture'/>
<picture><img referrerpolicy='no-referrer' src='/w400/demo.png'/></picture>
alt
Establece de manera explícita la cadena de texto destinada a describir la composición para lectores de pantalla y crawlers indexadores.
<b:include data='{ src: data:view.featuredImage, alt: "Imagen adaptable de muestra" }' name='@picture'/>
<picture><img alt='Imagen adaptable de muestra' src='/w400/demo.png'/></picture>
params
Añade flags específicos extras para las imágenes alojadas en los servidores nuevos de Blogger (WebP, compresión, etc.). Detalles completos en el artículo de parámetros adicionales.
<b:include data='{ src: data:view.featuredImage, params: "rw-e30" }' name='@picture'/>
<picture>
<source media='(min-width: 700px)' srcset='/w700-rw-e30/demo.png'/>
<img src='/w400-rw-e30/demo.png'/>
</picture>