当前位置: 首页 > news >正文

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 timelineview 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-startanimation-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-startanimation-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 box
  • start 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 开始边界的相交位置.

来看例子,

animation-range7.gif

接下来, 我们要叠 buff 了, 也就是增加百分比和 view-timeline-inset

#subject {animation-timeline: view(block);animation-range: cover 50% cover 100%;view-timeline-inset: 10%;
}

animation-range8.gif

所以, 再次印证了 animation-range 的百分比是根据谁的百分比, 根据的应该是 timeline-range-name 指定的范围, 也就是 cover 的范围百分比, 也就是整个滚动窗口去掉 view-timeline-inset 后的范围百分比.

不好意思, 因为 CSDN 限制文件上传 5MB, 所以我录的 GIF 都看不了了, 请大家移步 掘金

contain

contain: contain 的情况稍微复杂, 为啥嘞, 因为存在着元素和滚动窗口谁大谁小的问题

  • 熟悉 CSS 的朋友都知道, covercontain 这两个关键字出现在很多 CSS 属性中, 比如 object-fitbackground-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
  • entry
    • 0%cover0% 相同.
    • 100%contain0% 相同.
  • entry-crossing
    • 0%cover0% 相同. (这一点规范没有明确说相同, 但是看定义他们确实是相同的)
    • 100% 表示元素的 principle box 的 end border edge 结束边框边界 和时间线的 view progress visibility range 的 end edge 结束边界的相交位置.
    • 有意思的事情来了, 首先 entryentry-crossing 看起来就很像, 而且他们 0% 的位置一模一样, 不一样的地方就是 100%. 因为 contain0% 包含了两种情况.

对于元素高度小于窗口高度的情况, 这两个属性的标签完全相同. 先看 entry

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

当元素高度小于滚动窗口时, 先看 exit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再看 exit-crossing

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

兼容性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我必须说, 我第一次刚看也不是很明白每个的意思并且搞不清 entryentry-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&#xff08;1&#xff09;组装查询条件&#xff08;2&#xff09;组装排序查询&#xff08;3&#xff09;组装删除查询&#xff08;4&#xff09;条件优先级&#xff08;5&#xff09;组装select子句&#xf…...

ElasticsearchRestTemplate 和ElasticsearchRepository 的使用

目录 一、使用ElasticsearchRestTemplate类 1.引用Maven类库 2. 配置文件application.yml 3.创建实体类&#xff08;用于JSON文档对象的转换&#xff09; 二、使用ElasticsearchRepository 类 1.引用Maven类库 2. 配置文件application.yml 3. ElasticsearchRepository接…...

Typora +Picgo 搭建个人笔记

文章目录 Typora Picgo 搭建个人笔记一、Picgo Github 搭建图床1.基础设置2. 将配置导出&#xff0c;方便下次使用 二、Typora&#xff1a;设置 &#xff1a;1. 基本设置2. 导出自动提交3. 备份图片 Typora Picgo 搭建个人笔记 typora 下载地址&#xff1a; https://zahui.fan…...

八、K8S之HPA自动扩缩容

HPA 一、概念 HPA&#xff08;Horizontal Pod Autoscaler&#xff0c;水平 Pod 自动伸缩&#xff09;是 Kubernetes 中的一种特性&#xff0c;其作用是根据资源使用情况自动调整 Pod 的副本数&#xff0c;以实现应用程序的自动扩展和收缩。 HPA 可以根据 CPU 使用率或其他自…...

损失函数总结(二):L1Loss、MSELoss

损失函数总结&#xff08;二&#xff09;&#xff1a;L1Loss、MSELoss 1 引言2 损失函数2.1 L1Loss2.2 MSELoss 3 总结 1 引言 在上一篇博文中介绍了损失函数是什么以及为什么使用损失函数&#xff0c;从这一篇博文就开始关于损失函数有哪些进行进一步的介绍。这里放一张损失函…...

力扣(LeetCode)2530. 执行 K 次操作后的最大分数(C++)

贪心优先队列 请看答案需求&#xff1a;得到最大分数。易猜到&#xff0c;得到最大分数的取法是每次取数组中最大的数字(贪心思路)。 问题转化为&#xff1a;如何快速找到数组中最大的数字&#xff0c;根据问题规模 k 1 0 5 k10^5 k105&#xff0c;维护优先队列即可 O ( k l…...

