发明专利公开 -- CSS动画精准实现时钟

news2024/10/7 17:23:28

上一篇【setTimeout不准时,CSS精准实现计时器功能】的博文,最后提到了通过 CSS 动画实现计时器的方式。

本文详情描述如何通过 CSS 完整实现时钟效果,这也是团队 21 年专利的一项内容(专利公布号:CN114003087A)。

该发明专利主要解决大屏下通过 javascript 实现的时钟不准确的问题。通过 CSS 动画进行计时,避免同步阻塞卡顿的问题。

在这里插入图片描述

前置知识

伪元素

伪元素允许你对被选择元素的特定部分修改样式。

::after 用来创建一个伪元素,作为已选中元素的最后一个子元素。通常会配合content属性来为该元素添加装饰内容。这个虚拟元素默认是行内元素。

伪元素:before:after添加的内容默认是inline元素

  • 伪元素不属于文档,所以js无法操作它
  • 伪元素属于主元素的一部分,因此点击伪元素触发的是主元素的click事件
  • 块级元素才能有:before, :after,其实是不妥的,大部分行级元素也可以设置伪元素,但是像img可替换元素,因为其外观和尺寸有外部资源决定,那么如果外部资源正确加载,就会替换掉其内部内容,这时伪元素也会被替换掉,但是当外部资源加载失败时,设置的伪元素是可以起作用的。

示例

a::after {
	content: "→";
}

数据属性 data-*

HTML5 有扩展性的设计,它初衷是数据应与特定的元素相关联,但不需要任何定义。data-* 允许我们在标准内于 HTML 元素中存储额外的信息,而不需要使用类似于 classList 。

attr()

CSS 表达式 attr() 用来获取选择到的元素的某一 HTML 属性值,并用于其样式。它也可以用于伪元素,属性值采用伪元素所依附的元素。

attr() 理论上能用于所有的 CSS 属性但目前支持的仅有伪元素的 content 属性,其他的属性和高级特性目前是实验性的

示例

同 数据属性 结合,可以很好的实现相应的效果展示。

hover到 <a>标签,展示对应 data-hover内容

<style>
  a:hover::after {
    content: attr(data-hover);
  }
</style>
<body>
	<a href="javascript:void(0);" data-hover="hover展示内容">hover</a>
</body>

css animation

animation 属性是 animation-name,animation-duration, animation-timing-function,animation-delay,animation-iteration-count,animation-direction,animation-fill-mode 和 animation-play-state 属性的一个简写属性形式。

属性说明示例
animation-name指定应用的一系列动画animation1,animation2
animation-duration指定一个动画周期的时长,单位 s 或者 ms60s
animation-timing-function在每一动画周期中执行的节奏easelinearsteps(60)
animation-delay定义动画于何时开始,单位 s 或者 ms100ms
animation-iteration-count定义动画在结束前运行的次数infinite(无限次)、3
animation-direction指示动画是否反向播放normalalternatereverse
animation-fill-mode设置 CSS 动画在执行之前和之后如何将样式应用于其目标forwardsbackwards
animation-play-state定义一个动画是否运行或者暂停runningpaused

steps(number_of_steps, direction):定义了一个阶梯函数,将输出值的域等距地划分。

示例

动画周期的时长 10s ,等距划分为10步,每秒执行一次 timer,无限次循环执行。

animation: timer 10s infinite steps(10) forwards;

translate

transform: translate(x, y) / translate: x y; 平移变换。

示例

a:hover {
  translate: 200px 50px;
  /*等价于*/
  transform: translate(200px, 50px);
}

实现思路

在这里插入图片描述

步骤一:定义DOM

将时、分、秒进行DOM定义,针对时、分、秒将相关数据通过数据属性 data-* 进行绑定

<!-- 时 -->
<div class="card">
  <div class="card-hours"> <!-- 见步骤四其作用 -->
    <div class="hours" data-hours="18 19 20 21 22 23 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17"></div>
  </div>
</div>
<div class="card">:</div>
<!-- 分 -->
<div class="card">
  <div class="card-minutes">  <!-- 见步骤四其作用 -->
    <div class="minutes"
         data-minutes="58 59 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57">
    </div>
  </div>
</div>
<div class="card">:</div>
<!-- 秒 -->
<div class="card">
  <div class="seconds"
       data-seconds="50 51 52 53 54 55 56 57 58 59 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49">
  </div>
</div>

关于data-hoursdata-minutesdata-seconds 数据通过当前时间进行初始化(动态形式)。上述示例,初始时间为:18:58:50

上述,针对分钟、小时,多一层 DOM,<div class="card-hours"><div class="card-minutes"> 后续解释作用(见步骤四)。

步骤二:展示区域基础定义

这里针对:时、分、秒 统一设置。

在这里插入图片描述

设置一个固定大小的 font-size ,确保每行只能展示一个数字;同时,指定 line-height,确保可视区内只有展示一个数字。(为后续动画做准备)

