JS+CSS案例:用CSS+JS做漂亮的拟真时钟

news2024/11/24 8:45:06

JS+CSS案例:用CSS+JS做漂亮的拟真时钟

今天给大家分享一个挺酷的CSS+js模拟的时钟。

案例效果图:

案例分析

通过CSS画一个表的外观,通过JS获取当前时间,并控制表针做对应角度的旋转。

制作时钟外观

HTML结构

首先,我们要定义一个表盘,然后再表盘里布置刻度,还有3、6、9、12四个大数字,当然,还有3个指针(时针、分针、秒针’)。表盘上就这些东西,我们写HTML结构如下:

<div id="clock"> 
    <!-- 表盘 -->
    <div class="frame-face">
        <!-- 指针 -->
        <div class="hours-hand"></div>
        <div class="minutes-hand"></div>
        <div class="seconds-hand"></div>
        <!-- 数字 -->
        <ul id="digits">
          <li>3</li>
          <li>6</li>
          <li>9</li>
          <li>12</li>
        </ul>        
        <!-- 刻度 -->
        <ul id="minute-marks"></ul>
    </div>
</div>

CSS样式表

接下来,我们就来使用CSS来完成表面的设计:

/* style 用CSS做时钟 */

*{ margin: 0; padding: 0;}

#clock{
  margin-top: 10%;
}

#clock .frame-face {
  position: relative;
  width: 30em;
  height: 30em;
  margin: 2em auto;
  border-radius: 50%;
  background: -webkit-linear-gradient(top, #fafafa, #ccc);
  background: -moz-linear-gradient(top, #fafafa, #ccc);
  background: linear-gradient(top, #fafafa, #ccc);
  box-shadow: 0.5em 0.5em 2em rgba(0, 0, 0, 0.5);  
}

#minute-marks li {
  display: block;
  width: 0.2em;
  height: 0.6em;
  background: #929394;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -0.4em 0 0 -0.1em;
}
#digits {
    width: 30em;
    height: 30em;
    border-radius: 15em;   
}
#digits li {
  font-size: 3.4em;
  display: block;
  width: 2.4em;
  height: 2.4em;
  position: absolute;
  top: 50%;
  left: 50%;
  line-height: 2.4em;
  text-align: center;
  margin: -1.2em 0 0 -1.2em;
  font-weight: bold;
}

/* 四个数字的位置控制 */ 
#digits li:nth-child(1) {
  transform: translate(3em, 0)
}
#digits li:nth-child(2) {
  transform: translate(0, 3em)
}
#digits li:nth-child(3) {
  transform: translate(-3em, 0)
}
#digits li:nth-child(4) {
  transform: translate(0, -3em)
}


#digits:before {
  content:'';
  width:1.6em;
  height:1.6em;
  border-radius:.8em;
  position:absolute;
  top:50%; left:50%;
  margin:-.8em 0 0 -.8em;
  background:#121314;
}
#digits:after {
  content:'';
  width:4em;
  height:4em;
  border-radius:2.2em;
  position:absolute;
  top:50%; left:50%;
  margin:-2.1em 0 0 -2.1em;
  border:.1em solid #c6c6c6;
  background:-webkit-radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
  background:-moz-radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
  background:radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
}

/* 时针 */
#clock .hours-hand {
    width:.8em;
    height:8em;
    border-radius:.5em;
    background:#232425;
    position:absolute;
    bottom:50%; 
    left:50%;
    margin:0 0 -.8em -.4em;
    box-shadow:#232425 0 0 2px;
    transform-origin:0.4em 7.2em;
    transform:rotate(-25deg);
}
/* 分针 */
#clock .minutes-hand {
    width:.6em;
    height:10.5em;
    border-radius:.5em;
    background:#343536;
    position:absolute;
    bottom:50%; 
    left:50%;
    margin:0 0 -0.5em -.4em;
    box-shadow:#343536 0 0 2px;
    transform-origin:0.4em 10em;
}

/* 秒针 */
#clock .seconds-hand {
  width:.2em;
  height:14em;
  border-radius:.1em .1em 0 0/10em 10em 0 0;
  background:#c00;
  position:absolute;
  bottom:50%; left:50%;
  margin:0 0 -2em -.1em;
  box-shadow:rgba(0,0,0,.8) 0 0 .2em;
  transform-origin:0.1em 12em; 
}
#clock .seconds-hand:after {
  content:'';
  width:1.4em;
  height:1.4em;
  border-radius:.7em;
  background:inherit;
  position:absolute;
  left:-.65em; bottom:1.35em;
}

