ViewTimeline 的 inset 并不直接控制“进出视口”触发时机,而是定义逻辑视口边界:如 inset: 100px 使上下边界各向内收缩 100px,动画 0%→100% 对应元素顶部进入/底部离开该收缩区域。
ViewTimeline 的
是什么,它真能控制“进出视口”的偏移?
不能。这是最常被误解的一点:
并不直接控制“元素进入/离开视口”的触发时机,它只定义
的时间范围边界——即把视口的上下(或左右)边缘向内收缩多少,形成一个“逻辑视口”。动画的起止时间仍由元素与这个收缩后区域的相交关系决定。
比如
表示:顶部边界下移 100px、底部边界上移 100px,中间这块区域才是 timeline 的“满刻度区间”(0% → 100%)。元素的
事件发生在其**顶部进入该收缩区域顶部**时,
事件发生在其**底部离开该收缩区域底部**时。
怎么写合法的
值?哪些单位和语法有效?
是
的 CSS descriptor,只能在
规则里声明,且必须是单个长度值(不允许百分比、calc 或负数)。
✅ 合法,上下各缩进 50px
✅ 合法,支持 rem、em、vh 等绝对/相对单位
❌ 无效,百分比不被支持
❌ 无效,不支持 calc()
❌ 无效,负值会令 timeline 失效(浏览器忽略整个规则)
注意:它只接受一个值,不是
或四值语法;多方向偏移需靠
配合不同方向的
模拟,但那是另一套机制。
立即学习
“
前端免费学习笔记(深入)
”;
为什么加了
动画却没变化?常见失效原因
加了
却没看到触发偏移,大概率是下面几个问题之一:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
元素未设置
,或名称与
中的不匹配
值过大,导致收缩后的逻辑视口高度 ≤ 0(例如视口高 600px,
→ 逻辑高度仅 -200px),timeline 直接退化为无效状态
动画使用的是
,但没指定正确的
参数,如写成
却忘了定义
CSS 容器查询或 transform 层级干扰了视口计算(特别是父元素有
时,可能破坏
的坐标系)
调试建议:用
查看 timeline 实际状态,或临时加个
和
辅助观察逻辑视口位置。
实际效果对比:
vs
假设一个固定高 200px 的卡片,在垂直滚动容器中从上往下进入视口:
那么它的动画时间线分布会变成:
:动画从卡片顶部触达视口顶部(0%)开始,到底部离开视口底部(100%)结束
:动画从卡片顶部触达视口向下 150px 处(即“提前触发”)开始;到卡片底部离开视口向上 150px 处(即“延迟结束”)才结束 —— 整体动画窗口被拉长,且起点更早、终点更晚
真正影响“感知偏移”的,是这个逻辑窗口的移动,而不是某个开关式触发点。如果你要实现“元素还剩 200px 才到视口就启动动画”,
就是直接解法;但要注意,这会让动画总时长远超元素实际在视口内的停留时间。
复杂点在于:这个偏移对不同滚动方向(水平滚动)、不同容器尺寸、以及元素自身尺寸都敏感,必须结合具体布局实测 —— 没有通用 magic number。
insetinsetViewTimelineinset: 100pxstartendinsetinsetViewTimeline@view-timelineinset: 50pxinset: 1reminset: 10%inset: calc(100px + 1rem)inset: -20pxinset-topview-timeline-namescroll-timelineinsetinsetview-timeline-name@view-timelineinsetinset: 400pxanimation-timeline: view()view-timeline-nameview(tl)@view-timeline tl { inset: 100px; }transformViewTimelinegetComputedTimeline()outlinebackgroundinset: 0inset: 150px/* timeline 定义 */
@view-timeline card-tl {
source: selector(#my-card);
inset: 150px;
}inset: 0inset: 150pxinset: 200px