body {
  font-size: 48px;
}
.card {
  display: inline-block;
  height: 68px;
  overflow: hidden;
}
.hours, .minutes, .seconds {
  width: 68px;
  line-height: 68px;
}
  • font-sizeline-height 属性,具有继承性,贯穿整个网页
  • font-sizeline-height 属性,和字体宽度没有必然的换算关系;如果希望字体是等宽的,需要使用等宽字体(如:Consolas、Monaco、monospace)

步骤三:实现「秒」

每一个周期60s,等距划分为60份(六十进制),每份1s,然后通过 translate 来展示下一个数值。

在这里插入图片描述

.seconds:after {
  display: block;
  content: attr(data-seconds);
  animation: counter 60s steps(60) infinite forwards;
}
@keyframes counter {
  from {
    translate: 0 0;
  }
  to {
    translate: 0 -100%;
  }
}

步骤四:实现「分、时」

对于分钟、小时,滚动展示的逻辑同秒一致,只是切割的份数及单位时间需要根据实际的来。

  • 分钟:等距 60 份(六十进制),一个周期 60 ∗ 60 = 3600 60 * 60 = 3600 6060=3600
  • 小时:等距 24 份(二十四进制),一个周期 $ 24 * 60 * 60 = 86400$
.minutes:after {
  display: block;
  content: attr(data-minutes);
  animation: counter 3600s steps(60) infinite forwards;
  animation-delay: 10s;	/* 延后执行 */
}

.hours:after {
  display: block;
  content: attr(data-hours);
  animation: counter 86400s infinite steps(24) forwards;
  animation-delay: 70s; /* 延后执行 */
}

分钟、小时与秒不同的是,第一次进制大概率不是整 60 或 24。

以上述实例解释:当前秒为 50,再过 10s(计算方式:$ 60 - 50 ),分钟就应该变成 59 ;同样的,再过 70 s (计算方式: ),分钟就应该变成 59;同样的,再过 70s(计算方式: ),分钟就应该变成59;同样的,再过70s(计算方式: 3600 - 58*60 - 50 $),小时就应该变成 19。

所以,上述 animation-delay 就是让固定周期的动画,稍后开始,等待的时间就是依据初始时间计算而来。

animation-delay 指定从应用动画到元素开始执行动画之前等待的时间量

解释清楚了延迟的作用,但问题是:首次的动画如何执行?(上述 animation 是从等待后的完整周期开始的)

步骤一,中提到的 <div class="card-hours"><div class="card-minutes"> 就是为此。

.card-minutes {
  height: 136px;
  overflow: hidden;
   /* 60-pastSeconds */
  animation: delay-counter 10s steps(1) 1 forwards;
}

.card-hours {
  height: 136px;
  overflow: hidden;
  /* 3600-pastMinutes*60-pastSeconds */
  animation: delay-counter 70s steps(1) 1 forwards;
}
@keyframes delay-counter {
  from {
    translate: 0 0;
  }
  to {
    translate: 0 -50%;
  }
}

上述动画只执行一次(初始化)

总结

CSS 动画运行效果良好,甚至在低性能的系统上。渲染引擎会使用跳帧或者其他技术以保证动画表现尽可能的流畅。

同时动画在各个执行阶段,也提供了相应的事件,这里暂不展开,有诉求的可以查看相关 MDN AnimationEvent。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装CentOS7

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 本教程是关于在CentOS上安装社区版Docker的方法&#xff08;Docker C…

SCTP:记录一次Diameter消息卡顿延迟问题

SCTP&#xff1a;记录一次Diameter消息卡顿延迟问题 1、背景 客户端&#xff1a;5个接口机 服务端&#xff1a;2个模拟器&#xff08;模拟HSS&#xff0c;是一个Diameter服务端&#xff09; 5个客户端的地址是&#xff1a; 10.212.27.2910.212.27.5510.212.24.1710.212.24.1…

js编译、执行上下文、作用域链

参考资料 极客时间课程《浏览器工作原理与实践》 – 李兵 《你不知道的JavaScript》-- Kyle Simpson ES5.1规范&#xff1a;https://262.ecma-international.org/5.1/#sec-10.3 ES6规范&#xff1a;https://262.ecma-international.org/6.0/#sec-executable-code-and-execu…

Redis 五大基本数据类型常见命令

一、redis中的常见数据结构 Redis共有5种常见数据结构&#xff0c;分别字符串&#xff08;STRING)、列表&#xff08;LIST&#xff09;、集合&#xff08;SET)、散列&#xff08;HASH&#xff09;、有序集合&#xff08;ZSET)。 二、redis中字符串(String)介绍 String 类型是…

小红书内容种草怎么玩,koc铺量原则

一直以来&#xff0c;小红书平台都以其强大的种草力&#xff0c;而备受品牌关注。许多初创品牌更是将平台看做抢占市场的前沿阵地。那么小红书内容种草怎么玩&#xff0c;koc铺量原则是什么呢?今天来为大家详细介绍一下。 一、什么是koc铺量 要做好新品预热的koc铺量&#xff…

存bean和取bean

