setTimeout不准时,CSS精准实现计时器功能

news2024/11/15 17:22:00

实际开发过程中,我们会经常遇到,首次进入页面进行相应提示,然后指定时间后自动消失或者前端时钟展示等需求。

按照传统方案,我们可以使用 setTimeout 实现。但其存在:实际延时比设定值更久的情况。

setTimeout 不准时

有很多因素会导致 setTimeout 的回调函数执行比设定的预期值更久。

最小延时 >= 4ms

  1. If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4. – HTML5 spec Timers

在浏览器中,由于函数嵌套到一定深度,会导致被阻塞。

function cb() { 
  setTimeout(cb, 0)
}
setTimeout(cb, 0)

未被激活的 tabs 的定时最小延迟>=1000ms

为了优化 tab 的加载损耗(以及降低耗电量),在未被激活的 tab 中定时器的最小延时限制为 1S(1000ms)。

超时延迟

除了"最小延时"之外,定时器仍然有可能因为当前页面(或者操作系统/浏览器本身)被其他任务占用导致延时。

需要被强调是,直到调用 setTimeout()的主线程执行完其他任务之后,回调函数和代码段才能被执行。

最大延时值

包括 IE、Chrome、Safari、Firefox 在内的浏览器其内部以 32 位带符号整数存储延时。这就会导致如果一个延时 (delay) 大于 2147483647 毫秒 (大约 24.8 天) 时就会溢出,导致定时器将会被立即执行。-- setTimeout/setInterval delay数值过大问题

打破 4ms 的限制

如果想在浏览器中实现 0ms 延时的定时器,可以尝试下述方法

(function() {
  var timeouts = [];
  var messageName = "zero-timeout-message";

  function setZeroTimeout(fn) {
    timeouts.push(fn);
    window.postMessage(messageName, "*");
  }

  function handleMessage(event) {
    if (event.source == window && event.data == messageName) {
      event.stopPropagation();
      if (timeouts.length > 0) {
        var fn = timeouts.shift();
        fn();
      }
    }
  }

  window.addEventListener("message", handleMessage, true);

  window.setZeroTimeout = setZeroTimeout;
})();

CSS更准时

如果要实现特别准时的业务场景(如,时钟)。显然 setTimeout/setInterval 不是最佳实践,如何避免同步阻塞卡顿,是突破该问题的重要一点。
在这里插入图片描述

这里,使用 css 动画来实现,css 动画有几个显著的优点:

  1. 不依赖 javascript,且有成熟的相关 api;
  2. 运行效果良好,甚至在低性能的系统上。渲染引擎会使用跳帧或者其他技术以保证动画表现尽可能的流畅;
  3. 让浏览器控制动画序列,允许浏览器优化性能和效果,如降低位于隐藏选项卡中的动画更新频率。

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
animation: timer 60s infinite steps(60) forwards;

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

在这里插入图片描述

通过 自定义数据属性 绑定要显示的值。这样在 css 中,可以通过表达式 attr() 用来获取值。

<div class="container">
  <p data-seconds="00 01 02 03 04 05 06 07 08 09"></p>
</div>

通过伪元素显示当前值(每次只显示1个),然后动画周期的时长 10s ,等距划分为10步。

每 1s 中移动向量的纵坐标。

.container p {
  height: 68px;
  width: 68px;
  line-height: 68px;
  overflow: hidden;
}
.container p::after {
  display: block;
  content: attr(data-seconds);
  animation: timer 10s infinite steps(10) forwards;
}

@keyframes timer {
  from {
    transform: translate3d(0, 0, 0);
  }
  to {
    transform: translate3d(0, -100%, 0);
  }
}

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

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

相关文章

单个案例奖金2000元!AidLux AI 应用案例悬赏征集活动第二期选题上线啦

AidLux AI 应用案例悬赏征集活动第一期开发者作品新鲜"出炉"啦&#xff01; 得益于AidLux在AI应用部署端的极大优势&#xff0c;开发者们在短时间内轻松落地了大批AI应用。 其中&#xff0c;不乏后厨老鼠识别告警系统、粮食作物特定病虫害告警系统、基于视觉的仰卧起…

专注主业、管控风险,中国春来的“非激进式扩张”

近日&#xff0c;中国春来发布截至2023年2月28日止六个月的中期业绩公告&#xff0c;期内收入同比增长14.2%至7.49亿元&#xff0c;利润同比上涨32%至3.31亿元&#xff0c;交出了亮眼的成绩单。 探究中国春来业绩上涨的原因&#xff0c;关键在于扩大招生。而招生规模很大程度上…

ChatGPT终于被我问到胡说八道的程度了!

问&#xff1a;Python是强类型语言&#xff0c;还是弱类型语言 chatgpt&#xff1a;Python是强类型语言。Python很少会隐式地转换变量的类型&#xff0c;所以Python是强类型的语言 问&#xff1a;什么是强类型语言 chatgpt&#xff1a;强类型语言是指在编程语言中&#xff0…

自动控制原理笔记-频率响应法-系统的开环频率特性图的绘制

目录 一、系统的开环对数频率特性图&#xff08;Bode图&#xff09; 绘制方法I&#xff1a;&#xff08;各环节的Bode图求和&#xff09; 绘制方法II&#xff1a;&#xff08;不求和&#xff0c;直接绘图&#xff09; 二、系统的开环幅相特性图&#xff08;Nyquist图、极坐标…

Linux网络编程——网络基础[1]

