图片延迟加载并不是简单地给所有图片统一设置一个空的src,如果处理不当,滚动过程中会出现明显的白块或布局抖动。基于jQuery的LazyLoad插件提供了轻量级的监听机制,它会在图片进入视口前提前触发加载,同时支持在真实图片加载完成后执行回调。为了进一步弱化延迟加载带来的视觉落差,通常会给每张图片配置一张体积很小的模糊占位图,先以模糊状态展示,等原图下载完成后再平滑切换到清晰效果。下文会结合代码说明具体实现方法。

一、快速接入jQuery LazyLoad并配置基础参数
引入插件前,需要确保页面已经加载了jQuery。LazyLoad插件并不复杂,核心逻辑是读取img元素上的data-src或data-original属性,在合适的时机把它赋值给src属性,从而触发浏览器下载图片。官方默认支持data-original,但通过配置也可以使用data-src,很多项目习惯用data-src以保持语义清晰。使用前先在HTML结构中为每张图片设置占位地址和真实地址。
<img class="lazy" src="blur-placeholder.jpg" data-src="original-image.jpg" alt="商品图片" width="600" height="400"> <img class="lazy" src="blur-placeholder.jpg" data-src="another-image.jpg" alt="风景图" width="600" height="400">
上面的占位图blur-placeholder.jpg可以是服务器生成的一张小尺寸模糊图,也可以是纯色小图。即使它体积很小,也建议在img标签上显式设置width和height,这样浏览器在加载占位图时就能预留出正确空间,避免后续原图尺寸不同导致页面跳动。初始化插件时,可以传入threshold参数,让图片在距离视口还有200像素时就开始加载,减少用户感知等待。
$("img.lazy").lazyload({
threshold: 200,
effect: "fadeIn",
failure_limit: 10,
load: function() {
// 原图加载完成后的回调
$(this).addClass("loaded");
}
});
threshold按像素设置提前加载距离,effect控制显示效果,failure_limit用来限制在滚动过程中尝试加载未成功图片的次数,避免性能浪费。load回调非常关键,因为模糊占位符需要在原图加载完毕后移除模糊样式,而这个时机正好在load回调中处理。
二、占位符模糊预加载的两种实现路径
模糊占位符的实现通常有两种选择。第一种是使用一张真实的小尺寸模糊图片,例如将原图压缩到20像素宽并做轻微高斯模糊,作为img标签的src。由于图片极小,首次加载几乎不消耗带宽,浏览器在渲染时会将其拉伸到指定宽高,形成模糊效果。第二种是使用SVG或纯色底图,配合CSS滤镜制造模糊感,但这种方式无法保留原图的色彩轮廓,体验略差。推荐优先使用真实小图,尤其是图片密集型站点,用户能提前感知图片的大致色彩和构图。
img.lazy {
filter: blur(12px);
transform: scale(1.05);
transition: filter 0.5s ease, transform 0.5s ease, opacity 0.5s ease;
}
img.lazy.loaded {
filter: blur(0);
transform: scale(1);
}
上面的CSS中,初始状态给图片添加12像素的模糊和轻微放大,是为了隐藏拉伸导致的边缘锯齿。由于模糊滤镜会降低图片边缘清晰度,放大1.05倍可以确保原图切换后不会出现白边。加载完成时添加loaded类,平滑过渡到清晰状态。需要注意的是,并不是所有浏览器都支持filter属性,对于不支持的旧浏览器,可以直接回退到透明度过渡,避免出现无样式状态。
function initLazyImages() {
var $images = $("img.lazy");
$images.lazyload({
threshold: 150,
effect: "fadeIn",
load: function() {
var $img = $(this);
// 原图加载完成后,延迟一帧再移除模糊类,确保浏览器完成绘制
requestAnimationFrame(function() {
$img.addClass("loaded");
// 如果原图加载失败,保留占位图并打上失败标记
$img.on("error", function() {
$(this).addClass("load-error");
});
});
}
});
}
这里使用了requestAnimationFrame来确保浏览器已经绘制了模糊占位图后再开始过渡,避免直接切换导致闪烁。同时增加了错误监听,当真实图片加载失败时保留占位图,并可以针对load-error类设置灰色背景或默认图标,防止出现破图图标。
三、防止布局偏移与加载异常处理
懒加载最容易踩的坑是布局偏移。如果图片标签没有设置宽高,或者宽高比例不一致,当占位图被替换为原图时,页面内容会向下或向上跳动,影响用户体验。解决思路是给每个img标签固定宽高,或者使用容器配合padding-top撑开比例。对于批量生成的图片列表,通常服务端会返回图片原始宽高,前端可以据此动态设置属性。
<div class="image-wrapper" style="padding-top: 66.66%;">
<img class="lazy" src="small-blur.jpg" data-src="large.jpg" alt="封面图">
</div>
上面的image-wrapper使用padding-top百分比来创建固定宽高比容器,内部的img设置为绝对定位并填满容器。这样即使图片尚未加载,容器高度也已经确定,不会引起页面跳动。百分比值等于图片高度除以宽度再乘以100,例如3:2的图片就是66.66%。
.image-wrapper {
position: relative;
width: 100%;
overflow: hidden;
background: #f0f0f0;
}
.image-wrapper img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
除了布局偏移,加载失败也需要考虑。网络不稳定或图片地址失效时,LazyLoad的load回调不会触发,模糊类会一直保留,用户看到的是模糊占位图,虽然不破图但也不清晰。可以在全局监听img的error事件,通过事件代理捕获异步加载失败的图片,然后添加一个默认样式或替换为本地兜底图。另外,对于支持IntersectionObserver的现代浏览器,也可以不用jQuery插件而使用原生懒加载,但jQuery LazyLoad在老旧浏览器兼容性上仍有优势。
四、与其他懒加载方案对比及适用边界
jQuery LazyLoad插件虽然是经典方案,但并非唯一选择。原生loading=lazy属性从浏览器层面直接支持懒加载,无需任何JavaScript,适合内容简单的静态页面。但它的缺点是无法自定义触发距离,也无法方便地与模糊占位符搭配使用。另一种基于IntersectionObserver的手写懒加载可以实现更精细的控制,但代码量相对较多。jQuery LazyLoad的优势在于API简单、回调齐全,适合已经依赖jQuery的老项目或需要快速实现渐进式图片加载的场景。
对于已经完全拥抱现代框架的项目,比如Vue或React,通常会使用组件级别的懒加载库,如vue-lazyload或react-lazy-load-image-component,它们也支持占位符和模糊效果,但思路大致相同。关键在于不要盲目追求插件数量,根据项目的技术栈和浏览器兼容要求选择合适的方案。如果项目已经不再使用jQuery,为了一个懒加载功能额外引入整套jQuery库并不划算,此时原生方案或框架内组件是更好的选择。
无论采用哪种技术路线,模糊占位符预加载的核心始终是同一套原理:优先加载极小体积的模糊预览图,在真实图片进入视口附近时再发起高清请求,并通过CSS过渡平滑切换。这样做既提升了首屏渲染速度,又保证了视觉上的连贯性,是图片密集型页面值得长期实践的性能优化策略。
jQuery LazyLoad图片延迟加载模糊预加载修改时间:2026-10-01 15:24:11