CSS 滚动驱动动画 animation-range
- animation-range
- 语法
- normal
- length-percentage
- timeline-range-name
- 具名时间线范围 named timeline range
- cover
- contain
- entry 和 entry-crossing
- exit 和 exit-crossing
- 兼容性
- 语法
animation-range
这个属性可同时对
scroll progress timeline和view progress timeline这两种不同时间线驱动的动画起效果!
还记得之前在 view() 中看到的例子吗, view progressive timeline 是以元素开始出现为 0%, 完全离开滚动容器后为 100%. 实际上我们可能需要更多类型的进度, 比如开始出现(0%)和完全出现(100%), 或准备离开(0%)和完全离开(100%). 如下


这个时候就需要 animation-range 大放异彩了, 因为它改变的就是动画范围.
语法
animation-range = [ <'animation-delay-start'> <'animation-delay-end'>? | <timeline-range-name> ]#
animation-range 是一个简写属性, 是 animation-range-start 和 animation-range-end 的简写. 如果同时指定两个值, 那么第一个值会作为 animation-range-start 第二个值会作为 animation-range-end.
不论是 animation-range-start 还是 animation-range-end, 他们的取值都是一样的
normal:<length-percentage><timeline-range-name><timeline-range-name> 加上 <timeline-range-name>
有了上面的取值, 对于简写属性 animation-range 来说
- 如果只是
normal或者<length-percentage>, 那么这个值就属于animation-range-start, 而animation-range-end默认为normal - 如果仅仅是一个
<timeline-range-name>, 那么动画范围就是这个具名时间线范围从0%到100%- 📖 也就是, 如果
<timeline-range-name>属于animation-range-start, 那么百分比默认为0%; 如果属于animation-range-end那么百分比默认为100%.
- 📖 也就是, 如果
- 如果是
<timeline-range-name>加上<length-percentage>, 那么动画范围就是这个具名时间线从<length-percentage>到结束.
因此下面的语法都是 OK 的.
animation-range: normal;animation-range: 50%;animation-range: contain;animation-range: normal 50%;animation-range: 50% normal;animation-range: 50% 75%;animation-range: entry exit;animation-range: cover cover 100px;animation-range: entry 100px exit;
下面就具体看看不同取值代表的含义
normal
默认值
先看 view progress timeline, 先给出代码, 并且后面的示例都将在此基础上修改
<div class="relative"><div class="container">Lorem...<div class="box positive-inset-length"></div></div>
</div>
.container {height: 200px;overflow: auto;
}
.box {animation: appear1 linear both;animation-timeline: --why-is-this;view-timeline: --why-is-this;animation-range: normal;
}
这就是默认的表现, 在 .box 元素将要出现时, 动画进度为 0%; 在元素完全离开滚动容器时, 动画进度为 100%.

再看 scroll progress timeline.
<div class="relative"><div class="container container1"><div class="top"></div>Lorem ...</div>
</div>
.container1 {scroll-timeline: --youHaveToBeThis;
}
.container1 .top {position: absolute;animation: appear1 linear both;animation-timeline: --youHaveToBeThis;
}
这也是默认的表现, 容器开始滚动时, 动画进度为 0%; 滚动容器滚动到最大位置时, 动画进度为 100%.

length-percentage
同样先看 view progress timeline
.box {animation-range: 20%;
}
记得之前说过什么吗? 如果只有一个 <length-percentage> 值, 那么这个值被分配给 animation-range-start 而 animation-range-end 保持默认值 normal 不变. 下图表现得符合预期, 动画在 20% 的位置开始, 在元素完全离开滚动容器时结束.

然后是 scroll progress timeline
.container1 .top {animation-range: 50%;
}
动画效果符合预期, 顶部水平条在滚动 50% 的位置开始出现, 在滚动到结束时完全展开.

