最稳妥的批量响应式插图方案是用 JavaScript 动态生成结构:预定义图集配置,为每张图创建含 AVIF/WebP/JPG 多源及 sizes 属性的,确保格式适配、断点响应与懒加载。

用 + 实现批量响应式插图
HTML5 本身不提供“批量插图”的原生 API,所谓批量,本质是减少重复写 标签的手动工作量,同时兼顾响应式、格式适配和加载效率。最稳妥的批量管理方式是组合使用 和 JavaScript 动态生成。
直接硬 编码 多个 不算批量,也不可控;靠纯 CSS 批量设置 background-image 则丢失语义、无法 懒加载、不支持 srcset。所以核心路径是:用 JS 预定义图集配置,再批量插入带完整响应式属性的 结构。
-
支持按media、type、width多条件匹配,比单个更灵活 - 每个
块仍需独立 DOM 节点,但可通过 JS 一次生成全部,避免手写 20 个重复结构 - 务必为每个
设置media或type,否则 浏览器 可能忽略备用源
用 JS 批量生成 的最小可行代码
以下示例用原生 JS 从数组配置中批量创建 3 张图,每张图都包含 WebP/AVIF 备用格式和断点适配:
const imageConfigs = [{ id: 'hero', src: '/img/hero.jpg', webp: '/img/hero.webp', avif: '/img/hero.avif', sizes: '(max-width: 768px) 100vw, 800px' }, {id: 'feature', src: '/img/feature.jpg', webp: '/img/feature.webp', avif: '/img/feature.avif', sizes: '(max-width: 480px) 100vw, 600px' }, {id: 'gallery', src: '/img/gallery.jpg', webp: '/img/gallery.webp', avif: '/img/gallery.avif', sizes: '100vw'} ]; imageConfigs.forEach(cfg => {const pic = document.createElement('picture'); // AVIF 源(现代浏览器优先)const avif = document.createElement('source'); avif.type = 'image/avif'; avif.srcset = cfg.avif; avif.sizes = cfg.sizes; pic.appendChild(avif); // WebP 源(兼容性兜底)const webp = document.createElement('source'); webp.type = 'image/webp'; webp.srcset = cfg.webp; webp.sizes = cfg.sizes; pic.appendChild(webp); // JPG 主源(最终降级)const img = document.createElement('img'); img.src = cfg.src; img.alt = `Image ${cfg.id}`; img.sizes = cfg.sizes; img.loading = 'lazy'; pic.appendChild(img); document.body.appendChild(pic); });
注意:srcset 值必须是完整 URL 或相对路径,不能只写文件名;sizes 属性对懒加载和资源选择至关重要,漏写会导致浏览器按 100vw 加载大图。
立即学习 “ 前端免费学习笔记(深入)”;
为什么 不用 document.write() 或 innerHTML 拼接?
用字符串拼 看似更短,但会引发三类实际问题:
- 无法动态绑定事件或后续操作 DOM 节点(比如等某张图加载完成再执行动画)
- 若图片路径含单引号或双引号,
innerHTML易出错,需额外转义 -
document.write()在页面加载完成后调用会清空整个文档,已彻底弃用
createElement 方式虽代码略长,但可读性强、调试方便、与后续逻辑(如 IntersectionObserver 懒加载增强)天然兼容。
服务端渲染时如何真正“批量”?
如果项目用 Next.js / Nuxt / PHP 模板等服务端渲染,真正的批量发生在模板层。例如在 Nunjucks 中:
{% for img in imageList %} @@##@@ {% endfor %}
此时“批量”由模板引擎完成,HTML 输出即为优化后的多图结构。关键点在于:服务端必须提前准备好 imageList 数组,且每项含完整路径和 sizes 值——漏掉 sizes 会让所有图都按默认宽度请求,失去响应式意义。
浏览器解析时, 的匹配顺序是从上到下,第一个满足条件的生效;所以要把最现代的格式(AVIF)放最前,JPG 放最后。






























