使用css3实现一个超浪漫的新年倒计时

news2025/1/25 4:37:18

新年快到了,使用css3实现一个超浪漫的新年倒计时吧,希望大家喜欢。

目录

1 实现思路 

2 实现浪漫的心形背景

3 布局小时分钟和秒的区域

4、js倒计时 

5、然后就是将所得的小时、分钟、秒对DOM进行赋值 

6、每秒一更新 

7、补充知识点1- 倒计时为什么不写1000

8、补充知识点2- 切换页面再切回来,倒计时会疯狂跳动一下

 9、完整源代码

结语:


1 实现思路 

根据最近比较火爆的点燃你,温暖我得到启发,我可以获取浪漫的心形做为背景,彰显时间在浪漫的流金岁月中飞速度过;

然后通过水平垂直居中定位的方式,将小时,分钟,秒布局好;

采用css3的box-shadow和text-shadow对区块和字体进行更加浪漫的氛围渲染;

再利用js进行倒计时的秒级递减进行赋值,得到最终的倒计时。

2 实现浪漫的心形背景

首先寻求一张浪漫的心形背景,做为浪漫的铺垫。然后设定body的背景图片。注意这里的高度要设定为100vh,而background要设定repeat属性值,使整个页面铺满,彰显浪漫。代码如下:

body {
  width: 100%;
  height: 100vh;
  background: url(./bg2.png) repeat;
}

 

3 布局小时分钟和秒的区域

这里使用水平垂直居中的方式,设定一个主区域,然后通过flex布局定制3个区块,做为小时,分钟,秒的显示。而且每个区块要通过css3做一定的阴影效果,这里采用的是box-shadow和text-shadow,(注意,这一步暂时还是假数据,不必在这一步纠结于数据,后面会有动态的)代码如下:

.outer-box {            
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  display: flex;
  justify-content: space-between;
  width: 640px;
  height: 200px;
}
.box {
  width: 200px;
  height: 200px;
  border-radius: 50%;
  box-shadow: -4px -2px 163px #ff0033;
  color: red;
  text-align: center;
  line-height: 200px;
  background: rgba(0, 0, 0, 0.8);
  font-size: 80px;
  letter-spacing: 3px;
  text-shadow: -1px -4px #6c6775;
}
<div class="outer-box">
    <div class="box" id="hour">
       580
       <div>时</div>
    </div>
    <div class="box" id="min">
        58
        <div>分</div>
     </div>
     <div class="box" id="sec">
        58
        <div>秒</div>
     </div>
</div>

 

4、js倒计时 

首先已知新年时间是2022年12月31日23点59分59秒,通过把这个时间带入new Date()中得到毫秒值,与当前毫秒值进行减法操作。再以此通过将毫秒值差换算为小时,分钟和秒即可。

注意这里主要用到了除数和余数的概念,代码如下:

let yearTime = new Date('2022-12-31 23:59:59').getTime();
let now = new Date().getTime();
let value = yearTime - now;  // 毫秒的差值
let hour = Math.floor(value/(1000*60*60));  // 剩余小时数
let min = Math.floor(value%(1000*60*60)/(1000*60));  // 剩余分钟数
let sec = Math.floor(value%(1000*60*60)%(1000*60)/1000); // 剩余描述

5、然后就是将所得的小时、分钟、秒对DOM进行赋值 

首先是通过js的document.getElementById的方式分别获取3个区块的DOM区域,然后再将上一步获取到的计算值,为DOM进行赋值。这一步赋值采用的是innerHTML的方式,代码如下:

let hourDom = document.getElementById('hour');
let minDom = document.getElementById('min');
let secDom = document.getElementById('sec');
hourDom.innerHTML = hour + '<div>时</div>';
minDom.innerHTML = min + '<div>分</div>';
secDom.innerHTML = sec + '<div>秒</div>';

6、每秒一更新 

这里用到了setInterval函数,通过每秒一次重新获取当前时间戳的方式,再去不断的与新年时间进行对比计算,而每次的计算的过程是一样的,都是上一步的代码。代码如下:

