滚动图片视差特效(容器内滚动,多层速度实时可调)
滚动图片视差特效:在滚动容器内让多层图片以不同速度平移,形成纵深层次,视差强度实时可调,偏移量限幅防露白,零依赖自研实现。
效果演示(真实可交互)
🏔️ 在下方容器内滚动:前景移动快、背景移动慢,形成视差纵深
偏移量已做 ±80px 限幅,防止图片边缘露白
演示区用内嵌滚动容器模拟页面滚动,每张「图片」由渐变图层构成(无需真实图片资源即可演示效果)。正式使用时把监听对象换成
window或任意滚动容器即可。
完整代码
<div class="sp-scroller" id="spScroller">
<div class="sp-slide">
<div class="sp-img" data-speed="-0.28"></div>
<div class="sp-img sp-fg" data-speed="0.42"></div>
</div>
</div>
.sp-slide { position: relative; height: 300px; overflow: hidden; }
.sp-img {
position: absolute; left: 0; right: 0; top: 50%; height: 140%;
will-change: transform;
}
const sc = document.getElementById('spScroller');
const imgs = sc.querySelectorAll('.sp-img');
function update() {
const vc = sc.getBoundingClientRect().top + sc.clientHeight / 2;
imgs.forEach(img => {
const r = img.parentElement.getBoundingClientRect();
const offset = (r.top + r.height / 2) - vc; // 元素相对视口中心的偏移
const shift = offset * parseFloat(img.dataset.speed); // 速度系数决定移动快慢
img.style.transform = `translateY(calc(-50% + ${shift}px))`;
});
}
sc.addEventListener('scroll', update, { passive: true });
update();
核心公式:每张图片取其父区块中心到「视口中心」的距离,乘以各自的速度系数(负值表示反向移动),得到平移量。速度系数绝对值越大移动越快、视差越强;配合 height: 140% 与 overflow: hidden 保证移动过程中不露白边。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 速度系数 | 每个 .sp-img 的 data-speed | 负数反向慢移,正数同向快移,范围建议 -0.5 ~ 0.6 |
| 视差强度 | 控件或 mul 乘数 | 关闭 / 标准 / 强烈三档,本质是整体缩放速度系数 |
| 偏移限幅 | JS 中 Math.max(-80, Math.min(80, ...)) | 防止滚动距离过大时图片边缘露白 |
| 图片高度 | .sp-img 的 height: 140% | 比容器高,保证上下平移都有余量 |
| 监听对象 | window 或滚动容器 | 整页滚动或局部容器滚动均可 |
兼容性与性能
- 滚动回调只读
getBoundingClientRect并更新transform,transform 位于合成层,不触发重排与重绘 - 监听器使用
{ passive: true },不阻塞滚动线程;图片数量少(每屏 1-3 层),每帧开销可忽略 - 渐变图层代替真实图片,体积更小、加载更快;换真实图片只需替换背景即可
- 全浏览器兼容(Chrome / Safari / Firefox / Edge / iOS / Android),无需任何 polyfill 与第三方库
常见问题
Q: 滚动时图片边缘会露出背景色? 把 .sp-img 高度设为容器的 130%-150%,并给偏移量加限幅(本组件限制 ±80px),即可保证任何滚动位置都不露白。
Q: 和「滚动文字揭示」有什么不同? 视差强调的是「移动速度差」带来的空间纵深,元素始终可见;揭示强调的是「入场动画」,元素先隐藏再显现。两者可叠加使用。
Q: 性能有隐患吗? 注意三点:监听器加 passive、回调内避免读写布局属性混用、图片层数控制在 5 层以内。本组件演示同时满足,滚动全程不掉帧。
Q: 可以商用吗? 可以。本组件为粤喵自研原创代码,免费商用无需署名,无任何协议限制。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。