C# 快速简单反射操作

文章目录 前言新反射使用BindingFlags以公有属性使用举例运行结果 前言 我之前写过一篇博客&#xff0c;是关于C# 反射的&#xff0c;我那时候使用的C# 反射写起来还是比较麻烦&#xff0c;需要获取Properies,再遍历Property&#xff0c;再找到对应Property&#xff0c;再使用…...

【python高级】设计模式、类工厂、对象工厂

一、说明 最近试着读Design pattern&#xff0c; 不过有些概念实在太抽象了&#xff0c; 整理一下自己所学抽象工厂的精神&#xff0c;就是要有abstract class&#xff08;not implement&#xff09;&#xff0c;而所有不同种类的对象&#xff0c;都是继承这个abstract class&a…...

Flink的算子列表状态的使用

背景 算子的列表状态是平时比较常见的一种状态&#xff0c;本文通过官方的例子来看一下怎么使用算子列表状态 算子列表状态 算子列表状态支持应用的并行度扩缩容&#xff0c;如下所示: 使用方法参见官方示例&#xff0c;我加了几个注解&#xff1a; public class Bufferin…...

使用 Github Actions 工作流自动部署 Github Pages

GitHub-Actions actions顾名思义就是一堆动作&#xff0c;是一个持续集成服务&#xff0c;持续集成包含了拉代码、运行测试、编译代码、登录远程服务器&#xff0c;发布到第三方服务等等的操作&#xff0c;GitHub将这些操作称为actions。 概念&#xff1a;Workflows, Events,…...

Xposed hook 抖音账户信息

本篇主要讲下hook获取 抖音账户的相关信息&#xff0c;直接上代码。 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月&#xff0c;TiD质量竞争力大会组委会和ECI专家委员会成功举办TiD大时段课程“度量驱动研发效能提升”与“ECI效能认知与改进论坛”。与会专家以《ECI软件研发效能度量规范》团体标准为要点&#xff0c;为企业研发效能度量和提升分享诸多实践成果与经验。 《ECI软件研…...

科技的成就(五十二)

405、微信公众平台正式上线 "1995 年 8 月 24 日&#xff0c;微软发布 Windows 95。Windows 95 极大地改进了前续系统的图形用户界面&#xff0c;首次推出了开始菜单、任务栏、最大化、最小化窗口以及关闭按钮。此外&#xff0c;Windows 95 最大程度兼容当时的 MS-DOS 和 …...

【23种设计模式】装饰器模式

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…...

解决IDEA中SpringBoot项目创建多个子模块时配置文件小绿叶图标异常问题

在新建子模块下创建配置文件&#xff1a; 在子模块gateway中新建的配置文件,正常情况下配置文件左侧是小树叶标识&#xff0c;而这次新建application-dev.yml是个小树叶标识&#xff0c;bootstrap.yml是个方框。 看其他方案都是在project structure中设置&#xff0c;但未显示…...

【马蹄集】—— 概率论专题

概率论专题 目录 MT2226 抽奖概率MT2227 饿饿&#xff01;饭饭&#xff01;MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 小码哥正在进行抽奖&#xff0c;箱子里有…...

Spring 6整合单元测试JUnit4和JUnit5

单元测试&#xff1a;JUnit 在之前的测试方法中&#xff0c;几乎都能看到以下的两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxxx.class);这两行代码的作用是创建Spring容器&…...

【好书推荐】深入理解现代JavaScript

作者介绍 T. J. Crowder是一位拥有30年经验的软件工程师。在他的整个职业生涯中&#xff0c;他至少有一半时间是在使用JavaScript从事开发工作。他经营着软件承包和产品公司Farsight Software。他经常在Stack Overflow上为人们提供帮助&#xff0c;他是十大贡献者之一和JavaScr…...

高效协同: 打造分布式系统的三种模式

在构建分布式系统时&#xff0c;分布式协调是否总是必要选项&#xff1f;本文通过一些实际的例子讨论了这一问题&#xff0c;并通过把问题区分为是否具有单调性做为是否需要分布式协调的标准。原文: Avoiding Coordination Cost: Three Patterns for Building Efficient Distri…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...