原生js实现倒计时功能(多种格式调用)
发布时间 - 2026-01-10 22:29:05 点击率:次话不多说,请看代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>倒计时-多种格式调用-原生js封装</title>
<link rel="shortcut icon" href="../public/image/favicon.ico" type="images/x-icon"/>
<link rel="icon" href="../public/image/favicon.png" type="images/png"/>
<link rel="stylesheet" type="text/css" href="../public/style/cssreset-min.css">
<link rel="stylesheet" type="text/css" href="../public/style/common.css">
<style type="text/css">
/*公共*/
html{
height:100%;
}
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
margin: 0;
padding: 0
}
ol, ul {
list-style: none
}
body{
position: relative;
min-height:100%;
font-size:14px;
font-family: Tahoma, Verdana,"Microsoft Yahei";
color:#333;
}
a{
text-decoration: none;
color:#333;
}
.header{
width: 960px;
padding-top: 15px;
margin: 0 auto;
line-height: 30px;
text-align: right;
}
.header a{
margin: 0 5px;
}
.main{
width:960px;
margin: 50px auto 0;
}
.code{
border:1px dashed #e2e2e2;
padding:10px 5px;
margin-bottom:25px;
}
pre {
font-family: "Microsoft Yahei",Arial,Helvetica;
white-space: pre-wrap; /*css-3*/
white-space: -moz-pre-wrap; /*Mozilla,since1999*/
white-space: -pre-wrap; /*Opera4-6*/
white-space: -o-pre-wrap; /*Opera7*/
word-wrap: break-word; /*InternetExplorer5.5+*/
}
.example{
padding-top:40px;
margin-bottom:90px;
}
.example .call{
padding:18px 5px;
background:#f0f5f8;
}
.example h2{
padding-top:20px;
margin-bottom:7px;
}
.example table {
width:100%;
table-layout:fixed;
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #cee1ee;
border-left: 0;
}
.example thead {
border-bottom: 1px solid #cee1ee;
background-color: #e3eef8;
}
.example tr {
line-height: 24px;
font-size: 13px;
}
.example tr:nth-child(2n) {
background-color: #f0f5f8;
}
.example tr th,.example tr td {
border-left: 1px solid #cee1ee;
word-break: break-all;
word-wrap: break-word;
padding:0 10px;
font-weight: normal;
}
.example tr th {
color: #555;
padding-top: 2px;
padding-bottom: 2px;
text-align: left;
}
/*公共*/
.countdown {
margin-bottom: 15px;
}
</style>
<script type="text/javascript">
/*封装代码*/
(function() {
var Countdown = function(el, opts) {
var self = this;
var defaults = {
'format': 'hh:mm:ss', //格式
'endtime': '', //结束时间
'interval': 1000, //多久倒计时一次 单位:ms
'starttime':r(el)[0].innerHTML, //开始时间
'countEach': function(time) { //每单位时间出发事件,传入一个对象,包含时间信息(month)和时间格式化输出(format)
r(el)[0].innerHTML=time['format']
},
'countEnd':function (time) {} //倒计时结束回调事件
}
opts = opts || {};
for (var w in defaults) {
if ("undefined" == typeof opts[w]) {
opts[w] = defaults[w];
}
}
this.params = opts;
this.container = r(el);
if (this.container.length > 1) {
var x = [];
return this.container.each(function() {
x.push(new Countdown(this, opts))
}), x
}
this._hander=null;
this._start=0;
this._end=0;
this.isTimestamp = isNaN(this.params.starttime)||isNaN(this.params.endtime);//是否为秒计数模式
this.init();
}
Countdown.prototype = {
//初始化
init: function() {
var self = this;
this.reset();
},
reset:function(){
var self = this;
if (this.isTimestamp) {
this._start = this.params.starttime ? this.getTimestamp(this.params.starttime) : (+new Date());
this._end = this.getTimestamp(this.params.endtime);
} else {
this._start = this.params.starttime * 1e3;
this._end = this.params.endtime * 1e3;
}
this.count();
},
count:function(){
var self = this;
this._hander = setInterval(function(){
self._start-=self.params.interval;
self.params.countEach(self.getTime(self._start));
if(self._start<=self._end){
clearInterval(self._hander);
self.params.countEnd();
}
},self.params.interval);
},
//获取时间戳
getTimestamp:function(str){
return +new Date(str)||+new Date('1970/1/1 '+str);
},
timeFormat:function(fmt,timestamp){
var date = new Date(timestamp);
var o = {
"M+" : date.getMonth()+1, //月份
"d+" : date.getDate(), //日
"h+" : date.getHours(), //小时
"m+" : date.getMinutes(), //分
"s+" : date.getSeconds(), //秒
"q+" : Math.floor((date.getMonth()+3)/3), //季度
"S" : date.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o){
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
},
getTime: function(timestamp) {
var self = this;
var date, format;
if (this.isTimestamp) {
date = new Date(timestamp);
format = self.timeFormat(self.params.format, timestamp);
} else {
date = new Date();
format = timestamp / 1e3;
}
return {
'year': date.getFullYear(),
'month': date.getMonth() + 1,
'day': date.getDate(),
'hour': date.getHours(),
'minute': date.getMinutes(),
'second': date.getSeconds(),
'quarter': Math.floor((date.getMonth() + 3) / 3),
'microsecond': date.getMilliseconds(),
'format': format
};
}
}
var r = (function() {
var e = function(e) {
var a = this,
t = 0;
for (t = 0; t < e.length; t++) {
a[t] = e[t];
}
return a.length = e.length, this
};
e.prototype = {
addClass: function(e) {
if ("undefined" == typeof e) return this;
for (var a = e.split(" "), t = 0; t < a.length; t++)
for (var r = 0; r < this.length; r++) this[r].classList.add(a[t]);
return this
},
each: function(e) {
for (var a = 0; a < this.length; a++) e.call(this[a], a, this[a]);
return this
},
html: function(e) {
if ("undefined" == typeof e) return this[0] ? this[0].innerHTML : void 0;
for (var a = 0; a < this.length; a++) this[a].innerHTML = e;
return this
},
find: function(a) {
for (var t = [], r = 0; r < this.length; r++)
for (var i = this[r].querySelectorAll(a), s = 0; s < i.length; s++) t.push(i[s]);
return new e(t)
},
append: function(a) {
var t, r;
for (t = 0; t < this.length; t++)
if ("string" == typeof a) {
var i = document.createElement("div");
for (i.innerHTML = a; i.firstChild;) this[t].appendChild(i.firstChild)
} else if (a instanceof e)
for (r = 0; r < a.length; r++) this[t].appendChild(a[r]);
else this[t].appendChild(a);
return this
},
}
var a = function(a, t) {
var r = [],
i = 0;
if (a && !t && a instanceof e) {
return a;
}
if (a) {
if ("string" == typeof a) {
var s, n, o = a.trim();
if (o.indexOf("<") >= 0 && o.indexOf(">") >= 0) {
var l = "div";
for (0 === o.indexOf("<li") && (l = "ul"), 0 === o.indexOf("<tr") && (l = "tbody"), (0 === o.indexOf("<td") || 0 === o.indexOf("<th")) && (l = "tr"), 0 === o.indexOf("<tbody") && (l = "table"), 0 === o.indexOf("<option") && (l = "select"), n = document.createElement(l), n.innerHTML = a, i = 0; i < n.childNodes.length; i++) r.push(n.childNodes[i])
} else
for (s = t || "#" !== a[0] || a.match(/[ .<>:~]/) ? (t || document).querySelectorAll(a) : [document.getElementById(a.split("#")[1])], i = 0; i < s.length; i++) s[i] && r.push(s[i])
} else if (a.nodeType || a === window || a === document) {
r.push(a);
} else if (a.length > 0 && a[0].nodeType) {
for (i = 0; i < a.length; i++) {
r.push(a[i]);
}
}
}
return new e(r)
};
return a;
}())
window.countdown = Countdown;
})()
/*封装代码*/
</script>
</head>
<body>
<div class="header">
<a href="https://github.com/huanghanzhilian/widget" target="_blank">项目地址</a>
<a href="/widget/">返回首页</a>
</div>
<div class="main">
<div class="countdown">
<p>#例子1# 12:00:00到11:50:00</p>
<p id="countdown" class="">12:00:00</p>
</div>
<script type="text/javascript">
new countdown("#countdown", {
endtime: '11:50:00'
});
</script>
<div class="code">
<p>
endtime: '11:50:00',设置结束时间/默认值为空||0,执行其他默认参数
</p>
<p>new countdown("#countdown", {
endtime: '11:50:00'
});</p>
</div>
<div class="countdown">
<p>#例子2# 60到50</p>
<p id="countdown1" class="">60</p>
</div>
<script type="text/javascript">
new countdown("#countdown1", {
endtime: '50',
countEnd: function() {
alert("结束")
}
});
</script>
<div class="code">
<p>
countEnd: 'function',设置结束倒计时后触发的函数/默认值为空,执行其他默认参数
</p>
<p>new countdown("#countdown1", {
endtime: '50',
countEnd: function() {
alert("结束")
}
});</p>
</div>
<div class="countdown">
<p>#例子3# 60到0</p>
<p id="countdown2" class=""></p>
</div>
<script type="text/javascript">
new countdown("#countdown2", {
starttime:'60'
});
</script>
<div class="code">
<p>
starttime:'60',设置开始时间/默认值为元素内容,执行其他默认参数
</p>
<p>new countdown("#countdown2", {
starttime:'60'
});</p>
</div>
<div class="countdown">
<p>#例子4# 2017/01/11,11:00:00到1970/1/1</p>
<p id="countdown3" class="">2017/01/11,11:00:00</p>
</div>
<script type="text/javascript">
new countdown("#countdown3", {
format:'yy:MM:dd:hh:mm:ss'
});
</script>
<div class="code">
<p>
format:'yy:MM:dd:hh:mm:ss',格式化输出的时间格式/默认值为'hh:mm:ss',执行其他默认参数
</p>
<p>new countdown("#countdown3", {
format:'yy:MM:dd:hh:mm:ss'
});</p>
</div>
<div class="example">
<div class="call">
<h1>调用方法:</h1>
<p>new countdown(selector,{options});</p>
</div>
<h2>options参数</h2>
<table>
<thead>
<tr>
<th width="150">参数</th>
<th width="100">默认值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>format</td>
<td>'hh:mm:ss'</td>
<td>格式化输出的时间格式,年(y)、月(M)、日(d)、小时(h)、分(m)、秒(s)、毫秒(S)、季度(q)</td>
</tr>
<tr>
<td>starttime</td>
<td>''</td>
<td>开始时间</td>
</tr>
<tr>
<td>endtime</td>
<td>''</td>
<td>结束时间</td>
</tr>
<tr>
<td>interval</td>
<td>1000</td>
<td>计数的时间间隔(单位:毫秒)</td>
</tr>
<tr>
<td>countEach(time)</td>
<td>[时间格式化输出]</td>
<td>每计时单位执行,其中time包含时间信息:year年、quarter季度、month月、day日、hour小时、minute分钟、second秒、microsecond毫秒、format格式化输出</td>
</tr>
<tr>
<td>countEnd(time)</td>
<td>[时间格式化输出]</td>
<td>计时结束后执行,其中time包含时间信息:year年、quarter季度、month月、day日、hour小时、minute分钟、second秒、microsecond毫秒、format格式化输出</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 倒计时
# 原生js倒计时
# js实现5秒倒计时重新发送短信功能
# JS实现倒计时(天数、时、分、秒)
# js制作支付倒计时页面
# JS实现表单验证功能(验证手机号是否存在
# 验证码倒计时)
# JS 倒计时实现代码(时、分
# 秒)
# 简单易用的倒计时js代码
# js几秒以后倒计时跳转示例
# 原生js实现倒计时--2018
# 原生js实现节日时间倒计时功能
# Javascript实现倒计时(防页面刷新)实例
# 默认值
# 结束时间
# 值为
# 为空
# 多说
# 首页
# 回调
# 多久
# 结束后
# align
# line
# auto
# main
# bottom
# border
# dashed
# top
# Yahei
# Microsoft
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
在线教育网站制作平台,山西立德教育官网?
Android 常见的图片加载框架详细介绍
如何快速配置高效服务器建站软件?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Laravel如何生成URL和重定向?(路由助手函数)
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
活动邀请函制作网站有哪些,活动邀请函文案?
常州企业网站制作公司,全国继续教育网怎么登录?
,在苏州找工作,上哪个网站比较好?
如何在万网ECS上快速搭建专属网站?
PHP正则匹配日期和时间(时间戳转换)的实例代码
什么是javascript作用域_全局和局部作用域有什么区别?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
网页设计与网站制作内容,怎样注册网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
微信小程序 input输入框控件详解及实例(多种示例)
🚀拖拽式CMS建站能否实现高效与个性化并存?
如何快速生成高效建站系统源代码?
Laravel如何配置任务调度?(Cron Job示例)
微信公众帐号开发教程之图文消息全攻略
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
如何用PHP快速搭建高效网站?分步指南
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
微信小程序制作网站有哪些,微信小程序需要做网站吗?
,怎么在广州志愿者网站注册?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
中山网站制作网页,中山新生登记系统登记流程?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
如何在建站宝盒中设置产品搜索功能?
js代码实现下拉菜单【推荐】
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
昵图网官方站入口 昵图网素材图库官网入口
Laravel如何保护应用免受CSRF攻击?(原理和示例)
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
javascript中闭包概念与用法深入理解
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
大连网站制作公司哪家好一点,大连买房网站哪个好?
Laravel如何使用Eloquent进行子查询
如何在云服务器上快速搭建个人网站?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何创建自定义中间件?(Middleware代码示例)
如何在阿里云高效完成企业建站全流程?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
三星、SK海力士获美批准:可向中国出口芯片制造设备

