JavaScript实现时钟滴答声效果
发布时间 - 2026-01-10 22:48:43 点击率:次下面一段代码给大家分享js实现时钟滴答声功能,具体代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<meta name="keywords" content="clock">
<meta name="description" content="This is a clock">
<title>Clock</title>
</head>
<body>
<audio id="ticktock">
<source = src="ticktock.mp3" type="audio/mp3">
</audio>
<script type="text/javascript">
/*
年(y)可以用 1-4 个占位符
月(M)、日(d)、时(H,24时)、时(h,12时)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符
毫秒(S)只能用 1 个占位符(是 1-3 位数字)
AM或PM只能用 1 个占位符(是 2 位英文)
上午或下午(T)只能用 1 个占位符(是 2 位中文)
星期(E)可以用 1-3 个占位符
季度(q)只能用 1 个占位符(是 1 位数字)
*/
Date.prototype.format = function(fmt) {
var map = {
"M+" : this.getMonth() + 1, //月
"d+" : this.getDate(), //日
"H+" : this.getHours(), //24时
/*
上午12时只代表当天上午的12时,下午的12时代表当天下午的12时,
0时代表第二天的开始,即前面一天12时已过0时开始计算新一天的时间,
虽然说时间上跟前面那一天下午12时重合,但日期已经发生更改,所以不能说0时就是12时
*/
"h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12,//12时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"S" : this.getMilliseconds(), //毫秒
"t" : this.getHours() < 12 ? "AM" : "PM",
"T" : this.getHours() < 12 ? "上午" : "下午",
};
var week = {
"0" : "日",
"1" : "一",
"2" : "二",
"3" : "三",
"4" : "四",
"5" : "五",
"6" : "六",
}
var quarter = {
"0" : "一",
"1" : "二",
"2" : "三",
"3" : "四",
}
if(/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
if(/(E+)/.test(fmt)) {
var weekPreStr;
switch(RegExp.$1.length) {
case 1:
weekPreStr = "";
break;
case 2:
weekPreStr = "周";
break;
default:
weekPreStr = "星期";
break;
}
fmt = fmt.replace(RegExp.$1, weekPreStr + week[this.getDay()]);
}
if(/(q)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, quarter[Math.floor(this.getMonth() / 3)]);
}
for(var key in map) {
if(new RegExp("(" + key + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? map[key] : ("00" + map[key]).substr((map[key]+"").length));
}
}
return fmt;
}
</script>
<script>
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
var ctx = canvas.getContext("2d");
var halfPI = Math.PI / 2;
var doublePI = Math.PI * 2;
//阴影级别
var shadowBlur = 10;
//阴影宽度
var shadowWidth = 8;
//阴影在X方向上的偏移
var shadowOffsetX = 5;
//阴影在Y方向上的便宜
var shadowOffsetY = 5;
//深色阴影
var shadowDarkColor = "rgba(0,0,0,0.8)";
//浅色阴影
var shadowLightColor = "rgba(0,0,0,0.1)";
//画布中心到边缘的内切圆半径
var canvasRadius = 250;
canvas.width = canvasRadius * 2;
canvas.height = canvasRadius * 2;
//获取画布中心的坐标
var cx = canvasRadius;
var cy = canvasRadius;
//时钟外圈的贝塞尔花纹个数
var bezierPatternCount = 36;
//时钟外圈的贝塞尔花纹波峰处半径
var bezierPeakRadius = canvasRadius - 10;
//时钟外圈的贝塞尔花纹一半的角度
var bezierHalfSpan = doublePI / bezierPatternCount / 2;
//时钟外圈的贝塞尔花纹底部半径
var bezierRadius = bezierPeakRadius - 20;
//时钟外圈的贝塞尔花纹颜色
var bezierPatternColor = "Plum";
//时钟外圈半径
var clockBorderRadius = bezierRadius - 10;
//时钟外圈宽度
var clockBorderWidth = 10;
//时钟外圈颜色
var clockBorderColor = "Aqua";
//时钟外圈阴影半径
var clockBorderShadowRadius = clockBorderRadius - shadowWidth + 1;
//时钟整数时间刻度线宽
var clockScaleWidth = 2;
//时钟整数时间刻度外半径
var clockScaleOuterRadius = clockBorderRadius - shadowWidth;
//时钟整数时间刻度内半径
var clockScaleInnerRadius = clockScaleOuterRadius - 20;
//时钟刻度颜色
var clockScaleColor = "Black";
//时钟非整数时间处半径
var clockScaleMiddleRadius = clockScaleOuterRadius - 10;
//时钟数字半径
var clockNumRadius = clockBorderShadowRadius - 40;
//时钟数字字体
var clockNumFont = "25px Arial";
//时钟数字颜色
var clockNumColor = "black";
//数字日期距中心的垂直距离
var digitalDateMarginCenter = 50;
//数字日期颜色
var digitalDateColor = "Black";
//数字日期字体
var digitalDateFont = "bold 18px Arial";
//数字时间距中心的垂直距离
var digitalTimeMarginCenter = 100;
//数字时间颜色
var digitalTimeColor = "white";
//数字时间背景颜色
var digitalTimeBgColor = "DarkSlateBlue";
//数字时间字体
var digitalTimeFont = "bold 25px Arial";
//数字时间高度的一半
var digitalTimeHeight = 40;
//数字时间分隔线宽度
var digitalTimeSpanLineWidth = 2;
//时钟中心点内圆的半径
var clockCenterInnerDotRadius = 7;
//时钟中心点内圆的颜色
var clockCenterInnerDotColor = "FireBrick";
//时钟中心点外圆的半径
var clockCenterOuterDotRadius = 10;
//时钟中心点外圆的颜色
var clockCenterOuterDotColor = "Maroon";
//时针线宽
var clockNeedleWidth = 5;
//时针半径
var clockHourNeedleRadius = clockBorderShadowRadius - 120;
//时针颜色
var clockHourNeedleColor = "DarkGreen";
//分针半径
var clockMinuteNeedleRadius = clockBorderShadowRadius - 80;
//分针颜色
var clockMinuteNeedleColor = "DarkSlateGray";
//秒针半径
var clockSecondNeedleRadius = clockBorderShadowRadius - 40;
//秒针尾部半径
var clockSecondNeedleBottomRadius = -20;
//秒针颜色
var clockSecondNeedleColor = "FireBrick";
//画圆环
function strokeCircle(cx, cy, r) {
ctx.beginPath();
ctx.arc(cx, cy, r, 0, doublePI);
ctx.stroke();
}
//画圆
function fillCircle(cx, cy, r) {
ctx.beginPath();
ctx.arc(cx, cy, r, 0, doublePI);
ctx.fill();
}
//绘制线条
function strokeLine(x1, y1, x2, y2) {
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
}
//根据角度和半径计算圆上相应位置的坐标(最右侧为起始角度,顺时针方向为正)
function circlePos(cx, cy, theta, radius) {
var pos = {
x: cx + radius * Math.cos(theta),
y: cy + radius * Math.sin(theta),
};
return pos;
}
//在圆环上绘制刻度线
function strokeCircleLine(cx, cy, theta, r1, r2) {
var pos1 = circlePos(cx, cy, theta, r1);
var pos2 = circlePos(cx, cy, theta, r2);
strokeLine(pos1.x, pos1.y, pos2.x, pos2.y);
}
//设置默认阴影
function setShadow(type) {
ctx.lineWidth = shadowWidth;
ctx.shadowBlur = shadowBlur;
ctx.shadowOffsetX = shadowOffsetX;
ctx.shadowOffsetY = shadowOffsetY;
if(type === 1) {
ctx.shadowColor = shadowLightColor;
} else {
ctx.shadowColor = shadowDarkColor;
}
}
//取消阴影
function clearShadow() {
ctx.shadowColor = "rgba(0,0,0,0)";
ctx.shadowBlur = 0;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
}
//绘制时钟外圈的贝塞尔花纹
function renderBezierPattern() {
ctx.fillStyle = bezierPatternColor;
ctx.beginPath();
var theta = 0;
//由于circlePos是顺时针方向正, 故圈也是顺时针方向
var beginPos = circlePos(cx, cy, theta, bezierRadius);
ctx.moveTo(beginPos.x, beginPos.y);
while(theta < doublePI) {
//贝塞尔曲线控制点
var controlTheta = theta + bezierHalfSpan;
var controlPos = circlePos(cx, cy, controlTheta, bezierPeakRadius);
//贝塞尔曲线终止点
var endTheta = controlTheta + bezierHalfSpan;
var endPos = circlePos(cx, cy, endTheta, bezierRadius);
ctx.quadraticCurveTo(controlPos.x, controlPos.y, endPos.x, endPos.y);
theta = endTheta;
}
//绘制圆counterclockwise=false, 即默认是顺时针方向
ctx.arc(cx, cy, clockBorderRadius, 0, doublePI, true);
//注意: 两个相反方向的路径内部为填充范围
ctx.fill();
}
//绘制时钟边框
function renderClockBorder() {
//画外框
ctx.strokeStyle = clockBorderColor;
ctx.lineWidth = clockBorderWidth;
strokeCircle(cx, cy, clockBorderRadius);
//画外框的内阴影
ctx.strokeStyle = shadowLightColor;
setShadow(1);
strokeCircle(cx, cy, clockBorderShadowRadius);
clearShadow();
}
//绘制时钟圆周上的数字和刻度部分
function renderClockNums() {
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.font = clockNumFont;
var span = doublePI / 60;
for(var i = 1, radian = -halfPI + span; i <= 60; i++, radian += span) {
if(i % 5 == 0) {
//绘制刻度
ctx.strokeStyle = clockScaleColor;
ctx.lineWidth = clockScaleWidth;
strokeCircleLine(cx, cy, radian, clockScaleInnerRadius, clockScaleOuterRadius);
//绘制数字
var pos = circlePos(cx, cy, radian, clockNumRadius);
var num = i / 5;
ctx.fillStyle = clockNumColor;
ctx.fillText(num, pos.x, pos.y);
} else {
ctx.strokeStyle = clockScaleColor;
ctx.lineWidth = clockScaleWidth;
strokeCircleLine(cx, cy, radian, clockScaleMiddleRadius, clockScaleOuterRadius);
}
}
}
//绘制数字时钟
function renderDigital(date) {
//绘制日期
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.font = digitalDateFont;
ctx.fillStyle = digitalDateColor;
var text = date.format("yyyy年MM月dd日 EEE");
ctx.fillText(text, cx, cy + digitalDateMarginCenter);
//绘制时间
ctx.font = digitalTimeFont;
text = date.format(" HH mm ss ");
ctx.fillStyle = digitalTimeBgColor;
var textWidth = ctx.measureText(text).width;
var textBgX = cx - textWidth / 2;
var textBgY = cy + digitalTimeMarginCenter - digitalTimeHeight / 2;
ctx.fillRect(textBgX, textBgY, textWidth, digitalTimeHeight);
ctx.fillStyle = digitalTimeColor;
ctx.fillText(text, cx, cy + digitalTimeMarginCenter);
//绘制事件中间的分隔线
ctx.lineWidth = digitalTimeSpanLineWidth;
ctx.strokeStyle = digitalTimeColor;
var textSpan = textWidth / 6;
var leftLineX = cx - textSpan;
strokeLine(leftLineX, textBgY, leftLineX, textBgY + digitalTimeHeight);
var rightLineX = cx + textSpan;
strokeLine(rightLineX, textBgY, rightLineX, textBgY + digitalTimeHeight);
}
//绘制时钟中心最下方红点
function renderClockCenterOuterDot() {
ctx.fillStyle = clockCenterOuterDotColor;
fillCircle(cx, cy, clockCenterOuterDotRadius);
}
//绘制时钟中心最上方红点
function renderClockCenterInnerDot() {
ctx.fillStyle = clockCenterInnerDotColor;
fillCircle(cx, cy, clockCenterInnerDotRadius);
}
//绘制时钟指针
function renderClockNeedle(date) {
var hourRadian = date.getHours() % 12 / 12 * doublePI - halfPI;
var minuteRadian = date.getMinutes() / 60 * doublePI - halfPI;
var secondRadian = date.getSeconds() / 60 * doublePI - halfPI;
setShadow();
ctx.lineCap = "round";
ctx.lineWidth = clockNeedleWidth;
ctx.strokeStyle = clockHourNeedleColor;
strokeCircleLine(cx, cy, hourRadian, 0, clockHourNeedleRadius);
ctx.strokeStyle = clockMinuteNeedleColor;
strokeCircleLine(cx, cy, minuteRadian, 0, clockMinuteNeedleRadius);
ctx.strokeStyle = clockSecondNeedleColor;
strokeCircleLine(cx, cy, secondRadian, clockSecondNeedleBottomRadius, clockSecondNeedleRadius);
ctx.lineCap = "square";
clearShadow();
}
function render(date) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
renderBezierPattern();
renderClockBorder();
renderClockNums();
renderDigital(date);
renderClockCenterOuterDot();
renderClockNeedle(date);
renderClockCenterInnerDot();
}
var lastTime = 0;
var audio = document.getElementById("ticktock");
function loop() {
var date = new Date();
var currentTime = date.getTime();
if(currentTime - lastTime >= 1000) {
lastTime = currentTime;
//注意:这里设0非常关键,否则虽然会循环播放,但会从上一次暂停的地方开始播放,造成延迟
audio.currentTime = 0;
audio.play();
render(date);
}
requestAnimationFrame(loop);
}
loop();
</script>
</body>
</html>
JavaScript Date 知识浅析
以上所述是小编给大家介绍的JavaScript实现时钟滴答声效果,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# js
# 时钟滴答声
# Javascript中数组去重与拍平的方法示例
# 理解javascript中的Function.prototype.bind的方法
# JavaScript数组复制详解
# Javascript基础回顾之(三) js面向对象
# Javascript基础回顾之(一) 类型
# JavaScript基础之AJAX简单的小demo
# JavaScript Date 知识浅析
# Javascript中 带名 匿名 箭头函数的重要区别(推荐)
# javascript判断回文数详解及实现代码
# 浅谈javascript中的 “ && ” 和 “ || ”
# Javascript中的 “&” 和 “|” 详解
# 外圈
# 塞尔
# 中心点
# 只能用
# 可以用
# 下午
# 上午
# 顺时针方向
# 给大家
# 小编
# 当天
# 分隔线
# 第二天
# 滴答声
# 只代表
# 英文
# 时就
# 所示
# 所述
# 给我留言
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
IOS倒计时设置UIButton标题title的抖动问题
Laravel如何使用Vite进行前端资源打包?(配置示例)
JavaScript如何实现路由_前端路由原理是什么
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何正确下载安装西数主机建站助手?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何创建自定义Facades?(详细步骤)
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在阿里云服务器自主搭建网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何续费美橙建站之星域名及服务?
Laravel Fortify是什么,和Jetstream有什么关系
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Laravel怎么在Blade中安全地输出原始HTML内容
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
html如何与html链接_实现多个HTML页面互相链接【互相】
怎么用AI帮你设计一套个性化的手机App图标?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
长沙企业网站制作哪家好,长沙水业集团官方网站?
iOS发送验证码倒计时应用
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么清理缓存_Laravel optimize clear命令详解
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
想要更高端的建设网站,这些原则一定要坚持!
javascript读取文本节点方法小结
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
Python结构化数据采集_字段抽取解析【教程】
电商网站制作价格怎么算,网上拍卖流程以及规则?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
zabbix利用python脚本发送报警邮件的方法
如何快速搭建虚拟主机网站?新手必看指南
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Internet Explorer官网直接进入 IE浏览器在线体验版网址
北京企业网站设计制作公司,北京铁路集团官方网站?
如何用好域名打造高点击率的自主建站?
如何快速生成凡客建站的专业级图册?
Linux网络带宽限制_tc配置实践解析【教程】
如何快速上传建站程序避免常见错误?
WordPress 子目录安装中正确处理脚本路径的完整指南
如何在云主机上快速搭建网站?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
如何正确选择百度移动适配建站域名?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解

