您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > CSS

纯 CSS 实现一个计时器

时间:2023-04-17 13:57:44  来源:微信公众号  作者:前端侦探

 

css 现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?

图片

样式上并不复杂,主要是几个交互的地方

  1. 数字时钟的变化
  2. 开始、暂停操作
  3. 重置操作

如何仅使用 CSS 来实现这样的功能呢?一起看看吧

一、数字时钟的变化

这里简单介绍一下实现原理。

在以前,如果要实现数字的递增变化,可能需要提前准备好这些数字,例如像这样。

<span>
 <i>1</i>
  <i>2</i>
  ...
  <i>59</i>
</span>

或者用伪元素创建也行。

span::before{
  content: '1A 2A 3A ... 59'
}

这种方式需要创建多个标签,略微繁琐,也不易扩展。现在有更简洁的方式可以实现了,那就是 CSS @property[2]。这是干什么的呢?简单来讲,可以自定义属性,在这个例子中,可以让数字像颜色一样进行过渡和动画,可能不太懂,直接看例子吧

假设 html 是这样的。

<span style="--num: 0"></span>

我们让这个自定义变量在页面中展示出来,单纯的 content无法直接显示自定义变量,需要借助计数器,有兴趣的可以参考这篇文章:小tips: 如何借助content属性显示CSS var变量值[3]

 
span::after{
  counter-reset: num var(--num);
  content: counter(num);
}

图片

现在可以通过:hover改变这个数字。

span:hover::after{
  --num: 59
}

图片

很生硬的从 0 变成 59 了,非常符合常规,因为--num​并不支持过渡动画。如果利用 CSS property,情况就不一样了,需要改造的地方很少,先定义一下--num,然后给这个变量一个过渡时间,如下:

@property --num { 
  syntax: '<integer>';
  inherits: false;
  initial-value: 0;
}
span::after{
  transition: 1s --num;
}

神奇的一幕发生了。

图片

看着好像不可思议?可以这么理解,通过@property定义后,这个变量本身可以单独设置过渡了,而不再取决于一些仅支持过渡的属性(color、width等)。还可以使用动画,如下:

@keyframes num {
  to {
    --num: 10
  }
}
span{
  animation: num 1s infinite steps(10);
}

数字变化的基本原理就是这样了,一个无限循环的 CSS 动画!

图片

回到这里,这里需要的是一个秒表,分为“分”、“秒”、“毫秒”(这里的毫秒就用 1/100秒来代替),3个数字的动画时长都不一致,所以需要定义3个 CSS 变量,完整实现如下:

@keyframes minitus {
  to {
    --m: 59
  }
}
@keyframes seconds {
  to {
    --s: 59
  }
}
@keyframes ms {
  to {
    --ms: 99
  }
}
span{
  counter-reset: minitus var(--m) seconds var(--s) ms var(--ms);
  animation: minitus 3600s infinite steps(60, end), 
    seconds 60s infinite steps(60, end), 
    ms 1s infinite steps(100, end);
}
span::before{
  content: counter(minitus, decimal-leading-zero) ':' counter(seconds, decimal-leading-zero) ':' counter(ms, decimal-leading-zero);
}

这样就得到了一个自动运行的秒表。

图片

二、开始、暂停操作

首先思考一下,CSS 需要怎样记住点击操作?答案就是input type="checkbox"(通过label关联),可以这样来布局。

<div class="counter">
  <input type="checkbox" id="start" hidden>
  <label class="btn start" for="start"></label>
  <label class="btn reset">重置</label>
  <div class="clock"></div>
</div>

因为需要通过input:cheked来控制秒表的状态,需要借助后置兄弟选择器~来实现,所以input需要在前面(当然,现在有了:has也可以不需要这样)。

这里可以通过grid布局来灵活摆放各个模块的位置。

.counter{
  display: grid;
  grid-template-areas:
    "clock clock"
    "start reset"
}
.start{
  /**/
  grid-area: start;
}
.reset{
  /**/
  grid-area: reset;
}

简单美化以后,可以得到这样的效果:

图片

然后,由于秒表的运行其实就是一个 CSS 动画,所以我们可以直接用:cheked来控制动画的状态,默认设置成暂停的,还有按钮文字也可以通过::before来生成,实现如下:

.clock{
  animation-play-state: paused;/*默认暂停*/
}
.start::before{
  content: '开始';
}
:checked~.start::before{
  content: '暂停';
}
:checked~.clock{
  animation-play-state: running;
}

这样就可以通过按钮手动控制开始和暂停了

图片

三、重置操作

重置看起来好像有点麻烦,有点无从下手。

