滚动文字揭示特效(滚动视差文字入场,方向实时可调)
滚动文字揭示特效:文字段落随进入视口逐行显现,支持上移、左移、右移、缩放四种入场方向实时切换,IntersectionObserver 驱动,零依赖自研实现。
效果演示(真实可交互)
📖 向下滚动:文字段落随进入视口逐行显现
壹 · 开场白
滚动揭示(Scroll Reveal)是长页面中最常用的叙事手法:内容不是一次性铺开,而是跟随读者的滚动节奏逐段出现,制造「探索感」与「期待感」。
贰 · 原理
本组件使用 IntersectionObserver 监听每个文字块与滚动容器的相交状态,进入视口时给元素加上「可见」类,由 CSS 过渡完成位移与透明度的动画。
相比直接监听 scroll 事件,观察器由浏览器底层调度,既省性能又不需要自己计算「是否进入视口」这一判断。
叁 · 细节
每一行的位移方向、距离与动画时长都可以独立调整:上移、左移、右移或缩放入场,配合不同的缓动曲线能产生完全不同的气质。
交错节奏也很重要:连续多行同时出现会显得生硬,让每行之间相差 60-100 毫秒错峰入场,视觉上会流畅得多。
肆 · 收尾
所有行进入视口后会被移出观察队列,不再重复触发,性能开销归零。点击下方「重新播放」可回到顶部再看一遍。
把这段文字换成你的产品介绍、品牌故事或文章正文,滚动阅读的体验立刻提升一个档次。
演示区用内嵌滚动容器模拟页面滚动,包含标题与段落共 10 行文字。右上角控件可实时切换四种入场方向,「重新播放」一键回到顶部重看。
完整代码
<div class="st-scroller" id="stScroller">
<h3 class="st-line">壹 · 开场白</h3>
<p class="st-line">滚动揭示是长页面最常用的叙事手法……</p>
</div>
.st-scroller h3, .st-scroller p {
opacity: 0;
transform: translateY(26px); /* 上移入场 */
transition: opacity .6s ease, transform .6s ease;
}
.st-scroller h3.in, .st-scroller p.in {
opacity: 1;
transform: none;
}
const lines = scroller.querySelectorAll('h3, p');
const io = new IntersectionObserver(entries => {
entries.forEach(en => {
if (en.isIntersecting) {
en.target.classList.add('in'); // 进入视口 → 显示
io.unobserve(en.target); // 只播放一次,之后移出队列
}
});
}, { root: scroller, threshold: 0.25 });
lines.forEach(el => io.observe(el));
实现要点:初始状态 opacity: 0 加位移,观察器检测到元素与滚动容器相交超过 25% 时添加 .in 类,CSS 过渡自动完成显现。左移/右移只需把 translateY 换成 translateX,缩放入场则用 scale(.86) → 1。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 入场方向 | data-dir 属性 | up / left / right / zoom 四种 |
| 位移距离 | CSS transform 数值 | 建议 20-50px,过大显得拖沓 |
| 动画时长 | transition 的 0.6s | 0.4-0.8s 区间观感最佳 |
| 触发阈值 | threshold: 0.25 | 元素进入视口 25% 时触发 |
| 监听根 | root: scroller | 局部容器用容器元素,整页用 null |
兼容性与性能
- IntersectionObserver 由浏览器底层异步调度,滚动期间不产生 JS 密集计算,性能远优于 scroll 事件手动判断
- 元素触发一次后立即
unobserve移出队列,长页面滚动到中后段时观察队列自然清空,零残余开销 - 动画只操作
opacity与transform,均走合成器;不支持观察器的极老浏览器可退化为「直接显示」 - 全浏览器兼容(Chrome / Safari / Firefox / Edge / iOS / Android 现代版本),无需任何 polyfill
常见问题
Q: 进入视口一瞬间文字闪现而不是动画? 检查初始状态是否在 CSS 里正确声明了 opacity: 0,且观察器在 DOM 就绪后才创建;本组件在脚本内绑定元素引用,不存在时序问题。
Q: 可以做成「滚动到哪亮到哪」的逐段高亮吗? 可以。把观察器的回调改为「离开视口时移除类」即可双向绑定,配合 threshold 数组能实现段落级高亮联动。
Q: 整页使用与容器使用有什么区别? 整页使用时 root 传 null(默认视口),容器内使用时传容器元素,其余代码完全一致。本组件演示即容器模式。
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(缓动曲线)等属性即可,代码中有注释说明。