准备工作存bean获取bean三种方式 准备工作 bean:一个对象在多个地方使用。 spring和spring boot&#xff1a;spring和spring boot项目&#xff1b;spring相当于老版本 spring boot本质还是spring项目&#xff1b;为了方便spring项目的搭建&#xff1b;操作起来更加简单 spring…

有效和无效的帮助中心区别在哪?如何设计有效的帮助中心?

帮助中心就是一个丰富的知识库&#xff0c;可以对企业的潜在客户进行引导。不仅能够提升用户的使用体验还能为企业塑造更加专业的品牌形象&#xff0c;在使用过程中为用户提供帮助。帮助中心的目的就是为了解决用户在使用过程中遇到的困难&#xff0c;同时为用户的使用提供引导…

DC-9通关详解

信息收集 漏洞发现 result.php处存在sql注入 sqlmap跑信息 python sqlmap.py -u http://192.168.45.146/results.php --data search1 -D users -T UserDetails --dump 拿了几个尝试登录都无效 ssh尝试登录直接拒绝了 再看Staff表 查哈希 进后台 多了一个添加记录的功能 没啥…

数据结构(二叉树)

文章目录 一、树的基础概念1.1 树型结构1.2 树型的概念 二、二叉树2.1 概念 性质2.2 二叉树的存储2.2 二叉树的基本操作&#xff08;1&#xff09;遍历&#xff08;2&#xff09;其他 2.3 二叉树练习 一、树的基础概念 1.1 树型结构 树是一种非线性的数据结构&#xff0c;它…

ChatGPT 由0到1接入 Siri

ChatGPT 由0到1接入 Siri ChatGPT 由0到1接入 Siri第一步:获取 OpenAPI 的 Key第二步:制作快捷指令本教程收集于: AIGC从入门到精通教程 ChatGPT 由0到1接入 Siri 分享如何将 GPT 应用集成到苹果手机的 Siri 中 (当然手机是需要魔法(TZ)的) 第一步:获取 OpenAPI 的…

网络安全可以从事哪些岗位?岗位职责是什么?

伴随着社会的发展&#xff0c;网络安全被列为国家安全战略的一部分&#xff0c;因此越来越多的行业开始迫切需要网安人员&#xff0c;也有不少人转行学习网络安全。那么网络安全可以从事哪些岗位?岗位职责是什么?相信很多人都不太了解&#xff0c;我们一起来看看吧。 1、安全…

电阻阻值读取方法、电容容值的读取方法

电阻、电容的数值读取方法 文章目录 电阻、电容的数值读取方法前言1、电阻读数1.1 贴片电阻1.2.直插色环电阻 2、电容读数2.1 电容单位换算2.2 电容读数方法 前言 现在随着电子产品的不断升级优化&#xff0c;做到体积越来越小了&#xff0c;以前发现还是用得很多直插电阻和一…

百年不用了,今天拾起来 sort() 排序

简单赘述一下需求。 原本前端调用后端接口是自带排序功能的&#xff0c;一般是按照创建单据的时间&#xff0c;后端会处理好返回给我们。 但是有时候有特别的限制&#xff0c;需要前端自行处理排序展示。 如上图所示&#xff0c; 列表和列表扩展行均要根据我们新增或编辑的时候…

ATTCK v13版本战术介绍——防御规避(五)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第25-30种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

什么蓝牙耳机好?业内权威蓝牙耳机排名TOP5

蓝牙耳机是当下最热门的数码产品&#xff0c;我个人已经买过十来款蓝牙耳机了&#xff0c;最近逛论坛看到知名数码论坛公布了蓝牙耳机排名TOP5&#xff0c;不懂什么蓝牙耳机好的朋友们在选购时可以从中入围的品牌中进行挑选。 一、JEET Air2蓝牙耳机 推荐理由&#xff1a;舒适…

springboot项目部署教程【本地+云服务器】

目录 前言一、环境准备二、项目导入三、配置Maven四、数据库导入五、启动项目六、浏览器访问结语 前言 springboot项目部署教程用最简单、暴力的方法完成项目导入。 &#x1f947;个人主页&#xff1a;MIKE笔记 &#x1f948;文章专栏&#xff1a;毕业设计源码合集 ⛄联系博主…

一、LLC 谐振变换器工作原理分析

1 前言 LLC 谐振电路采用脉冲频率调制(PFM)&#xff0c;通过改变驱动信号的频率来控制变换器的能量传输。谐振电路中的三个谐振元件为&#xff1a;谐振电感 Lr、谐振电容 Cr 和励磁电感 Lm&#xff0c;它们根据工作模式的不同可形成两个谐振频率。与串联谐振变换器相比&#x…

vue 组件 隐藏内容,点击展示更多功能

效果图 代码 <template><div class"m-text-overflow modules"><div class"l-content" :style"contentStyle"><div ref"refContent"><slot><span v-html"content"> </span></…

基于AT89C52单片机的万年历设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87777668?spm1001.2014.3001.5503 源码获取 主要内容&#xff1a; 本次设计所提出的一种基于单片机技术的万年历的方案&#xff0c;能更好的解决万年历显示的问题…

公司招人,面试了一个4年经验要20K的,一问自动化都不会····

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3、4年工作经验&#xf…