view-timeline 驱动动画需三要素齐备:chrome/edge/opera 115+支持、view-timeline 与 animation-timeline: view() 配对使用、元素必须在真实滚动流中且有渲染尺寸,否则动画静默失效。

直接用 view-timeline 驱动动画,目前只在 Chrome 115+、Edge 115+、Opera 101+ 中可用,Firefox 和 Safari 完全不支持——这点必须先确认,否则动画会静默回退到默认时间线,看起来“完全没反应”。
view-timeline 必须配合 animation-timeline: view() 才生效
view-timeline 本身只是给元素打上“可被视口时间线观测”的标记,它不触发动画;真正驱动动画的是 animation-timeline: view()。两者缺一不可:
-
view-timeline: --vt;必须写在目标元素(或其祖先)上,且名称要和animation-timeline引用的名称一致 -
animation-timeline: view();必须写在要动画的元素上,不能写在父容器或伪元素里 - 如果目标元素是
position: fixed或被transform隔离,view()会失效——浏览器无法准确计算它在滚动流中的可见性 - 临时加
outline: 1px solid red+ 滚动页面,观察元素是否随视口上下移动;不动 = 不在真实滚动流中
animation-range 决定动画在哪段“可见进度”里播放
animation-range 是控制节奏的关键,它定义动画从“元素多少可见”开始、到“多少可见”结束。常见写法:
-
animation-range: entry;:从元素顶部刚进视口(0% 可见)→ 完全进视口(100% 可见) -
animation-range: contain;:从完全进视口(100%)→ 开始离开视口(99% 可见) -
animation-range: entry 20% exit 80%;:更精细——动画从元素 20% 高度进入视口时启动,到只剩 80% 高度在视口内时结束(注意:这是基于元素自身高度的百分比,不是视口高度) - 避免写
0% 100%—— 这是滚动时间线(scroll())的语法,在view()下不合法,Chrome 会忽略整条声明
为什么动画没动?检查这三处硬性前提
View Timeline 不是“写了就动”,它依赖底层渲染管线对元素可见性的持续追踪。以下任一不满足,动画就会卡死:
-
view-timeline-name名称拼错,或未在目标元素上声明view-timeline—— DevTools 的 Computed 面板里搜不到view-timeline值即失败 - 元素被
contain: paint、overflow: hidden或clip-path截断,导致浏览器无法准确判断其边界 - 元素没有实际渲染尺寸(比如空 div、
display: none、或父级height: 0)——getBoundingClientRect()返回的height为 0 时,view()直接放弃计算
最常被忽略的一点:View Timeline 的进度不是线性映射到视口滚动像素,而是基于元素“当前可见高度 / 自身高度”的实时比值。这意味着,一个高宽比极端的元素(比如极窄极高的卡片),在快速滚动时可能只触发几十毫秒的动画窗口——得靠 animation-fill-mode: forwards 或延长 animation-duration 来留住效果。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











