0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CSS 计数器的数字递增动效技术解析

454398 来源:oschina 作者:李中凯 2020-10-18 10:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

CSS 计数器是由 CSS 维护的变量,这些变量可根据 CSS 规则增加从而跟踪使用次数。我们可以利用这个特性,根据文档位置来调整内容表现,比如显示列表编号。

最近在公司官网就用到了这个特性:

image.png

因为这里的序号只是个装饰,并不强调先后顺序。比起使用真实 DOM 元素显示序号,CSS 计数器更加简洁灵活,万一内容顺序需要调整,序号也不受影响。

有时候我们会看到某些 Dashboard 界面有数字快速滚动的效果,比如招行 App 的账户余额。这种效果怎么实现呢?本文会介绍几种方法。

JavaScript 方案

最简单的莫过于用setInterval定时器了,定期修改 DOM 内容就行。不过为了实现更平顺的动画效果,更推荐使用requestAnimationFrame:

functionanimateValue(obj,start,end,duration){
letstartTimestamp=null;
conststep=(timestamp)=>{
if(!startTimestamp)startTimestamp=timestamp;
constprogress=Math.min((timestamp-startTimestamp)/duration,1);
obj.innerHTML=Math.floor(progress*(end-start)+start);
if(progress< 1) {
      window.requestAnimationFrame(step);
    }
  };
  window.requestAnimationFrame(step);
}

const obj = document.getElementById("value");
animateValue(obj, 100, 0, 5000);

js.gif

CSS @keyframes 结合 margin

这个思路比较有意思,原理是把数字排成一行,通过动画移动元素位置来显示不同位置的数字:



0
1
2
3
4
5
6
7
8
9
10
.counter{
width:100px;
overflow:hidden;
}
.numbers{
width:auto;
display:flex;
animation:countNumber4sinfinitealternate;
animation-timing-function:steps(10);
}
.numbersdiv{
text-align:center;
flex:00100px;
}

@keyframescountNumber{
0%{
margin-left:0px;
}
100%{
margin-left:-1000px;
}
}

keyframe.gif

CSS 计数器入门版

CSS 计数器使用到以下几个属性:

counter-reset - 创建或者重置计数器

counter-increment - 递增变量

content - 插入生成的内容

counter() 或 counters() 函数 - 将计数器的值添加到元素

要使用 CSS 计数器,得先用 counter-reset 创建。结合 CSS 动画@keyframes,在动画的不同阶段设置不同的递增值,就能实现这个效果:

div::after{
content:counter(count);
animation:counter3slinearinfinitealternate;
counter-reset:count0;
}

@keyframescounter{
0%{
counter-increment:count0;
}
10%{
counter-increment:count1;
}
20%{
counter-increment:count2;
}
30%{
counter-increment:count3;
}
40%{
counter-increment:count4;
}
50%{
counter-increment:count5;
}
60%{
counter-increment:count6;
}
70%{
counter-increment:count7;
}
80%{
counter-increment:count8;
}
90%{
counter-increment:count9;
}
100%{
counter-increment:count10;
}
}

CSS 计数器高配版

更进一步,如果敢用最新特性,其实有更秀的操作,那就是给 CSS 变量设置动画。这个技巧的核心就是设置 CSS 自定义属性为整数类型,这样就能像其他拥有整数类型值的 CSS 属性一样,可用于transition中了。

@property--num{
syntax:'';
initial-value:0;
inherits:false;
}

div{
transition:--num1s;
counter-reset:numvar(--num);
}
div:hover{
--num:10000;
}
div::after{
content:counter(num);
}

不过需要注意的是,目前只有 Chrome (或者 Chromium 内核的浏览器比如 Edge 和 Opera)支持@property语法,因此兼容性是个问题。如果你的页面只针对 Chrome(比如 Electron 应用),那就可以放心使用。否则还是用前面的保守方案吧。

小数也能玩动画

前面说的变量都要求是整数,那能不能让小数也支持这种动画呢?答案是可以的。

可以把小数转成整数。步骤原理是:

注册一个整型的 CSS 变量(即--number),指定初始值initial-value。

用calc将值取整:--integer: calc(var(--number))

@property--integer{
syntax:"";
initial-value:0;
inherits:false;
}
--number:1234.5678;
--integer:calc(var(--number));/*1235*/

如果只需要提取整数部分,可以这样:--integer: max(var(--number) - 0.5, 0),连calc()都不需要了。类似方法可以提取小数部分。

/*@property--integer*/
--number:1234.5678;
--integer:max(var(--number)-0.5,0);/*1234*/

完整代码:

@property--percent{
syntax:"";
initial-value:0;
inherits:false;
}
@property--temp{
syntax:"";
initial-value:0;
inherits:false;
}
@property--v1{
syntax:"";
initial-value:0;
inherits:false;
}
@property--v2{
syntax:"";
initial-value:0;
inherits:false;
}

div{
font:80040pxmonospace;
padding:2rem;
transition:--percent1s;
--temp:calc(var(--percent)*100);
--v1:max(var(--temp)-0.5,0);
--v2:max((var(--temp)-var(--v1))*100-0.5,0);
counter-reset:v1var(--v1)v2var(--v2);
}
div::before{
content:counter(v1)"."counter(v2,decimal-leading-zero)"%";
}
constgenNumber=()=>{
document.querySelector("div").style.setProperty("--percent",Math.random());
};

