javascript 实现视口动画应优先使用 intersection observer api,通过 threshold 控制触发时机,js 仅添加 css 动画类,配合 opacity 和 transform 实现平滑过渡,并针对 ie 做兼容降级处理。

用 JavaScript 实现元素进入视口动画,核心是监听元素是否出现在可视区域内,并在进入时触发 CSS 动画或 JS 动态样式变化。关键不在于写多少代码,而在于准确判断“是否可见”和“如何平滑触发”。
监听元素是否进入视口(Intersection Observer)
现代浏览器推荐使用 Intersection Observer API,它比滚动事件监听更高效、更精准,且自动处理节流。
- 创建观察器时设置
threshold(如[0, 0.1, 0.5]),控制元素 0%、10%、50% 可见时触发回调 - 对目标元素调用
observer.observe(el)即可开始监听 - 回调中通过
entry.isIntersecting判断是否进入,entry.intersectionRatio获取可见比例
配合 CSS 实现简洁动画效果
JS 只负责“加类”,动画交给 CSS,解耦清晰、性能更好。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 给目标元素默认设置
opacity: 0; transform: translateY(20px); - 定义动画类(如
.animate-in):包含opacity: 1; transform: translateY(0); transition: opacity 0.6s ease, transform 0.6s ease; - JS 在进入视口时添加该类:
el.classList.add('animate-in')
处理多次触发与重复动画
默认情况下,元素滚出再滚入会再次触发。根据需求决定是否需要“只执行一次”或“进出都动”。
- 若只需一次动画:在回调中调用
observer.unobserve(el),观察后立即停止监听 - 若需进出均有动画:用两个类分别控制(如
animate-in和animate-out),根据isIntersecting增删 - 注意:避免对已添加动画类的元素重复操作,可用
el.classList.contains('animate-in')判断
兼容性与降级方案
IE 不支持 Intersection Observer,需提供 fallback。
- 检测支持:
if ('IntersectionObserver' in window),否则回退到scroll + getBoundingClientRect() - 手动计算时注意:监听 scroll/throttle、判断
rect.top 0 - 实际项目中,可引入轻量 polyfill(如 w3c intersection-observer polyfill)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