现在我们来看看这个简约的时钟:

生成刻度:

css做刻度太麻烦了。。。

window.onload = function () {
  // 生成刻度
  let markWrap = document.getElementById('minute-marks')

  for (let index = 0; index < 60; index++) {
    let markItem = document.createElement('li')
    markItem.style.cssText = "transform:rotate(" + index * 6 + "deg) translateY(-12.7em)";
    if (index % 5 == 0) {
      markItem.style.width = "0.3em";
      markItem.style.height = "1em";
    }
    markWrap.appendChild(markItem)
  }
}

控制时钟的JS代码

表盘完成,接下来写个js控制表针的旋转。 把JS写在页面最下面:

setInterval(function () {
    // 获得系统当前时间
    var time = new Date(); 
    var hour = time.getHours()
    var minute = time.getMinutes();
    var second = time.getSeconds();
    var hournum;
    
    // 控制表针转动
    if (hour > 12) {
      hournum = ((hour - 12) + minute / 60) * 30;
    } else {
      hournum = (hour + minute / 60 * 100) * 30;
    }
    var minnum = (minute + second / 60) * 6 + second / 60;
    var sennum = second * 6;
    document.getElementsByClassName("hours-hand")[0].style.transform = "rotate(" + hournum + "deg)"
    document.getElementsByClassName("minutes-hand")[0].style.transform = "rotate(" + minnum + "deg)"
    document.getElementsByClassName("seconds-hand")[0].style.transform = "rotate(" + sennum + "deg)"

        // 输出数字样式时间到电子表
    if(hour<10){
        hour="0"+parseInt(hour);
    }
    if(minute<10){
        minute="0"+parseInt(minute);
    }
    if(second<10){
        second="0"+parseInt(second);
    }
  }, 1000);

郑重说明:这个代码不是我原创的。当时觉得很酷,就复制下来放存到了我的有道里,时间久远,转载的来源找不到了。本例对样式和结构做了少许调整,分享给大家,供大家学习和借鉴。非常感谢原作者!

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

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

相关文章

python实现小游戏随机猜数

1、脚本练习 import random# 初始化剩余的猜测次数 counts 3 # 生成一个1到10之间的随机整数 numb random.randint(1, 10)# 循环直到猜测次数用完 while counts > 0:tmp input("请输入小鱼手里的数字 (你还剩下 {} 次机会): ".format(counts))guess int(tmp)…

精通剪辑艺术,2024年度四大必备剪辑软件推荐!

在这个视觉为王的时代&#xff0c;视频内容的创作和编辑已经成为了一种艺术形式。无论是个人创作者还是专业团队&#xff0c;都在寻找能够提升工作效率和创作质量的工具。今天&#xff0c;就让我们一起探索几款市面上广受好评的视频剪辑工具&#xff0c;它们将帮助你将创意变为…

测试总结8/6

1.签到 判断其大小写是否与之相等 #include<bits/stdc.h> using namespace std; long long t,x,y; int ans,n,m,k0; const int N2e57; int s[N]; string sum; string num"CodeForces"; int main() {cin>>n;for(int i1; i<n; i) {cin>>sum;int …

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…

当上领导,不可不懂的3大管人法则

当上领导&#xff0c;不可不懂的3大管人法则&#xff0c;精辟&#xff01; 法则一&#xff1a;软硬都要 在团队管理中&#xff0c;只硬不软或只软不硬都无法达到理想的效果。 只有软硬兼施&#xff0c;刚柔并济&#xff0c;才能四两拨千斤&#xff0c;根据不同的情况和员工&a…

深入解析数据仓库ADS层-从理论到实践的全面指南

在大数据时代,数据仓库已经成为企业进行数据分析和决策的核心系统。而在数据仓库的分层架构中,ADS(Application Data Store)层作为最上层的数据应用层,直接面向业务应用和分析需求,其重要性不言而喻。然而,很多数据从业者对ADS层的理解还停留在表面,不清楚如何构建高效的ADS层来…

2024年全国青少信息素养大赛python编程复赛集训第十一天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

