滚动条驱动的动画是一个新的 CSS 特性,已经在部分现代浏览器中实现了,我们以前要实现滚动条动画效果时,可以使用一些 Javascript 库来实现,例如 ScrollMagic ,Gsap 等动画库,现在 CSS 也可以实现一些基本的滚动驱动动画功能了。
CSS 滚动动画例子
我们先来看看一个简单的 CSS 滚动驱动动画的例子。
See the Pen css scroll-timeline by imkelen (@imkelen) on CodePen.
@keyframes appear {
from {
opacity: 0;
scale: 0.8;
}
to {
opacity: 1;
scale: 1;
}
}
img {
animation: appear linear;
animation-timeline: view();
animation-range: entry 0% cover 50%;
}
animation-timeline
意思是在 img 元素出现在视图的时候触发。
animation-range
意思是动画在 img 元素进入视口的 0% 时开始,并在视口显示 img 元素的 50% 时完成。
通过上面例子可以看出,当图片开始出现在视图,图片开始触发 appear 动画,这时候样式是 opacity: 0; scale: 0.8
,随着向下滚动,图片的样式会变成 opacity: 1; scale: 1
。
animation-timeline
animation-timeline
用来实现滚动条动画时间轴的来源,语法如下:
animation-timeline: <timeline-name>;
timeline-name
的枚举值有:
none
:动画没有关联到任何时间线。auto
:动画关联到文档的默认时间线(DocumentTimeline
)。默认情况下,时间线是与页面加载的时间相关联的。scroll()
:动画时间线和滚动条关联,基于祖先滚动容器的滚动进度来驱动动画。view()
:动画时间线和当前元素的可见性(视口中的位置)相关联。
scroll()
上面介绍了 view()
的用法,接下来介绍下 scroll()
的用法,直接上代码:
.scroll-container {
width: 400px;
height: 400px;
overflow: auto;
border: 2px solid #000;
position: relative;
}
.horizontal div {
width: 800px;
height: 100%;
background: linear-gradient(to right, #f06, #4a90e2);
}
.horizontal img {
position: absolute;
width: 200px;
height: 200px;
left: 50%;
display: block;
border: 2px solid #000;
transform-origin: center;
animation: horizontalRotate 1s linear;
animation-timeline: scroll(x);
}
@keyframes horizontalRotate {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(360deg);
}
}
这里定义了一个容器元素 scroll-container
,div 元素是个配角,主要使容器可以横向滚动,我们重点关注 img 元素,这里设置了 animation-timeline: scroll(x)
使其可以响应父元素的横向滚动来执行动画效果。
注意这里的容器元素必须要设置
position: relative
,img 元素才可以找到根据父元素滚动驱动动画。scroll()
不设置则默认响应纵向滚动条的滚动效果。
最终效果可以自己在 Codepen 查看:
See the Pen css scroll-timeline: scroll() by imkelen (@imkelen) on CodePen.
浏览器支持情况
截至 2024 年 12 月,浏览器的支持情况如下,暂时还不可以应用到生产环境中。
我们可以使用 @supports
规则来检测浏览器的支持情况来写 animation-timeline
语法,语法如下:
@supports (animation-timeline: view()) {
@media (prefers-reduced-motion: no-preference) {
/* 编写驱动动画 */
}
}
总的来说,能使用 CSS 实现滚动驱动动画,对代码的实现以及性能都有很大的好处。未来浏览器会支持更多的新特性来实现复杂的滚动驱动动画,例如 scroll-start-target
等。