let countSecondFn = setInterval(() => {
    。。。。。。
    上一步的代码块
    。。。。。。
}, 980)

7、补充知识点1- 倒计时为什么不写1000

说好的倒计时,不就是一秒,也就是1000毫秒执行一次嘛,怎么写个980呢?

记得某一段时间专门统计过,一台普通手机(6C8G)的新手机,一秒大概执行10W行js代码吧。所以如果你的倒计时写在项目里,如果还用了vue / react 这些框架,那么执行一次倒计时,可能就会牵涉出不知道多少行的代码,最终才会被浏览器识别到你的代码,进而一步步渲染到页面上。

所以,如果还是写1000执行一次,那结果很可能是真正的新年钟声已经开敲了,咱们的倒计时还在继续

8、补充知识点2- 切换页面再切回来,倒计时会疯狂跳动一下

这是因为浏览器对setInterval有节约内存的特性,当你切换页面离开的时候,他就会暂时休眠,当你再切换回来的时候,浏览器就会把之前的休眠时间补上。

所以,我们只需要在监测到页面切换走的时候,将定时器停止掉,再监测浏览器被切回的时候,执行定时器即可。

这个时候你可以通过一下代码进行操作:

document.addEventListener('visibilitychange',function(){
   if(document.visibilityState=='hidden'){
      window.clearInterval(countSecondFn);
      countSecondFn = null;
    }else if(document.visibilityState=='visible'){
      goOnCount();
    }
});

 9、完整源代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>超浪漫新年倒计时</title>
        <style>
            html, body, * {
                margin: 0;
                padding: 0;
            }
            body {
                width: 100%;
                height: 100vh;
                background: url(./bg2.png) repeat;
            }
            .outer-box {
                display: flex;
                justify-content: space-between;
                width: 640px;
                height: 200px;
                position: absolute;
                top: 0;
                right: 0;
                bottom: 0;
                left: 0;
                margin: auto;
            }
            .box {
                width: 200px;
                height: 200px;
                background: rgba(0, 0, 0, 0.8);
                box-shadow: -4px -2px 163px #ff0033;
                color: red;
                text-align: center;
                line-height: 200px;
                font-size: 80px;
                letter-spacing: 3px;
                text-shadow: -1px -4px #6c6775;
                border-radius: 50%;
            }
        </style>
    </head>     
    <body>
        <div class="outer-box">
            <div class="box" id="hour">
                580
                <div>时</div>
            </div>
            <div class="box" id="min">
                58
                <div>分</div>
            </div>
            <div class="box" id="sec">
                58
                <div>秒</div>
            </div>
        </div>
        <script>
            

            function goOnCount() {
                let countSecondFn = setInterval(() => {
                    let yearTime = new Date('2022-12-31 23:59:59').getTime();
                    let now = new Date().getTime();
                    let value = yearTime - now;
                    let hour = Math.floor(value/(1000*60*60));
                    let min = Math.floor(value%(1000*60*60)/(1000*60));
                    let sec = Math.floor(value%(1000*60*60)%(1000*60)/1000);

                    let hourDom = document.getElementById('hour');
                    let minDom = document.getElementById('min');
                    let secDom = document.getElementById('sec');
                    hourDom.innerHTML = hour + '<div>时</div>';
                    minDom.innerHTML = min + '<div>分</div>';
                    secDom.innerHTML = sec + '<div>秒</div>';
                }, 980)
            }

            goOnCount();

            function stopCount() {
                window.clearInterval(countSecondFn);
                countSecondFn = null;
            }

            document.addEventListener('visibilitychange',function(){
                if(document.visibilityState=='hidden'){
                    stopCount();
                }else if(document.visibilityState=='visible'){
                    goOnCount();
                }
            });
        </script>
    </body>
</html>

 

结语:

希望伴随着倒计时,2022年一切的不如意都早点烟消云散,但不管未来的2023年会怎么样,我们也应该勇敢的冲上去,哪怕失败了,至少我们冲过。

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

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

相关文章

爆款微信小游戏,你都知道几款?