timeline-range-name
再继续往下之前, 我必须说的是 MDN 关于这几个关键字的解释和含义不如 CSS 规范 解释得清楚明白. 因此, 下面的关键字我都会采用规范中的定义, 以便更清楚地说明他们之间的不同之处.
💡 还有一点, 下面的属性和 scroll progress timeline 无缘了
📮 本节所有的例子演示都来自 这个网站. 强烈推荐, 因为演示效果非常清晰易懂
具名时间线范围 named timeline range
📖 百分比的是根据具名时间线范围, named timeline range计算的, 如果没有具名时间线范围则根据整个时间线计算.
cover
cover: 表示 view progress timeline 的全部范围
0%表示元素的 principle box 的 start border edge 开始边框边界 和时间线的 view progress visibility range 的end edge结束边界的相交位置.- 我知道大家看到这么多名词又看到哐哐哐好多链接🔗有一点害怕, 不过不要紧, 我慢慢简化到大家最熟悉的情景
principle box: 就理解为border box就行, 为什么会多一个新的名字呢, 因为像li这样的元素, 它不光光有自己的盒子, 还会有前面的marker box. 但这里我们不考虑这种情况就简化为border boxstart border edge: 这个更容易解释, 因为这里用start表示的逻辑方向. 如果是从下到上滚动, 表示上边框; 如果是从左到右滚动, 表示右边框view progress visibility range: 这个就是纯纯新概念, 还记得我们之前写过 view-timeline-inset 吗? 这个范围表示的就是滚动区域减去view-timeline-inset后剩下的区域- 所以, 解释了这么多,
0%表示元素的上边框和滚动区域下边界相交的位置. 这样说起来, 是不是容易多了呢? 😊 100%表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的start edge开始边界的相交位置.
来看例子,

接下来, 我们要叠 buff 了, 也就是增加百分比和 view-timeline-inset
#subject {animation-timeline: view(block);animation-range: cover 50% cover 100%;view-timeline-inset: 10%;
}

所以, 再次印证了 animation-range 的百分比是根据谁的百分比, 根据的应该是 timeline-range-name 指定的范围, 也就是 cover 的范围百分比, 也就是整个滚动窗口去掉 view-timeline-inset 后的范围百分比.
不好意思, 因为 CSDN 限制文件上传 5MB, 所以我录的 GIF 都看不了了, 请大家移步 掘金
contain
contain: contain 的情况稍微复杂, 为啥嘞, 因为存在着元素和滚动窗口谁大谁小的问题
- 熟悉
CSS的朋友都知道,cover和contain这两个关键字出现在很多CSS属性中, 比如object-fit和background-size. 以background-size为例cover表示占满背景不留下一点空白(也就是放大图片和背景宽高中较大值相同);contain表示把图片完全显示出来, 有可能留下空白.
- 我们先说元素高度小于滚动窗口的情况
0%表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的end edge结束边界的相交位置.100%表示元素的 principle box 的 start border edge 开始边框边界 和时间线的 view progress visibility range 的start edge开始边界的相交位置.

- 如果是元素高度大于滚动窗口的情况
0%表示元素的 principle box 的 start border edge 开始边框边界 和时间线的 view progress visibility range 的start edge开始边界的相交位置.100%表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的end edge结束边界的相交位置.
同样下面要叠 buff 了, 也就是增加百分比和 view-timeline-inset
#subject {animation-timeline: view(block);animation-range: contain 20% contain 100%;view-timeline-inset: 10%;
}

entry 和 entry-crossing
entry0%与cover的0%相同.100%与contain的0%相同.
entry-crossing0%与cover的0%相同. (这一点规范没有明确说相同, 但是看定义他们确实是相同的)100%表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的end edge结束边界的相交位置.- 有意思的事情来了, 首先
entry和entry-crossing看起来就很像, 而且他们0%的位置一模一样, 不一样的地方就是100%. 因为contain的0%包含了两种情况.
对于元素高度小于窗口高度的情况, 这两个属性的标签完全相同. 先看 entry

再看 entry-crossing, 和 entry 一模一样