归并排序+堆,P1631 序列合并

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 序列合并 - 洛谷 二、解题报告 1、思路分析 不难想到 a[0] b[0] < a[0] b[1] < a[0] b[2] < ... < a[0] b[n - 1] a[1] b[0] < a[1] b[1] < a[1] b[2] < ... < a[1] b[n…

如何拯救LoRA初始化?LoRA-GA:性能显著提升+收敛速度更快!

文章链接&#xff1a;https://arxiv.org/pdf/2407.05000 亮点直击 提出了 LoRA-GA&#xff0c;一种新颖的 LoRA 初始化方法&#xff0c;通过近似低秩矩阵的梯度与全权重矩阵的梯度来加速收敛。确定了在非零初始化下的缩放因子&#xff0c;该因子确保适配器输出的方差不受适配器…

PCIe学习笔记(17)

延迟容忍报告(LTR)消息 LTR消息可选地用于报告有关其读/写服务延迟容忍度的设备行为。 &#xff08;通过 LTR&#xff0c;PCIe 设备可以告知系统它们能容忍的最大响应延迟是多少&#xff0c;只要系统在这个时间之内对 PCIe 设备提出的请求做出响应即可。&#xff09; LTR消息…

统信UOS微信常见问题

统信UOS微信常见问题 1. 家庭版如何激活&#xff1f; ①注册Union ID账号 ②绑定微信 ③登录Union ID激活系统 2. 应用商店微信qq下载失败&#xff0c;进行系统更新&#xff0c;提示依赖错误&#xff0c;检查更新失败怎么解决&#xff1f; 问题描述 安装应用商店内的应用无法…

【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

目录 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09;二、不可中断的睡眠状态&#xff08;D深度睡眠状态&#xff09;三、关于S浅度睡眠状态与D深度睡眠状态的理解 一、可中断的睡眠状态&#xff08;S浅度睡眠状态&#xff09; S&#xff08;sleeping&#xff09;…

利用阿里云镜像仓库创建属于自己的私有镜像仓库

阿里云官网&#xff1a;https://www.aliyun.com/ 在阿里云官网注册账号&#xff0c;然后进入控制台 选择容器镜像服务 创建命名空间 创建镜像仓库 选择命名空间&#xff0c;仓库类型&#xff08;设为私有的话&#xff0c;镜像不能随意拉取&#xff09; 点管理 按以下步骤将…

炒黑豆:营养与美味的黑色宝藏

在众多的美食中&#xff0c;炒黑豆宛如一颗低调的黑色珍珠&#xff0c;散发着独特的魅力。食家巷炒黑豆&#xff0c;看似简单&#xff0c;却蕴含着不简单的营养价值。黑豆本身富含蛋白质、维生素、矿物质等多种营养成分&#xff0c;经过炒制之后&#xff0c;其香味被进一步激发…

(javaweb)Http协议

目录 一.http概述 二.Http-请求协议 三.Http响应协议 四.Http协议解析 一.http概述 ---复制这个位置会自动前面有http 浏览器给服务器发送请求携带请求数据&#xff0c;服务器解析数据&#xff0c;服务器前提需要知道具体格式等等--约定 服务器处理完请求&#xff0c;需要给…

jpg图片怎么批量转为png?jpg图片批量转为png的几种方法

jpg图片怎么批量转为png&#xff1f;在处理大批量的jpg图片&#xff0c;并将它们转换为png格式时&#xff0c;选择合适的工具和策略至关重要。这种转换通常涉及到不同的应用场景和需求&#xff0c;例如在网页设计中需要透明背景&#xff0c;或者在打印工作中需要更高的图像质量…

AOP学习

AOP概述 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。 什么是SpringAOP? ⽽ AOP 是⼀种思想&#xff0c;⽽ Spring AOP 是⼀个框架&#xff0c;提供了⼀种对 AOP 思…

速看!2025第三届深圳国际生态环境监测产业博览会

2025第三届深圳国际生态环境监测产业博览会 展会主题&#xff1a;生态环境智慧监测创新&#xff0c;助力生态环境高水平保护 展会时间&#xff1a;2025年7月24-26日 展会地点&#xff1a;深圳会展中心&#xff08;福田&#xff09; 主办单位&#xff1a; 广东省环境监测协…

Flutter 学习之旅

本文只针对个人学习所遇问题&#xff0c;以及解决方案进行记录&#xff0c;不深刨原理。 不深刨原理是因为我也才开始学习&#xff0c;讲不明白&#xff0c;有可能还误导大家 &#xff0c;希望多多包涵。 问题一&#xff1a; 如何通过appBar去设置状态栏字体颜色以及状态栏透…

关于消息队列,共享内存相关作业

1>使用消息队列完成两个进程之间相互通信 1.c #include<myhead.h> //消息类型 struct msgbuf {long mtype; //消息类型char mtext[1024];//消息数据 }; #define SIZE sizeof(struct msgbuf)-sizeof(long) int main(int argc, const char *argv[]) {//创建一个进程pid…