Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >发明专利公开 -- CSS动画精准实现时钟

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

作者头像
奋飛
发布于 2023-05-13 06:48:36
发布于 2023-05-13 06:48:36
98300
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

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

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

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

前置知识

伪元素

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

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

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

  • 伪元素不属于文档,所以js无法操作它
  • 伪元素属于主元素的一部分,因此点击伪元素触发的是主元素的click事件
  • 块级元素才能有:before, :after,其实是不妥的,大部分行级元素也可以设置伪元素,但是像img可替换元素,因为其外观和尺寸有外部资源决定,那么如果外部资源正确加载,就会替换掉其内部内容,这时伪元素也会被替换掉,但是当外部资源加载失败时,设置的伪元素是可以起作用的。
示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a::after {
	content: "→";
}

数据属性 data-*

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

attr()

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

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

示例

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
  a:hover::after {
    content: attr(data-hover);
  }
style>
<body>
	<a href="javascript:void(0);" data-hover="hover展示内容">hovera>
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 或者 ms

60s

animation-timing-function

在每一动画周期中执行的节奏

ease、linear、steps(60)

animation-delay

定义动画于何时开始,单位 s 或者 ms

100ms

animation-iteration-count

定义动画在结束前运行的次数

infinite(无限次)、3

animation-direction

指示动画是否反向播放

normal、alternate、reverse

animation-fill-mode

设置 CSS 动画在执行之前和之后如何将样式应用于其目标

forwards、backwards

animation-play-state

定义一个动画是否运行或者暂停

running、paused

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

示例

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
animation: timer 10s infinite steps(10) forwards;

translate

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

示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a:hover {
  translate: 200px 50px;
  /*等价于*/
  transform: translate(200px, 50px);
}

实现思路

步骤一:定义DOM

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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,

后续解释作用(见步骤四)。

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 来展示下一个数值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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 份(六十进制),一个周期
  • 小时:等距 24 份(二十四进制),一个周期
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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

3600 - 58*60 - 50 $),小时就应该变成 19。

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

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

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

步骤一,中提到的