但是当元素高度超过滚动容器时, 就不一样了, 还是先看 entry, 0% 的时候没啥好说的, 100% 的位置是元素开始离开滚动容器(上 border 要离开)

而 entry-crossing 呢, 0% 的时候和 entry 一样, 而 100% 的位置是元素下边界进入滚动容器

exit 和 exit-crossing
exit: 从这个关键字的意思来看, 就表示离开.0%与contain的100%相同.100%与cover的100%相同.
exit-crossing0%与contain的100%相同.100%表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的start edge开始边界的相交位置.- 和前面一组选手一样, 这两个元素的区别同样在元素高度大于滚动容器时才能看得出来.
当元素高度小于滚动窗口时, 先看 exit

再看 exit-crossing

当元素高度大于滚动窗口时, exit 表现如下. 0% 表示当元素的下边界进入滚动容器, 而 100% 表示元素完全离开滚动容器, 即元素的下边界离开滚动容器的上边界.

来看 exit-crossing, 与 exit 不同的是 0% 的部分, exit-crossing 的 0% 是元素的上边界开始离开滚动容器.

兼容性

我必须说, 我第一次刚看也不是很明白每个的意思并且搞不清 entry 和 entry-crossing 的区别, 关键这几个新的 CSS 属性又是新出的, 网上可参考的资料寥寥无几, 就只能去看 CSS 规范的文档. 如果你不是瞬间滑倒最后而是认真看懂每个关键词的意思以及对应的动图演示, 特别是插入了 view-timeline-inset 的值, 相信你一定会有收获
谢谢你看到这里😊
相关文章:
CSS 滚动驱动动画 animation-range
animation-range 语法 normallength-percentagetimeline-range-name 具名时间线范围 named timeline rangecovercontainentry 和 entry-crossingexit 和 exit-crossing 兼容性 animation-range 这个属性可同时对 scroll progress timeline 和 view progress timeline 这两种不…...
快速学习MyBatisPlus
文章目录 前言一、条件构造器和常用接口1.wapper介绍2.QueryWrapper(1)组装查询条件(2)组装排序查询(3)组装删除查询(4)条件优先级(5)组装select子句…...
ElasticsearchRestTemplate 和ElasticsearchRepository 的使用
目录 一、使用ElasticsearchRestTemplate类 1.引用Maven类库 2. 配置文件application.yml 3.创建实体类(用于JSON文档对象的转换) 二、使用ElasticsearchRepository 类 1.引用Maven类库 2. 配置文件application.yml 3. ElasticsearchRepository接…...
Typora +Picgo 搭建个人笔记
文章目录 Typora Picgo 搭建个人笔记一、Picgo Github 搭建图床1.基础设置2. 将配置导出,方便下次使用 二、Typora:设置 :1. 基本设置2. 导出自动提交3. 备份图片 Typora Picgo 搭建个人笔记 typora 下载地址: https://zahui.fan…...
八、K8S之HPA自动扩缩容
HPA 一、概念 HPA(Horizontal Pod Autoscaler,水平 Pod 自动伸缩)是 Kubernetes 中的一种特性,其作用是根据资源使用情况自动调整 Pod 的副本数,以实现应用程序的自动扩展和收缩。 HPA 可以根据 CPU 使用率或其他自…...
损失函数总结(二):L1Loss、MSELoss
损失函数总结(二):L1Loss、MSELoss 1 引言2 损失函数2.1 L1Loss2.2 MSELoss 3 总结 1 引言 在上一篇博文中介绍了损失函数是什么以及为什么使用损失函数,从这一篇博文就开始关于损失函数有哪些进行进一步的介绍。这里放一张损失函…...
力扣(LeetCode)2530. 执行 K 次操作后的最大分数(C++)
贪心优先队列 请看答案需求:得到最大分数。易猜到,得到最大分数的取法是每次取数组中最大的数字(贪心思路)。 问题转化为:如何快速找到数组中最大的数字,根据问题规模 k 1 0 5 k10^5 k105,维护优先队列即可 O ( k l…...
C# 快速简单反射操作
文章目录 前言新反射使用BindingFlags以公有属性使用举例运行结果 前言 我之前写过一篇博客,是关于C# 反射的,我那时候使用的C# 反射写起来还是比较麻烦,需要获取Properies,再遍历Property,再找到对应Property,再使用…...
【python高级】设计模式、类工厂、对象工厂
一、说明 最近试着读Design pattern, 不过有些概念实在太抽象了, 整理一下自己所学抽象工厂的精神,就是要有abstract class(not implement),而所有不同种类的对象,都是继承这个abstract class&a…...
Flink的算子列表状态的使用
背景 算子的列表状态是平时比较常见的一种状态,本文通过官方的例子来看一下怎么使用算子列表状态 算子列表状态 算子列表状态支持应用的并行度扩缩容,如下所示: 使用方法参见官方示例,我加了几个注解: public class Bufferin…...
使用 Github Actions 工作流自动部署 Github Pages
GitHub-Actions actions顾名思义就是一堆动作,是一个持续集成服务,持续集成包含了拉代码、运行测试、编译代码、登录远程服务器,发布到第三方服务等等的操作,GitHub将这些操作称为actions。 概念:Workflows, Events,…...
Xposed hook 抖音账户信息
本篇主要讲下hook获取 抖音账户的相关信息,直接上代码。 public class DouHook {private static final String TAG "DouHook";public static void hook(XC_LoadPackage.LoadPackageParam lpparam) {Log.e(TAG, "DouHook start");if (lpparam …...
回顾 | E³CI效能认知与改进论坛,助力企业研发效能度量和提升
2023年8月,TiD质量竞争力大会组委会和ECI专家委员会成功举办TiD大时段课程“度量驱动研发效能提升”与“ECI效能认知与改进论坛”。与会专家以《ECI软件研发效能度量规范》团体标准为要点,为企业研发效能度量和提升分享诸多实践成果与经验。 《ECI软件研…...
科技的成就(五十二)
405、微信公众平台正式上线 "1995 年 8 月 24 日,微软发布 Windows 95。Windows 95 极大地改进了前续系统的图形用户界面,首次推出了开始菜单、任务栏、最大化、最小化窗口以及关闭按钮。此外,Windows 95 最大程度兼容当时的 MS-DOS 和 …...
【23种设计模式】装饰器模式
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...
解决IDEA中SpringBoot项目创建多个子模块时配置文件小绿叶图标异常问题
在新建子模块下创建配置文件: 在子模块gateway中新建的配置文件,正常情况下配置文件左侧是小树叶标识,而这次新建application-dev.yml是个小树叶标识,bootstrap.yml是个方框。 看其他方案都是在project structure中设置,但未显示…...
【马蹄集】—— 概率论专题
概率论专题 目录 MT2226 抽奖概率MT2227 饿饿!饭饭!MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度:黄金 时间限制:1秒 占用内存:128M 题目描述 小码哥正在进行抽奖,箱子里有…...
Spring 6整合单元测试JUnit4和JUnit5
单元测试:JUnit 在之前的测试方法中,几乎都能看到以下的两行代码: ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxxx.class);这两行代码的作用是创建Spring容器&…...
【好书推荐】深入理解现代JavaScript
作者介绍 T. J. Crowder是一位拥有30年经验的软件工程师。在他的整个职业生涯中,他至少有一半时间是在使用JavaScript从事开发工作。他经营着软件承包和产品公司Farsight Software。他经常在Stack Overflow上为人们提供帮助,他是十大贡献者之一和JavaScr…...
高效协同: 打造分布式系统的三种模式
在构建分布式系统时,分布式协调是否总是必要选项?本文通过一些实际的例子讨论了这一问题,并通过把问题区分为是否具有单调性做为是否需要分布式协调的标准。原文: Avoiding Coordination Cost: Three Patterns for Building Efficient Distri…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