其实重置一个动画非常简单,直接将动画取消就可以了,也就是相当于重置了动画,如下:

.reset:active+.clock{
  animation: none;
}

其次,重置一般只有在暂停时才可用,所以还需要用前面的:checked禁用一下,并且视觉上可以透明度降低一点,实现如下:

:checked~.reset{
  opacity: .65;
  pointer-events: none;
}

这样就得到了文章开头所示的效果:

图片

当然,你还可以使用自定义字体,比如DigitalNumbers。

图片

完整代码可以查看以下任意链接:

  • CSS counter (juejin.cn)[4]
  • CSS counter (codepen.io)[5]
  • CSS counter (runjs.work)[6]

四、会影响业务逻辑吗?

还有一点,有同学担心 CSS 只是视觉层面的,可能会影响业务逻辑。

图片

确实,由于是伪元素渲染,页面上看不到任何数字,也就是无法直接通过innerText获取当前时间,但是,我们可以借助getComputedStyle来得到 CSS 变量。

getComputedStyle($0).getPropertyValue('--ms')

实时获取如下:

图片

所以通过 CSS 方式也是完全不影响业务逻辑的。

五、兼容性和总结

由于在实现中用到了CSS @property特性,这是CSS Houdini的一部分,目前只有 Chrome 支持(可惜了



Tags:CSS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
12 个超级实用的 CSS 技巧
user-selectuser-select 属性可以用来控制用户是否能够选择文本。<div> <p>You can&#39;t select this text.</p></div><p>You can select this text.</p>CSS:div { width...【详细内容】
2023-12-19  Search: CSS  点击:(129)  评论:(0)  加入收藏
Vue里使用Tailwind CSS,这不是耍流氓吗
前言随着前端的发展,对前端页面的要求越来越高,而css的功能也越来越强大,但对于写css样式来说却是非常头疼的的事。因为前端页面的动画要求以及页面布局的精细管控,需要写大量的...【详细内容】
2023-12-11  Search: CSS  点击:(162)  评论:(0)  加入收藏
原生CSS嵌套使用,你学明白了吗?
如果你是一个前端开发人员,那么你应该使用过CSS预处理器以及预处理器中的嵌套特性。它一直是一个受欢迎的功能,我一直都在使用CSS预处理器。今年所有的主流浏览器都支持原生CS...【详细内容】
2023-12-06  Search: CSS  点击:(181)  评论:(0)  加入收藏
CSS_Flex 那些鲜为人知的内幕
前言Flex想必大家都很熟悉,也是大家平时在进行页面布局的首选方案。(反正我是!)。不知道大家平时在遇到Flex布局属性问题时,是如何查阅并解决的。反正,我每次记不住哪些属性或...【详细内容】
2023-12-06  Search: CSS  点击:(139)  评论:(0)  加入收藏
CSS:这几个伪类,你用了吗
## :root 伪类:root 伪类是匹配文档的根元素,很多时候,根元素也就是 html 元素,用 root 伪类来匹配根元素,目的就是解决根元素不是 html 的场景,比如根元素是 svg 的时候。 root...【详细内容】
2023-11-30  Search: CSS  点击:(169)  评论:(0)  加入收藏
新 CSS Math方法:Rem() 和 Mod()
CSS 添加了许多新的数学函数来补充旧有的函数(如 calc() 和最近的 clamp() )。这些函数最终都表示一个数值,但其工作原理的细微差别并不总是一开始就很清楚。本文介绍每个函数...【详细内容】
2023-11-23  Search: CSS  点击:(254)  评论:(0)  加入收藏
CSS 新功能:让编码更高效
CSS 是一种不断发展的语言。每一次迭代,它都会变得越来越好。因此,了解最新的 CSS 功能非常重要,这样你才能在项目中使用它们,减少对第三方库的依赖。本文将介绍一些即将推出的...【详细内容】
2023-11-16  Search: CSS  点击:(163)  评论:(0)  加入收藏
使用 CSS Grid 的响应式网页设计:消除媒体查询过载
前言你是否厌倦了在实现响应式网站时需要管理多个媒体查询?说再见复杂的代码,拥抱更简单的解决方案吧:CSS Grid。在这篇文章中,我们将踏上一场激动人心的 CSS Grid 之旅,发现它如...【详细内容】
2023-11-10  Search: CSS  点击:(275)  评论:(0)  加入收藏
CSS这几个函数很实用,也很简单
calc()CSS 的 calc 函数非常实用,很多情况下,我们都会用到这个函数。calc 函数支持加减乘除四种运算,但是,它也有限制: 运算符前后带有单位或者百分比的数值,只能进行加减,不能进行...【详细内容】
2023-11-08  Search: CSS  点击:(219)  评论:(0)  加入收藏
这三个CSS生成器千万别错过啦!
前言 大家好我是小卢,「新拟态风格」和「磨砂玻璃」风格都是让人眼前一亮的一种设计风格,已经成为了最具代表性的设计趋势之一。 但是我们在真正写 CSS 的时候不容易调整这个...【详细内容】
2023-11-03  Search: CSS  点击:(159)  评论:(0)  加入收藏
▌简易百科推荐
12 个超级实用的 CSS 技巧
user-selectuser-select 属性可以用来控制用户是否能够选择文本。<div> <p>You can&#39;t select this text.</p></div><p>You can select this text.</p>CSS:div { width...【详细内容】
2023-12-19  前端充电宝  微信公众号  Tags:CSS   点击:(129)  评论:(0)  加入收藏
原生CSS嵌套使用,你学明白了吗?
如果你是一个前端开发人员,那么你应该使用过CSS预处理器以及预处理器中的嵌套特性。它一直是一个受欢迎的功能,我一直都在使用CSS预处理器。今年所有的主流浏览器都支持原生CS...【详细内容】
2023-12-06  南城大前端  微信公众号  Tags:CSS   点击:(181)  评论:(0)  加入收藏
CSS_Flex 那些鲜为人知的内幕
前言Flex想必大家都很熟悉,也是大家平时在进行页面布局的首选方案。(反正我是!)。不知道大家平时在遇到Flex布局属性问题时,是如何查阅并解决的。反正,我每次记不住哪些属性或...【详细内容】
2023-12-06  前端柒八九  微信公众号  Tags:CSS   点击:(139)  评论:(0)  加入收藏
CSS:这几个伪类,你用了吗
## :root 伪类:root 伪类是匹配文档的根元素,很多时候,根元素也就是 html 元素,用 root 伪类来匹配根元素,目的就是解决根元素不是 html 的场景,比如根元素是 svg 的时候。 root...【详细内容】
2023-11-30  读心悦  微信公众号  Tags:CSS   点击:(169)  评论:(0)  加入收藏
让你开发更舒适的 Tailwind 技巧
免费体验 Gpt4 plus 与 AI作图神器,我们出的钱 体验地址:体验使用 Tailwind CSS,我避免了在 React 项目中复制大量 CSS 文件的麻烦,使网页开发变得更加迅速高效。虽然 Tailwind...【详细内容】
2023-11-28  大迁世界  微信公众号  Tags:Tailwind   点击:(175)  评论:(0)  加入收藏
Display和Visibility的区别,你了解了吗?
采用CSS实现元素隐藏的方法有很多种,比如定位到屏幕之外、透明度变换等。而常见的两种方式是将元素设置为display:none或者visibility:hidden。元素样式设置为display:none当...【详细内容】
2023-11-27  读心悦  微信公众号  Tags:Display   点击:(171)  评论:(0)  加入收藏
新 CSS Math方法:Rem() 和 Mod()
CSS 添加了许多新的数学函数来补充旧有的函数(如 calc() 和最近的 clamp() )。这些函数最终都表示一个数值,但其工作原理的细微差别并不总是一开始就很清楚。本文介绍每个函数...【详细内容】
2023-11-23  大迁世界  微信公众号  Tags:CSS   点击:(254)  评论:(0)  加入收藏
CSS 新功能:让编码更高效
CSS 是一种不断发展的语言。每一次迭代,它都会变得越来越好。因此,了解最新的 CSS 功能非常重要,这样你才能在项目中使用它们,减少对第三方库的依赖。本文将介绍一些即将推出的...【详细内容】
2023-11-16  大迁世界  微信公众号  Tags:CSS   点击:(163)  评论:(0)  加入收藏
使用 CSS Grid 的响应式网页设计:消除媒体查询过载
前言你是否厌倦了在实现响应式网站时需要管理多个媒体查询?说再见复杂的代码,拥抱更简单的解决方案吧:CSS Grid。在这篇文章中,我们将踏上一场激动人心的 CSS Grid 之旅,发现它如...【详细内容】
2023-11-10  前端YUE  微信公众号  Tags:CSS   点击:(275)  评论:(0)  加入收藏
2024年了,别只使用React,需要学习一下Vue,不然没出路了
最近,我的朋友因为不熟悉 Vue.js 而未能通过面试。她平时工作中大部分时间都在使用React,所以也懒得去了解其他前端框架。世界上所有的前端框架我们都应该熟悉吗?不,这是极其不...【详细内容】
2023-11-08  web前端开发  微信公众号  Tags:Vue   点击:(294)  评论:(0)  加入收藏
站内最新
站内热门
站内头条