html圆盘钟表纯js有解释【搬代码】

news2024/11/30 0:28:59

结果如图所示:
使用的idear中的html编写
1

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>圆盘时钟</title>
</head>

<body>
<div style="display: flex; justify-content: center; align-items: center;">
<!--    此处的width、height调整圆盘在页面中的位置-->
    <canvas id="clockCanvas" width="800" height="800"></canvas>
    <p id="dl"></p>
</div>


<script>
    // 获取画布元素
    const canvas = document.getElementById('clockCanvas');
    const ctx = canvas.getContext('2d');

    // 经络运行当令时间表
    const meridianSchedule = [
        { meridian: "肺经当令", time: "3:00 - 5:00" },
        { meridian: "大肠经当令", time: "5:00 - 7:00" },
        { meridian: "胃经当令", time: "7:00 - 9:00" },
        { meridian: "脾经当令", time: "9:00 - 11:00" },
        { meridian: "心经当令", time: "11:00 - 13:00" },
        { meridian: "小肠经当令", time: "13:00 - 15:00" },
        { meridian: "膀胱经当令", time: "15:00 - 17:00" },
        { meridian: "肾经当令", time: "17:00 - 19:00" },
        { meridian: "心包经当令", time: "19:00 - 21:00" },
        { meridian: "三焦经当令", time: "21:00 - 23:00" },
        { meridian: "胆经当令", time: "23:00 - 1:00" },
        { meridian: "肝经当令", time: "1:00 - 3:00" }
    ];

    // 不断更新时钟
    setInterval(() => {
        drawClock();
    }, 1000);

    function drawClock() {
        // 清空画布
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // 绘制圆盘
        ctx.beginPath();
        ctx.arc(canvas.width / 2, canvas.height / 2, 150, 0, 2 * Math.PI);
        ctx.fillStyle = 'lightgray';
        ctx.fill();
        // 绘制数字
        ctx.font = '20px Arial';
        ctx.fillStyle = '#000';
        ctx.textAlign = 'center';
        ctx.textBaseline ='middle';
        for (var i = 1; i <= 12; i++) {
            var angle = (i - 3) * (Math.PI / 6);
            //xy中的 x = a + b * Math.cos(angle);a + 位置a调整的是数字的位置,数字越大越向右下偏移;b的位置设置数字距离中心多远
            var x = 400 + 140 * Math.cos(angle);
            var y = 400 + 140 * Math.sin(angle);
            ctx.fillText(i, x, y);
        }
        // 绘制 60 个表示分钟的刻度
        for (let j = 0; j < 60; j++) {
            let angle = j * (Math.PI / 30);
            ctx.beginPath();
            ctx.moveTo(400 + 130 * Math.cos(angle), 400 + 130 * Math.sin(angle));
            ctx.lineTo(400 + 150 * Math.cos(angle), 400 + 150 * Math.sin(angle));
            ctx.strokeStyle = '#aaa';
            ctx.stroke();
        }


        // 获取当前时间
        const now = new Date();
        const hours = now.getHours();
        const minutes = now.getMinutes();
        const seconds = now.getSeconds();

        // 绘制时针
        const hourAngle = (hours % 12 + minutes / 60) * (2 * Math.PI / 12);
        ctx.beginPath();
        ctx.moveTo(canvas.width / 2, canvas.height / 2);
        ctx.lineTo(canvas.width / 2 + 80 * Math.sin(hourAngle), canvas.height / 2 - 80 * Math.cos(hourAngle));
        ctx.strokeStyle = 'black';
        ctx.stroke();

        // 绘制分针
        const minuteAngle = (minutes + seconds / 60) * (2 * Math.PI / 60);
        ctx.beginPath();
        ctx.moveTo(canvas.width / 2, canvas.height / 2);
        ctx.lineTo(canvas.width / 2 + 120 * Math.sin(minuteAngle), canvas.height / 2 - 120 * Math.cos(minuteAngle));
        ctx.strokeStyle = 'black';
        ctx.stroke();

        // 绘制秒针
        const secondAngle = seconds * (2 * Math.PI / 60);
        ctx.beginPath();
        ctx.moveTo(canvas.width / 2, canvas.height / 2);
        ctx.lineTo(canvas.width / 2 + 140 * Math.sin(secondAngle), canvas.height / 2 - 140 * Math.cos(secondAngle));
        ctx.strokeStyle ='red';
        ctx.stroke();

        // 显示当前时间对应的经络
        const currentMeridian = meridianSchedule.find(item => {
            const [startTime, endTime] = item.time.split(' - ');
            const [startHour, startMinute] = startTime.split(':').map(Number);
            const [endHour, endMinute] = endTime.split(':').map(Number);
            return hours >= startHour && hours < endHour || (hours === startHour && minutes >= startMinute) || (hours === endHour && minutes < endMinute);
        });
        if (currentMeridian) {
            ctx.fillStyle = 'ed';
            ctx.fillText(currentMeridian.meridian, canvas.width / 2, canvas.height / 2 - 20);
        }

    }
