滚动驱动动画
Scroll-Driven Animation
滚动条就是进度条:滚到哪一帧由滚动位置决定。
- 又叫:
- 滚动时间线
- 滚动进度动画
- 滚动联动动画
- scroll timeline
- scroll-driven animations
- animation-timeline
- 展厅
- 动效与节奏
- 形态
- 自带滚动
- 播放
- 手动触发
- 关键词
- 新 CSS 特性 / 随滚动变化 / 合成层动画 / 动效较多 / 先查兼容
参数工作台
复制给 AI
随参数实时更新用 CSS 滚动驱动动画(scroll-driven animations)做这个效果:卡片用 animation-timeline: view()、animation-range: entry 0% cover 60%,把滚动进度映射到 rotateZ(30deg) 和 opacity 上;顶部进度条用 animation-timeline: scroll() 配 transform: scaleX()。滚动事件里不要写 JS。Safari / Firefox 不支持时,用 intersection 触发一段 600ms 的普通动画兜底,并给出「不支持」的提示。
scroll-driven animations, animation-timeline: view(), animation-range: entry 0% cover 60%, keyframes on rotateZ(30deg) and opacity, scroll progress bar via animation-timeline: scroll() with transform: scaleX(), no scroll event listeners, feature-detect with CSS.supports('animation-timeline: scroll()'), fallback to a 600ms reveal with IntersectionObserver, respect prefers-reduced-motion
https://publieople.github.io/design-museum/entry/scroll-driven/?stage=light
链接带着你调好的参数
什么时候用
- 阅读进度条、章节指示条,天然就是「滚多少走多少」
- 卡片滚进画面时同时旋转、放大、改变饱和度
- 希望动画跟手指位置严格对应,来回滚也要能正反播
适用场景:滚动 / 页面 / 导航
推荐取值
- 时间线函数
- animation-timeline: scroll() 或 view()
- 动画区间
- animation-range: entry 0% cover 40%
- 进度条实现
- transform: scaleX(),不用 width
- 旋转幅度
- 15–45deg,超过就喧宾夺主
别搞混
和「滚动揭示 scroll reveal」的区别
揭示是进视口触发一次就播完,之后和滚动位置无关;滚动驱动动画的每一帧都绑在滚动位置,同一个位置永远是同一帧,往回滚会倒着播。
和「用 scroll 事件写 JS 动画」的区别
scroll 事件在合成线程之外触发,滚快了会掉帧;animation-timeline 由合成器驱动,不占主线程,但要现代浏览器(Chrome 115+)才支持。
容易踩的坑
- animation-range 不写就用默认值,动画可能在元素刚露头时就播完,看着像没生效
- 用 JS 在 scroll 事件里读 scrollTop 再写样式,每帧同步读写会掉帧,交给 CSS 或 rAF 节流
- animation-timeline 在 Safari 和 Firefox 上的支持还不完整,必须准备不用动画也能看的静态版本(本 demo 里有降级指示)
- 进度条用 scaleX 做,别改 width,后者每帧都要重排
无障碍降级
prefers-reduced-motion: reduce 时把时间线换成普通的固定时长动画,或让元素直接停在进度终点,进度条这类指示物保留但不跟着滚。
关键词
- animation-timeline
- scroll()
- view()
- animation-range
- scroll-driven animations
- scroll progress
- requestAnimationFrame fallback