就是为此。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/05/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
setTimeout不准时,CSS精准实现计时器功能
实际开发过程中,我们会经常遇到,首次进入页面进行相应提示,然后指定时间后自动消失或者前端时钟展示等需求。
奋飛
2023/05/07
6970
setTimeout不准时,CSS精准实现计时器功能
(2019)[前端]面试题[8]:CSS动画中的transition和animation
有一个很有意思的现象:如果把transition: width 1s 0.5s ease-in-out;写在:hover上会怎样?
无道
2019/11/13
2.3K0
(2019)[前端]面试题[8]:CSS动画中的transition和animation
5个让页面"活"起来的CSS特效
随着越来越多的浏览器对CSS3支持的不断完善,设计师和开发者们有了更多的选择去实现一些炫酷特效。小师妹整理了最近项目中使用到的5个比较实用的CSS3动画演示。让我们一起看看CSS3是如何让页面秀起来的。
程序员老鱼
2022/12/02
1.3K0
CSS动画简介
现在,我很少写介绍CSS的文章,因为感觉网站开发的关键还是在服务器端。 但是,CSS动画除外,它实在太有用了。 本文介绍CSS动画的两大组成部分:transition和animation。我不打算给出
ruanyf
2018/04/13
1.2K0
CSS动画简介
CSS3动画属性 animation详解(看完就会)
轮播图swiper框架的基本使用 【Transform3D】转换详解(看完就会) 【css动画】移动的小车
坚毅的小解同志的前端社区
2022/11/28
1.1K0
CSS3动画属性 animation详解(看完就会)
2019年了,你还不会CSS动画?
今年我面试了很多同学,只要看到简历上写“熟练掌握CSS3”的,我都会问问动画相关知识。然而我发现:都 2019 年了,还有很多同学不会 CSS 动画。
Nealyang
2019/11/04
4570
HTML5+CSS3学习总结(完结)
万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改,作为HTML语言,具有新的元素、属性和行为。
全栈程序员站长
2022/07/25
2.4K0
HTML5+CSS3学习总结(完结)
「HTML&CSS」第二部分
请注意,本文编写于 2106 天前,最后修改于 174 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
2230
「HTML&CSS」第二部分
【前端攻略--HTML/CSS】这是你需要的transform学习教程
transition语法格式:transition: property duration timing-function delay;
野原测试开发
2019/07/10
1K0
css中的动画效果
在前端中,随着语言的发展,css变得越来越强大,可以实现许多动态动画效果! 下面是动画效果的基本格式
用户8247415
2021/04/13
2.4K0
css中的动画效果
动画(CSS3) animation
动画是CSS3中具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。
星辰_大海
2020/09/30
9580
CSS3 动画
动画(animation)是CSS3中具有颠覆性的特征之一,可通过设置多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。 相比较过渡,动画可以实现更多变化,更多控制,连续自动播放等效果。
梨涡浅笑
2022/05/08
4990
CSS3 动画
彻底了解CSS3帧动画
animation-name 可以指定多个值,每个用 , 隔开,多个值表明有多个帧动画。
多云转晴
2020/06/28
1K0
第100天:CSS3中animation动画详解
CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation;
半指温柔乐
2018/09/11
6700
8个硬核技巧带你迅速提升CSS技术
笔者选择了一些常用甚至有些小册都未提及到的干货作为分享内容,相信这些内容能帮助同学们在短期内提升CSS编码素质,实现一些看似只能由JS才能实现的效果。
javascript艺术
2021/05/28
2.8K0
8个硬核技巧带你迅速提升CSS技术
css3 动画应用 animations 和transtions transform在加上JavaScript 可以实现硬件加速动画。
transitions(过渡) 被应用于元素指定的属性变化时,该属性经过一段时间逐渐的过渡到最终想要的值。   主要包括四个属性:     执行变换的属性:transition-property 变换延续的时间:transition-duration     变换的速率变化:transition-timing-function     变换延迟时间:transition-delay。     1.transition-propery       语法:transition-property:
用户1197315
2018/01/19
1.7K0
CSS3 animation动画 - 转风车、loding加载、人物走路等示例
1、@keyframes 定义关键帧动画 2、animation-name 动画名称 3、animation-duration 动画时间 4、animation-timing-function 动画曲线 linear(匀速)|ease(缓冲)|steps(步数) 5、animation-delay 动画延迟 6、animation-iteration-count 动画播放次数 n|infinite 7、animation-direction 动画结束后是否反向还原 normal|alternate 8、animation-play-state 动画状态 paused(停止)|running(运动) 9、animation-fill-mode 动画前后的状态 none(缺省)|forwards(结束时停留在最后一帧)|backwards(开始时停留在定义的开始帧)|both(前后都应用) 10、animation:name duration timing-function delay iteration-count direction;同时设置多个属性
Devops海洋的渔夫
2019/05/31
1.6K0
CSS旋转动画和动画的拼接
linear是匀速运动,还可以设置为: ease 默认。动画以低速开始,然后加快,在结束前变慢。 ease-in 动画以低速开始。 测试 ease-out 动画以低速结束。 测试 ease-in-out 动画以低速开始和结束。 测试 cubic-bezier(n,n,n,n) 在 cubic-bezier 函数中自己的值。可能的值是从 0 到 1 的数值。 infinite是无限次播放的意思,这里也可以写个数字,来控制播放几次;
liulun
2019/09/29
1.7K0
CSS3
box-shadow: h-shadow v-shadow blur spread color inset;
ymktchic
2022/01/18
3790
CSS3
HTML与CSS进阶
本文主要介绍H5新增内容以及CSS3中的新特性。在H5方面主要介绍拓展了哪些内容,CSS3方面介绍动画及转换。
小城故事
2023/03/10
3K0
HTML与CSS进阶
相关推荐
setTimeout不准时,CSS精准实现计时器功能
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验