</script>
</body>

</html>

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

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

相关文章

SpringBoot+Vue实现Excel文档导入和导出

1.准备工作 1.1.前端程序 在前端首先加上批量导出的按钮&#xff0c;如下 <el-button size"small" type"warning" plain click"exportData"> 批量导出 </el-button> 在添加了点击事件之后&#xff0c;在methods中要与之对应的添加上…

Visual Studio Code 的安装教程和配置C语言环境插件推荐

目录 1.vscode简介2.下载安装vs code3.VSCode基础配置VSCode界面简介VSCode设置中文界面VSCode个性化设置VSCode常用设置基本编辑快捷键VSCode常用快捷键 4.下载安装MinGW5.设置vscode里的环境6.插件推荐7.vscode官方文档 1.vscode简介 VSCode是微软出的一款轻量级编辑器&…

第2章 Rust初体验8/8:末尾不带分号的表达式即代码块返回值:更简洁的语法:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.9 故事7: 玩家输入的数字若越界则继续猜 贾克强:“我们终于要一起写这个游戏的最后一个故事啦!游戏中,你需要猜两个骰子的点数之和,因此你猜的数字应该在2到12之间。我们可以在代码中加入一些判断逻辑,如果你猜的数字超出了这个范围,游戏会…

足底筋膜炎怎么治疗才能彻底除根

现代快节奏的生活中&#xff0c;足底筋膜炎作为一种常见的足部疾病&#xff0c;困扰着越来越多的人。长时间的站立、行走&#xff0c;以及不正确的运动姿势&#xff0c;都可能成为足底筋膜炎的诱因。足底筋膜炎带来的疼痛和不适&#xff0c;严重影响了人们的生活质量和日常工作…

用Rust手把手编写一个Proxy(代理), 开始动工

https://shop.kongfz.com/795263/ 代理端和代理服务端之间可用自有格式来实现多路复用以减少连接的建立断开的开销,目前暂未实现代理服务端。 类结构 proxy.rs 负责代理结构的存储,监听类型,监听地址,是否有父级地址,认证账号密码等。 flag.rs 监听类型的二进制结构,…

网络安全 - DDoS 攻击原理 + 实验

DDoS 攻击 什么是 DDoS 进攻 D D o S \color{cyan}{DDoS} DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击是一种通过多个计算机系统同时向目标系统发送大量请求&#xff0c;消耗其资源&#xff0c;使其无法正常服务的攻击方式。DD…

后端高频面试题分享-用Java判断一个列表是否是另一个列表的顺序子集

问题描述 编写一个函数&#xff0c;该函数接受两个列表作为参数&#xff0c;判断第一个列表是否是第二个列表的顺序子集&#xff0c;返回True或False。 要求 判断一个列表是否是另一个列表的顺序子集&#xff0c;即第一个列表的所有元素在第二个列表需要顺序出现。列表中的元…

Linux常用命令及或g++(或gcc)编辑器运用

一. 实验内容 1&#xff0e;打开VMware Workstation虚拟机进入Ubuntu系统&#xff0c;打开终端。 练习使用常用的Linux命令&#xff0c;主要包括如下命令&#xff1a; mkdir, rmdir, cd, pwd, ls, clear, cat, rm等。&#xff08;其中&#xff0c;cat、rm命令请在下面实验内容3…

Navicat和SQLynx产品功能比较二(SQL查询)

数据库管理工具最常用的功能就是SQL的查询&#xff0c;没有之一。本文针对Navicat和SQLynx做了SQL查询相关的性能测试&#xff0c;从测试结果来看&#xff0c;Navicat主要适合开发类的小型数据量需求&#xff0c;SQLynx可以适应大型数据量或小型数据量的需求&#xff0c;用户可…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

