上一篇
按字母 js 滚动
- 行业动态
- 2025-05-17
- 2
使用JS监听滚动事件,动态加载内容,优化性能,实现
原理分析
通过监听滚动事件,将页面垂直滚动距离映射为字母形状(如J/S)的路径坐标,再利用CSS变换或JS动画让元素沿该路径移动,形成视差滚动效果。
实现步骤
路径定义
- J形路径:先垂直下降,再向右下方倾斜,最后向左下方收尾
- S形路径:波浪形上下起伏,需用正弦函数或二次贝塞尔曲线模拟
坐标映射
// 假设总滚动高度为document.body.scrollHeight const maxScroll = document.body.scrollHeight window.innerHeight; // 当前滚动进度(0~1) const progress = window.scrollY / maxScroll;
路径函数
| 字母 | 路径公式(x,y) |
|——|———————————————————————————-|
| J |x = progress 50; y = progress 100 + (progress > 0.5 ? (progress-0.5)50 : 0)
|
| S |x = 0; y = 50 + 50Math.sin(progressMath.PI)
|元素定位
.moving-element { position: fixed; transform: translate(calc(var(--x)px), calc(var(--y)px)); }
代码示例(J形路径)
<div class="bg">背景</div> <div class="moving-element">滚动元素</div>
body { height: 2000px; } / 模拟长页面 / .bg { background: linear-gradient(to b, #f6d365 0%, #fda085 100%); position: fixed; width: 100%; height: 100%; z-index: -1; } .moving-element { width: 100px; text-align: center; }
window.addEventListener('scroll', () => { const maxScroll = document.body.scrollHeight window.innerHeight; const progress = window.scrollY / maxScroll; // J形路径算法 let x = progress window.innerWidth / 2; // 横向最大偏移一半屏幕宽 let y = progress window.innerHeight; // 基础垂直滚动 if(progress > 0.5) y += (progress 0.5) window.innerHeight; // 后半段加速下移 document.querySelector('.moving-element').style.transform = `translate(${x}px, ${y}px)`; });
注意事项
问题 | 解决方案 |
---|---|
移动端卡顿 | 使用requestAnimationFrame 替代直接事件监听,并限制DOM更新频率 |
不同分辨率适配 | 改用vw/vh 单位或window.innerWidth/Height 动态计算 |
多元素同步运动 | 为每个元素独立计算路径,但共享相同的progress 基准值 |
相关问题与解答
Q1:如何让元素沿自定义图形(如心形)滚动?
A:需将心形参数方程转换为坐标公式,
// 心形极坐标转笛卡尔坐标 const a = 15; // 大小系数 const x = 16Math.pow(Math.sin(progressMath.PI),3); const y = -(13Math.cos(progressMath.PI) 5Math.cos(2progressMath.PI)) + window.innerHeight;
Q2:滚动时如何降低性能消耗?
A:1. 使用throttle
函数限制执行频率
2. 仅用CSS实现静态路径(如background-attachment: fixed
模拟视差)
3. 对非可视区域元素暂停动画