Scroll-driven Animations - 不用写一行 JS 就能实现高性能滚动的免费开源动画库,Chrome 团队官方出品

推荐一个由 Google Chrome 团队打造的 Scroll-driven Animations 动画效果展示和教学网站,让你用纯 CSS 实现丝滑的滚动驱动动画。

Scroll-driven Animations 介绍

Scroll-driven Animations 是由 Google Chrome 开发者关系工程师 Bramus 打造的一个滚动驱动动画演示和教学网站,展示了 W3C 最新的 Scroll-driven Animations 规范的各种炫酷玩法。这个规范可以让开发者用纯 CSS 将动画与滚动位置关联起来,不用写那些繁琐的 JavaScript 滚动事件监听代码,即可实现丝滑的视差效果、阅读进度条、元素入场动画等常见交互。

Scroll-driven Animations 官网截图
Scroll-driven Animations 官网截图

技术特性

  • 纯 CSS 驱动:通过 scroll()view() 函数,在 CSS 中直接声明动画时间线,完全不依赖 JavaScript;
  • GPU 加速:动画运行在合成器线程(compositor thread),脱离主线程,60fps 流畅不掉帧;
  • 与现有 API 无缝集成:兼容 CSS Animations API 和 Web Animations API (WAAPI),现有动画代码稍微改动就能接入;
  • 提供 Polyfill:对于暂不支持的浏览器,项目提供了 polyfill 进行兼容。

和传统 JS 滚动动画对比

对比项Scroll-driven Animations传统 JS scroll 事件
性能✅ GPU 加速,主线程无负担❌ 主线程监听,容易卡顿
代码量✅ 几行 CSS 搞定❌ 需要大量 JS 计算
帧率稳定性✅ 浏览器原生保证帧同步❌ 依赖 throttle/debounce
开发体验✅ 声明式,所见即所得❌ 命令式,调试麻烦
动态内容✅ 自动适配⚠️ 需要手动重新计算

官网演示速览

Scroll-driven Animations 网站提供了十多个精品 Demo,每个都配有源码可以直接参考学习:

  • Reading Progress Indicator:页面顶部阅读进度条,随滚动实时变化;
  • Stacking Cards:卡片堆叠效果,滚动时卡片一张张叠加;
  • Horizontal Scroll Section:垂直滚动时,横向区域自动平移;
  • 3D Shoe Explorer:滚动驱动 3D 鞋子模型旋转,效果炸裂;
  • Image Reveal Effects:图片随滚动渐显,各种创意遮罩动画;
  • Cover Card to Fixed Header:全屏封面图滚动后缩小为固定导航栏;
  • Scroll Shadows:滚动容器边缘阴影提示,滚到边界自动消失。

每个 Demo 还提供了 CSS 版本和 JS/WAAPI 版本两种实现,方便对比学习。点击页面上的 ℹ️ 图标还能看到实现原理的详细讲解。

配套工具

除了 Demo 外,网站还提供了几个实用的可视化工具:

  • Scroll Timeline Progress Visualizer:可视化 scroll() 时间线的进度变化,帮助理解时间线映射关系;
  • View Timeline Progress Visualizer:可视化 view() 时间线,直观查看元素进入/离开视口的动画进度;
  • View Timeline Ranges Visualizer:可视化 View Timeline 的各个区间范围(entry、contain、exit 等);
  • scroll() 参数工具:交互式调整 scroll() 函数的各项参数,实时预览效果。

学习资源

Scroll-driven Animations 不只是 Demo 展示,还提供了完善的免费学习资源:

快速上手

Scroll-driven Animations 是原生 CSS 特性,Chrome 115+ 已默认支持,不需要安装任何库。

1. 用 scroll() 创建滚动进度条

@keyframes grow {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

#progress-bar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 4px;
  background: #007bff;
  transform-origin: left;
  animation: grow linear;
  animation-timeline: scroll(root);
}

2. 用 view() 实现元素入场动画

@keyframes fade-in {
  from { opacity: 0; translate: 0 40px; }
  to   { opacity: 1; translate: 0 0; }
}

.card {
  animation: fade-in linear;
  animation-timeline: view();
  animation-range: entry 0% entry 80%;
}

就这么简单。不需要 Intersection Observer,不需要计算 scrollTop,纯 CSS 声明式搞定,这可比我之前写的滚动监听代码流畅多了。

注意事项

  • 浏览器兼容性:目前 Chrome 115+、Edge 115+ 支持,Firefox 和 Safari 可通过 polyfill 兼容;
  • polyfill 性能:polyfill 基于 scroll 事件实现,性能不如原生 API,推荐在 Chrome 中直接使用原生支持;
  • 调试建议:强烈推荐安装 Chrome DevTools 扩展,可以像调试普通动画一样调试滚动动画的时间线和关键帧。

免费开源说明

Scroll-driven Animations 本身是一个开源项目,源码可通过浏览器 view-source 直接查看,没有任何构建工具或框架,纯手写的 HTML、CSS 和 JavaScript。项目采用 Apache License 2.0 开源协议托管在 Github 上,可以自由学习和使用。

而 Scroll-driven Animations 规范本身是 W3C 的开放标准,所有现代浏览器都会陆续支持。