跳到正文

滚动揭示

Scroll Reveal

内容滚进视口时才淡入上移,没滚到的先藏着。

  • 又叫:
  • 滚动出现
  • 滚动淡入
  • 进入视口出现
  • 滚动加载动画
  • reveal on scroll
  • fade in on scroll
  • view enter
展厅
动效与节奏
形态
自带滚动
播放
手动触发
关键词
需要 JS / 浏览器 API / 随滚动变化 / 合成层动画 / 动效较多 / 可以直接用
↕ 自己动手试试
M-04形态 自带滚动播放 手动触发Scroll Reveal
现场演示进入现场

参数工作台

复制给 AI

随参数实时更新

给这些内容块加滚动揭示(reveal on scroll):用 IntersectionObserver 监听,threshold 0.2,元素露出后播放 opacity 0 → 1、translateY(24px) → 0 的过渡,时长 550ms、cubic-bezier(0.22, 1, 0.36, 1),相邻块错开 60ms,播完立刻 unobserve。只动 transform 和 opacity。prefers-reduced-motion 下不要观察,内容直接显示。

什么时候用

  • 长落地页的分段内容,一次进来太多会显得糊成一片
  • 图文混排的营销页、案例列表,想让阅读节奏被一段段接上
  • 列表首屏之外的项目,滚到了再出现,首屏渲染更轻

适用场景:滚动 / 页面 / 列表

推荐取值

位移距离
12–32px,再大就像东西从下面掉出来
淡入时长
400–700ms
缓动
cubic-bezier(0.22, 1, 0.36, 1)
触发阈值
元素露出 15%–25%

别搞混

  • 和「滚动驱动动画 scroll-driven」的区别

    滚动揭示是「进入视口触发一次」——元素自己动,触发后就把自己从观察列表里摘掉;滚动驱动动画是每一帧的进度都绑定滚动位置,往回滚还会倒着播。

  • 和「懒加载 lazy loading」的区别

    懒加载省的是网络和图片解码,元素位置早就占好了;滚动揭示动的是 opacity 和 transform,内容本来就在页面里,只是先看不见。

容易踩的坑

  • 触发一次之后要 unobserve 或断开观察器,否则来回滚动会反复淡入淡出
  • IntersectionObserver 的 threshold 写成 1,短视口里的长元素永远达不到,永远不出现
  • 在滚动事件里直接读 scrollTop 会让布局反复重算,用 IntersectionObserver 或 requestAnimationFrame 节流
  • 元素先设成 opacity: 0 时确认内容仍在 DOM 里,别让禁用脚本或爬虫拿到一个空页面

无障碍降级

prefers-reduced-motion: reduce 时不要观察也不要位移,内容直接以最终状态渲染(本 demo 走的就是这条路径)。

关键词

  • IntersectionObserver
  • threshold
  • rootMargin
  • reveal on scroll
  • fade in on scroll
  • unobserve
  • translateY + opacity

参考

相关展品