目录 1.网络发展 2.初识协议 2.1协议分层 2.2OSI七层模型 2.3TCP/IP四层(五层)模型 3.网络传输的基本流程 3.1协议报头 3.2局域网通信原理 3.3广域网通信原理 3.4数据包的封装和分用 4.网络中的地址管理 1.网络发展 计算机是帮助人解决计算问题的&#xff0c;而人…

实在智能出席第六届数字中国建设峰会,入围2022年信息技术应用创新优秀解决方案榜单

最美榕城四月天&#xff0c;山海之间尽显数字澎湃。这一周来&#xff0c;实在智能来到了“有福之州”&#xff0c;为数字中国建设增添实在色彩。 4月25日&#xff0c;实在华夏行抵达福州站&#xff0c;与众多生态合作伙伴携手共话数字发展新未来&#xff1b; 4月26日&#xff…

在DARTS空间中进行神经架构搜索(NAS)

前言 神经架构搜索(NAS)&#xff1a;自动化设计高性能深度神经网络架构的技术神经架构搜索任务主要有三个关键组成部分&#xff0c;即&#xff1a; 模型搜索空间&#xff0c;定义了一个要探索的模型的集合一个合适的策略作为探索这个模型空间的方法一个模型评估器&#xff0c;…

全景丨0基础学习VR全景制作,平台篇第15章:热点功能-音图文

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 音图文热点&#xff0c;即音频、图片、文字…

如何将redis部署在linux操作系统中:(十分详细的步骤)

一&#xff1a;通过虚拟机安装一个linux环境 注意&#xff1a;安装一个带有可视化界面的环境 将指标选中install centos7 按enter键 选择自己需要的语言 选中gui&#xff1a;桌面&#xff08;可视化界面) 只需要配置软件设置即可&#xff0c;其他的则进行默认配置进行 root用…

【stm32疑难杂症】:Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).

项目场景&#xff1a; 在使用工程是发现问题&#xff1a; ..\OBJ\OLED.axf: Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o). ..\OBJ\OLED.axf: Error: L6218E: Undefined symbol TIM_ITConfig (referred from timer.o). ..\OBJ\OLED.axf: Error: L6218E: …

少儿编程scratch

目录 少儿编程scratch 第一课 孙悟空72变 说绕口令的小猫 欢乐音乐会 海底世界 多变的章鱼哥 益虫与害虫 猫抓老鼠 监控报警器 神奇的画笔 小蝙蝠逃生记 森林里的体育课 寻找小狗哈哈 我是小小饲养员 青蛙王子 少儿编程scratch 第一课 需求描述&#xff1a;scratch的…

安卓缓存那些事情面试,一篇全部搞定

安卓缓存那些事情面试&#xff0c;一篇全部搞定 安卓缓存机制LruCache算法手写Bitmap的三级缓存一.为什么Bitmap三级缓存&#xff1f;二.原理三.代码 Bitmap的二次采样和质量压缩一.为什么二次采样二.哪二次采样三.代码:网络请求图片进行尺寸压缩四.质量压缩1.方法介绍2.案例&a…

携手中国电信打造 5G 智慧机场, ALVA Systems 创新 AR 应用闪耀云生态成果展

4 月 26 日&#xff0c;由国家网信办、国家发改委、科技部、工信部、国务院国资委、福建省人民政府共同主办&#xff0c;福州市人民政府等有关单位承办的第六届数字中国建设峰会数字福州暨生态大会在福州举办。 作为数字中国建设主力军之一&#xff0c;中国电信天翼云重磅亮相&…

Shell脚本编程入门--Day1

文章目录 什么是shell&#xff1f;变量环境变量的设置和显示特殊变量特殊的状态变量 什么是shell&#xff1f; 从技术角度&#xff0c;Shell的最简单定义&#xff1a;命令行解释器&#xff08;command Interpreter&#xff09;主要包含&#xff1a; 1, 将使用者的命令翻译给核…

COS 压测指南

COSBench 简介 COSBench 是一款由 Intel 开源&#xff0c;用于对象存储的压测工具。腾讯云对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;作为兼容 S3 协议的对象存储系统&#xff0c;可使用该工具进行读写性能压测。 系统环境 工具推荐运行在 CentO…

PyCharm 下载安装教程(中文语言包)

文章目录 下载安装简单创建项目中文语言包 Py Charm是由JetBrains打造的一款Python IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09; 下载 点击链接进入官网&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows …

PM864AK01-eA一极用于直流电压电平,地面是用于海底/地下电缆的永久返回路径

​ PM864AK01-eA一极用于直流电压电平&#xff0c;地面是用于海底/地下电缆的永久返回路径 高压直流输电 电力以交流电的形式产生和传输&#xff0c;但对于长距离传输&#xff0c;会产生很大的损耗&#xff0c;或者在两个交流系统无法同步的情况下。所以我们可以用直流输电的方…

【Java EE】-HTTP请求构造以及HTTPS的加密流程

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 在满园弥漫的沉静的光芒之前&#xff0c;一个人更容易看到时间&#xff0c;并看到自己的身影。——史铁生《我与地坛》 主要内容&#xff1a;构造http请求&…

大数据Doris(十一):Aggregate 数据模型

文章目录 Aggregate 数据模型 一、导入数据聚合 二、保留明细数据

16 opencv 图像开和闭运算

文章目录 形态学处理操作函数核操作 综合案例 形态学处理 处理类型操作作用开运算先腐蚀再膨胀可在纤细点出分离物体。有助于消除噪音闭运算先膨胀后腐蚀用于排除前景对象中的小孔或对象上的小黑点形态学梯度膨胀图与腐蚀图之差用于保留目标物体的边缘轮廓顶帽原图与开运算图之…