紧随微信2017年上线小程序平台&#xff0c;11月份便开始向各大小游戏厂商发送邀请函开发微信小游戏。2017年12月28日&#xff0c;微信正式对外开放微信小游戏。 就微信小游戏来说&#xff0c;其开发者数量在今年已经超过10万人&#xff1b;而产品方面除了《跳一跳》《羊了个羊…

全网首次揭秘:微秒级“复活”网络的HARP协议及其关键技术

导读&#xff5c;云计算时代&#xff0c;承担服务器之间数据传输工作的交换机成了数据中心的“神经枢纽”&#xff0c;一旦出故障将波及上层业务。然而单个交换机故障时&#xff0c;腾讯云的新一代高性能网络却可以在100微秒内找到新的通路实现0断链&#xff0c;做到高可用、高…

基于springboot layui疫苗接种信息管理系统源码

开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;springboot layui 伴随着社会的迅速发展&#xff0c;电子计算机对世界的作用影响是全面并且长久的。人们日常生活消费综合应用水平的持续增高&#xff0c;生活中人…

[ 数据结构 -- 手撕排序算法总结篇 ]

文章目录前言一、常见的排序算法二、测试排序的性能对比随机数排序时间对比有序数排序时间对比三、排序算法的复杂度四、排序算法的稳定性前言 手撕排序算法总结 本篇文章进行总结&#xff0c;我会对比并分析常见的几种排序&#xff0c;例如像插入排序&#xff0c;冒泡排序&am…

【金猿案例展】福特电马——一键五联私域流量运营

‍映盛中国案例本项目案例由映盛中国投递并参与“数据猿年度金猿策划活动——《2022大数据产业年度创新服务企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业随着中国电动车市场及消费者对电动汽车的需求的不断变化&#xff0c;汽车市场进入存量竞争时…

如何用VS2010创建并生成动态链接库

1、目的 在某些应用程序场景下&#xff0c;需要将一些类或者方法编译成动态链接库dll&#xff0c;以便别的.exe或者.dll文件可以通过第三方库的方式进行调用&#xff0c;下面就简单介绍一下如何通过VS2010来创建动态链接库。 2、新建动态链接库 1&#xff09; 打开VS2010&…

546103-85-9,PR-AMC,二肽标记肽