setInterval(genNumber,2000);
setTimeout(genNumber);


编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高精度频率计数器 数字式频率计 计数器生产厂家

    计数器
    jf_47371611
    发布于 :2026年04月02日 15:54:39

    计数器原理、应用及区别解析#颗粒计数器 @普洛帝测控

    计数器
    普洛帝测控
    发布于 :2026年03月27日 16:48:58

    颗粒计数器原理应用及区别深度解析

    在颗粒计数器领域,普洛帝(PULUODY) 是极具代表性的品牌,尤其在油液监测和洁净室检测两大核心板块拥有深厚的技术积累和市场占有率。作为陕西普洛帝测控技术有限公司的核心产品,其设备以“双激光 窄光检测
    的头像 发表于 03-25 15:11 208次阅读
    颗粒<b class='flag-5'>计数器</b>原理应用及区别深度<b class='flag-5'>解析</b>

    MAXIM DS1672 I2C 32位二进制计数器RTC:特性与设计详解

    。32位计数器每秒递增一次,可通过软件算法来推算出时、分、秒、周、月和年等时间信息。同时,它配备了精密的温度
    的头像 发表于 03-24 15:25 169次阅读

    深入解析DS1371:一款功能强大的I2C 32位二进制计数器看门狗时钟

    深入解析DS1371:一款功能强大的I2C 32位二进制计数器看门狗时钟 在电子设计领域,时钟芯片是许多系统中不可或缺的组件。今天,我们将深入探讨DALLAS SEMICONDUCTOR(现属
    的头像 发表于 03-24 10:10 252次阅读

    深入解析FAIRCHILD DM74ALS161B、DM74ALS162B、DM74ALS163B同步四位计数器

    深入解析FAIRCHILD DM74ALS161B、DM74ALS162B、DM74ALS163B同步四位计数器 一、引言 在电子设计领域,计数器是一种常见且重要的数字电路元件,广泛应
    的头像 发表于 03-12 15:40 250次阅读

    雷击计数器详解:原理、种类、优势与安装部署

    雷击计数器是防雷系统中关键监测设备,主要安装于建筑物、输电线路、通信塔或工业设施的引下线与接地系统之间,用于记录雷电流冲击次数。它通过感应雷击时导线中流过的瞬态大电流(通常波形为10/350μs
    的头像 发表于 03-11 09:49 188次阅读
    雷击<b class='flag-5'>计数器</b>详解:原理、种类、优势与安装部署

    MAXIM ICM7225:4 又 1/2 位计数器/解码/驱动技术剖析

    MAXIM ICM7224/7225:4 又 1/2 位计数器/解码/驱动技术剖析 作为电子工程师,在设计各类计数、频率测量及显示电路
    的头像 发表于 02-03 10:35 314次阅读

    如何挑对一款数字式频率计数器

     关键词:数字式频率计数器数字式频率计,时间间隔测量仪,频率计,国产频率计 频率通用计数器作为电子测量领域的“精准标尺”,广泛应用于研发调试、产线检测、计量校准等场景。选对设备不仅能
    的头像 发表于 01-07 18:47 213次阅读

    数字频率计数器在计量检测中的重要性 频率计数器 高精度通用计数器

    SYN5635型数字频率计数器是计量检测领域的核心基础仪器,其核心价值在于提供高精度频率与时间基准、保障量值统一、支撑全链路质量控制与合规溯源,是电子、通信、航天等领域测量可靠性的关键保障。 一
    的头像 发表于 01-05 17:53 1494次阅读
    <b class='flag-5'>数字频率计数器</b>在计量检测中的重要性 频率<b class='flag-5'>计数器</b> 高精度通用<b class='flag-5'>计数器</b>

    数字显示频率计数器功能介绍

    计数器
    西安同步电子科技有限公司
    发布于 :2025年11月06日 15:58:15

    国产频率计数器vs进口频率计数器

    计数器
    西安同步电子科技有限公司
    发布于 :2025年11月04日 17:55:01

    频率计数器/定时 时间间隔计数器的应用领域和范围的深度解析 频率计数器模块

    稳定性的核心优势,成为解决各时间测量需求的优选方案。 一、集成化高精度时间测量单元 SYN5620A是一款基于先进计时技术数字信号处理算法开发的时间间隔计数器模块,专为需要精准测量两个信号之间时间间隔、脉冲宽度、信号周期等参数
    的头像 发表于 10-30 11:22 703次阅读
    频率<b class='flag-5'>计数器</b>/定时<b class='flag-5'>器</b> 时间间隔<b class='flag-5'>计数器</b>的应用领域和范围的深度<b class='flag-5'>解析</b> 频率<b class='flag-5'>计数器</b>模块

    雷电(雷击)计数器的原理、作用及行业应用解决方案

    安全事故。雷电(雷击)计数器作为防雷系统中的重要组成部分,扮演着“记录雷击事件、辅助安全运维”的关键角色,已经成为智能防雷系统中不可或缺的一环。 二、雷电(雷击)计数器的原理 1. 工作原理 雷电计数器主要依靠电磁
    的头像 发表于 06-12 15:14 1272次阅读
    雷电(雷击)<b class='flag-5'>计数器</b>的原理、作用及行业应用解决方案