政安晨【零基础玩转各类开源AI项目】解析开源:Stable Diffusion 3 论文及用户界面工具 StableSwarmUI

目录 关键成果 性能 结构细节 通过重新配重改善整形流量 比例整形变换模型 灵活的文本编码器 使用模型&#xff1a;StableSwarmUI 开源项目的现状&#xff1a; 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI…

重生奇迹mu魔剑士简介

出生地&#xff1a;勇者大陆 性 别&#xff1a;男 擅 长&#xff1a;近距离作战、武器特技&攻击魔法使用 转 职&#xff1a;剑圣&#xff08;3转&#xff09; 介 绍&#xff1a;当玩家账号中有一个220级以上的角色时&#xff0c;便可以创建职业为魔剑士的新角色&#x…

关于element-plus中el-select自定义标签及样式的问题

关于element-plus中el-select自定义标签及样式的问题 我这天天的都遇到各种坑&#xff0c;关于自定义&#xff0c;我直接复制粘贴代码都实现不了&#xff0c;研究了一下午&#xff0c;骂骂咧咧了一下午&#xff0c;服气了。官网代码实现不了&#xff0c;就只能 “ 曲线救国 ”…

AI大模型爆发,你还不学就晚了!抓住时代机遇,快速入门指南!

AI大模型风起云涌&#xff0c;你准备好乘风破浪了吗&#xff1f; 在一个阳光明媚的午后&#xff0c;小李坐在自己的工位上&#xff0c;眼前的代码如同繁星般繁多。他是一名资深的软件工程师&#xff0c;但在最近的技术浪潮中&#xff0c;他却感到了一丝不安。他的朋友圈里&…

SAP Build 2-PDF数据提取与决策

0. 安装desktop agent 在后续过程中发现要预先安装desktop agent&#xff0c;否则没法运行自动化流程… 0.1 agent下载 参考官方文档说明 https://help.sap.com/docs/build-process-automation/sap-build-process-automation/create-user-in-rbsc-download-repository?loca…

numpy创建维数组

一&#xff0c;numpy创建一维数组 1.1.np.array() # 创建一维数组 anp.array([1,2,3,4,5]) print(a) 1.2.np.arange() # 创建等差数组 bnp.arange(0,6,2) print(b) 1.3.np.linspace() #生成10个数&#xff0c;范围为[1,10]&#xff0c;满足等差数列 y,cnp.linspace(1,2,3,end…

电商领域利器来了!港大阿里联合提出MimicBrush,对参考图模仿进行零样本图像编辑,万物皆可编辑。

阿里和港大提出的MimicBrush可以通过对参考图模仿进行零样本图像编辑。将一张图片的某一部分融合到领一张图片上去。用在电商商品展示上或者单纯的图片编辑和内容迁移很有用。从官方演示来看效果也很好。 MimicBrush&#xff0c;它会随机选择视频剪辑中的两帧&#xff0c;遮盖其…

远程桌面端口,远程桌面改端口有哪些方法

方法一&#xff1a;通过修改注册表 步骤一&#xff1a;打开注册表编辑器 按下 Windows键R 打开“运行”对话框。输入 regedit 并按 Enter 打开注册表编辑器。 步骤二&#xff1a;定位到远程桌面服务的端口设置 导航至第一个注册表路径&#xff1a;HKEY_LOCAL_MACHINE\SYSTE…

RabbitMQ安装配置,封装工具类,发送消息及监听

1. Get-Started docker安装rabbitmq 拉取镜像 [rootheima ~]# docker pull rabbitmq:3.8-management 3.8-management: Pulling from library/rabbitmq 7b1a6ab2e44d: Pull complete 37f453d83d8f: Pull complete e64e769bc4fd: Pull complete c288a913222f: Pull complet…

VD1011 单节锂离子充电电池保护 2.8V过放保护 SOT-23小封装芯片

VD1011&#xff0c;内置高精度电压检测电路和延迟电路以及内置MOSFET&#xff0c;是用于单节锂离子/锂聚合物可再充电 电池的保护IC。 本IC适合干对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护。 VD1011具备如下特点 高精度电压检测电路 过充电检测电压 …