PR-AMC, a fluorogenic Plasmodium falciparum dipeptidyl aminopeptidase 1 (DPAP1, cathepsin C) substrate.一种含氟恶性疟原虫二肽基氨基肽酶1 (DPAP1&#xff0c;组织蛋白酶C)底物。编号: 177167 中文名称: 二肽标记肽PR-7-氨基-4-甲基香豆素2HCl英文名: H-Pro-Arg-AMCCAS…

clickhouse 数据字典使用详解

一、数据字典介绍 数据字典是ClickHouse提供一种非常简单且实用的存储媒介&#xff0c;他以键值和属性映射的形式定义数据。字典中的数据会主动或被动加载到内存并支持动态更新。由于字典数据常驻内存的特性&#xff0c;所以非常适合保存常量或经常使用的维度表数据&#xff0c…

2001-2020年沪深A股上市公司管理者短视主义指标数据

2001-2020年沪深A股上市公司管理者短视主义指标数据 1、时间&#xff1a;2001-2020年 2、包括所有沪深A股所有上市公司 3、指标包括&#xff1a; 证券代码&#xff1a;以上海证券交易所和深圳证券交易所公布的证券代码为准。 证券简称&#xff1a;以上海证券交易所和深圳证…

从搭建到落地,详解证券基金行业数字化运营体系

近年来&#xff0c;金融行业的数字化转型呈现了新的特点&#xff0c;即要做更精准的营销和数字化运营。本文根据神策数据杨雪杉关于《面向落地的证券基金行业运营体系搭建》的主题演讲整理&#xff0c;点击文末“阅读原文”即可观看完整版演讲回放。一、基于 SDAF 数据闭环方法…

ubuntu20.04 设置 rc.local 开机自启动脚本一文配置

前言 系统:ubuntu20.04LTS 本来觉得似乎好像是一件简单的事情 实际运行处理的时候发现还是有点复杂,面对这样的过程中的总结如下: 第一步 终端执行查看开机可以启动的服务, 执行 ls /lib/systemd/system 你可以看到有很多启动脚本, 其中就有我们需要的 rc-local.s…

让你室友、工友、小孩断网 安全风险演示

前提&#xff1a; ① 、你需要 和 你室友处于同一个局域网&#xff0c;互相能ping通 ②、你需要知道你室友的IP ③、您可能需要一个linux 设备&#xff0c;手机也行&#xff08;需要安装termux 来执行命令&#xff09;、linux系统电脑、树莓派等都可以。 -----------------…

【MAX7800羽毛板更新固件及下载bug修复】

【MAX7800羽毛板更新固件及下载bug修复】1. 前言2. 首次固件更新2.1 更新MAX32625PICO&#xff08;“PICO”&#xff09;调试适配器固件2.2 使用eclipse开发3. 下载bug修复3.1 当你的下载口出现Error: Target not examined yet3.2 修复方法5. 小结1. 前言 原理图和BOM可在MAX7…

express再度复习,小白篇

js----后端编程&#xff0c;Express框架,npm包管理工具,- es6模块化,使用express创建web应用,路由拆分&#xff0c;中间件 &#xff0c; 热更新&#xff0c;脚手架_阿 尭的博客-CSDN博客之前学习的时候整理的一篇草率博客&#xff0c;复习的时候混忘了。今天再重新学习一下expr…

【强化学习基础】强化学习的基本概念:状态、动作、智能体、策略、奖励、状态转移、轨迹、回报

文章目录1.状态&#xff08;State&#xff09;2.动作&#xff08;Action&#xff09;3.智能体&#xff08;Agent&#xff09;4.策略&#xff08;Policy&#xff09;5.奖励&#xff08;Reward&#xff09;6.状态转移&#xff08;State transition&#xff09;7.智能体与环境交互…

“margin”外边距的各种奇特现象

我们大家在初学css布局html页面结构的时候&#xff0c;肯定会经常使用到“margin”外边距这个属性&#xff0c;这个属性对我们的页面布局十分有用&#xff0c;也十分方便&#xff0c;但是这个属性在使用的时候经常会出现一些奇特的现象&#xff0c;导致我们的页面布局和想要完成…

开发一个MyBatis通用Mapper的轮子

目录 一、前言 二、需求 三、实现原理 1、基于MyBatis3提供的SqlProvider构建动态Sql 2、基于自定义注解&#xff0c;为实体和数据库表建立对应关系 四、代码实现 1、自定义注解 2、几个pojo&#xff0c;用来保存实体对应的信息 3、定义开头说的BaseMapper 4、SqlPro…

Nginx-负载均衡

负载均衡的意思是在服务器集群中&#xff0c;需要有一台服务器作为调度者&#xff0c;客户端所有的请求都有调度者接收&#xff0c;调度者再根据每台服务器的负载情况&#xff0c;将请求分配给对应的服务器去处理 配置过程 1、需要在nginx.conf配置文件中添加服务组 服务组中…

linux安装stable diffusion2.0完整教程-还不会安装sd2.0?一篇文章教会你AI绘画

以下教程出自飞链云AI技术人员&#xff0c;欢迎使用目前国内顶尖的AI绘画工具&#xff0c;微信小程序搜索&#xff1a;【飞链云版图】 注意&#xff1a;请严格按照以下步骤进行&#xff0c;可非常容易进行安装&#xff0c;其他环境不保证丝滑安装&#xff1b; 安装前准备 ub…

分析GC日志

文章目录1.GC日志格式1.1 GC分类1.2 GC日志结构剖析1.3 GC日志分析工具1.4 人生感悟1.GC日志格式 1.1 GC分类 针对HotSpot VM的实现&#xff0c;它里面的Gc按照回收区域又分为两大种类型: 一种是部分收集&#xff08;Partial GC&#xff09;&#xff0c;一种是整堆收集&#…