CSS Scroll-Driven Animations 来了:两行代码搞定滚动动画

更新日期: 2026-03-24 阅读: 15 标签: 滚动

滚动联动动画,以前你是怎么写的?

监听 scroll 事件 → 计算滚动百分比 → 手动改 style……每次都要写一堆胶水代码,性能还不稳定,页面卡顿全靠缘分。

css Scroll-Driven Animations 正式登场。Chrome 115+、Edge 115+ 已全面支持,今天就能用,两行 CSS 顶过你写的一整个 scroll 工具函数


01 最直观的效果:阅读进度条

页面顶部那根随着滚动变长的进度条,用 JS 实现至少 20 行,CSS 只需要这些:

<div class="progress-bar"></div>
/* CSS:滚动驱动,自动跑 */
.progress-bar {
  position: fixed;
  top: 0;
  left: 0;
  height: 4px;
  background: #07C160;
  transform-origin: left;
  /* 关键两行 */
  animation: grow linear;
  animation-timeline: scroll(root);  /* 监听根元素滚动 */
}

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

animation-timeline: scroll(root) 就是核心——把动画的播放进度和页面滚动位置绑定,滚多少走多少,全在 GPU 合成层运行,不阻塞主线程。


02 元素入场动画:滚到哪亮到哪

以前靠 IntersectionObserver + JS 切 class,现在纯 CSS 搞定:

/* 给每个卡片设置入场动画 */
.card {
  animation: fade-in linear both;
  animation-timeline: view();           /* 监听元素进入视口 */
  animation-range: entry 0% entry 40%;  /* 进入视口 0%~40% 时执行 */
}

@keyframes fade-in {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

view() 表示“监听该元素在视口中的可见范围”,animation-range 精确控制动画在哪个阶段触发,不需要写一行 JS。


03 视差滚动:图片比内容滚得慢

背景图滚动速度 ≠ 内容滚动速度,经典视差效果:

.hero-image {
  animation: parallax linear;
  animation-timeline: scroll(root);
}

@keyframes parallax {
  from { transform: translateY(0px); }
  to   { transform: translateY(-120px); } /* 滚完整页移动 120px */
}

/* 文字层正常速度 */
.hero-text {
  animation: none; /* 不绑定,随页面正常滚动 */
}

以前这个效果要靠 background-attachment: fixed(移动端有兼容问题),或者写 JS 计算,现在用滚动时间线直接拿捏。


04 横向滚动画廊

内容区横向滚,侧边指示器跟着走:

/* 横向滚动容器 */
.gallery {
  overflow-x: scroll;
  scroll-snap-type: x mandatory;
  display: flex;
}

/* 指示器跟随横向进度 */
.indicator {
  animation: slide linear;
  animation-timeline: scroll(nearest inline); /* inline = 横向 */
}

@keyframes slide {
  from { transform: translateX(0); }
  to   { transform: translateX(calc(100% - 20px)); }
}

scroll(nearest inline) 中:

  • nearest = 最近的滚动祖先

  • inline = 沿行内轴(即横向)监听


05 避坑指南

坑1:Safari 暂不支持

Safari 目前对 animation-timeline 支持不完整,生产环境记得加降级:

/* 降级:不支持时保持静止,不影响阅读 */
@supports not (animation-timeline: scroll()) {
  .progress-bar { display: none; }
  .card { opacity: 1; transform: none; }
}

坑2:animation-fill-mode 别忘了写 both

入场动画不加 both,元素在动画开始前会闪一下默认状态:

/* ❌ 会闪 */
animation: fade-in linear;

/* ✅ 加 both,保持首尾状态 */
animation: fade-in linear both;

坑3:view() 默认范围很大

不加 animation-range,动画从元素底部进入视口开始,到元素顶部离开视口结束,跨度太大动画会很慢。一定要手动指定范围:

animation-range: entry 0% entry 50%; /* 只在进入阶段的前半段播放 */

兼容性一览

特性ChromeEdgeFirefoxSafari
scroll() 时间线✅ 115+✅ 115+✅ 110+❌ 暂不支持
view() 时间线✅ 115+✅ 115+✅ 114+❌ 暂不支持

PC 端用户占比高的产品可以放心用,移动端 iOS 用户注意加降级。


今日总结

场景传统做法新做法
阅读进度条JS 监听 scroll + 计算百分比animation-timeline: scroll(root)
元素入场动画IntersectionObserver + JS 切 classanimation-timeline: view()
视差滚动JS 计算偏移或 background-attachmentscroll(root) 绑定 transform
横向指示器JS 监听 scrollLeftscroll(nearest inline)

用 animation-timeline 绑定滚动进度,让动画与滚动同步,零 JS、高性能、丝般顺滑。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13483

相关推荐

js禁止页面滚动

发移动端页面的时候有一个很比较常见的需求,在出现弹窗时,禁止滑动弹窗后面的主体页面。如何实现呢,往下看

js如何实现滚动到一定位置将内容固定在页面顶部

window.onscroll为滚轮监听,document.body.scrollTop||document.documentElement.scrollTop 写两个是为了兼容不同浏览器。固定位置的top要设为负值,原因不明,若为0则会跟上方有空隙。左右位置虽然是0也要设,不然若为不是100%宽度的内容会出现左右跳动。

js 禁止/允许页面滚动

passive,设置该属性的目的主要是为了在阻止事件默认行为导致的卡顿。等待监听器的执行是耗时的,有些甚至耗时很明显,这样就会导致页面卡顿。即便监听器是个空函数,也会产生一定的卡顿,毕竟空函数的执行也会耗时

js实现返回顶部效果的方法总结

当页面特别长的时候,用户想回到页面顶部,必须得滚动好几次滚动键才能回到顶部,如果在页面右下角有个返回顶部的按钮,用户点击一下,就可以回到顶部,对于用户来说,是一个比较好的体验。

js+css 实现 滚动条滑动时显示,不滑动时隐藏

把原有的滚动条隐藏,创建个新的滚动条,并拓展其宽度,达到隐藏的效果,而判断滚动条是否滚动,保存原有的滚动条到顶部的距离,看是否发生改变,做出相应的判断。

使用elementUI滚动条之横向滚动

这里要简单的设置一下,将标签的height设为100%,读者查看效果的时候,会出现一个横向的滚动条,如果你不想要横向的滚动条,使用下面css属性设置就可以只显示竖向滚动条。

BetterScroll移动端滚动场景的应用

BetterScroll 是一款重点解决移动端各种滚动场景需求的开源插件,有下列功能支持滚动列表,下拉刷新,上拉刷新,轮播图,slider等功能。better-scroll通过使用惯性滚动、边界回弹、滚动条淡入淡出来确保滚动的流畅。

原生js获取浏览器获X轴,Y轴的滚动距离

在前端开发中,需要获取浏览器滚动距离的需求,这篇文章主要讲解如何使用原生Js兼容实现获取浏览器获X轴,Y轴的滚动距离。并延伸扩展下我们一些不知道的js知识,希望对你有所帮助。

CSS让页面平滑滚动

在PC浏览器中,网页默认滚动是在<html>标签上的,移动端大多数在<body>标签上,业界浏览器的CSS reset都可以加上这么一条规则:凡是需要滚动的地方都加一句scroll-behavior:smooth就好了!

原生js判断加载更多事件,通过获取页面滚动距离、文档总高度、浏览器视口高度

原生js获取滚动条在Y轴上的滚动距离、获取文档的总高度、获取浏览器视口的高度的方法实现,用于判断页面加载数据。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!