ToB企服应用市场:ToB评测及商务社交产业平台

标题: JS+CSS案例:用CSS+JS做美丽的拟真时钟 [打印本页]

作者: 卖不甜枣    时间: 2024-8-7 08:00
标题: JS+CSS案例:用CSS+JS做美丽的拟真时钟
JS+CSS案例:用CSS+JS做美丽的拟真时钟

今天给各人分享一个挺酷的CSS+js模拟的时钟。
案例结果图:


案例分析

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

HTML结构

起首,我们要界说一个表盘,然后再表盘里部署刻度,还有3、6、9、12四个大数字,当然,还有3个指针(时针、分针、秒针’)。表盘上就这些东西,我们写HTML结构如下:
  1. <div id="clock">
  2.     <!-- 表盘 -->
  3.     <div class="frame-face">
  4.         <!-- 指针 -->
  5.         <div class="hours-hand"></div>
  6.         <div class="minutes-hand"></div>
  7.         <div class="seconds-hand"></div>
  8.         <!-- 数字 -->
  9.         <ul id="digits">
  10.           <li>3</li>
  11.           <li>6</li>
  12.           <li>9</li>
  13.           <li>12</li>
  14.         </ul>        
  15.         <!-- 刻度 -->
  16.         <ul id="minute-marks"></ul>
  17.     </div>
  18. </div>
复制代码
CSS样式表

接下来,我们就来使用CSS来完成表面的设计:
  1. /* style 用CSS做时钟 */
  2. *{ margin: 0; padding: 0;}
  3. #clock{
  4.   margin-top: 10%;
  5. }
  6. #clock .frame-face {
  7.   position: relative;
  8.   width: 30em;
  9.   height: 30em;
  10.   margin: 2em auto;
  11.   border-radius: 50%;
  12.   background: -webkit-linear-gradient(top, #fafafa, #ccc);
  13.   background: -moz-linear-gradient(top, #fafafa, #ccc);
  14.   background: linear-gradient(top, #fafafa, #ccc);
  15.   box-shadow: 0.5em 0.5em 2em rgba(0, 0, 0, 0.5);  
  16. }
  17. #minute-marks li {
  18.   display: block;
  19.   width: 0.2em;
  20.   height: 0.6em;
  21.   background: #929394;
  22.   position: absolute;
  23.   top: 50%;
  24.   left: 50%;
  25.   margin: -0.4em 0 0 -0.1em;
  26. }
  27. #digits {
  28.     width: 30em;
  29.     height: 30em;
  30.     border-radius: 15em;   
  31. }
  32. #digits li {
  33.   font-size: 3.4em;
  34.   display: block;
  35.   width: 2.4em;
  36.   height: 2.4em;
  37.   position: absolute;
  38.   top: 50%;
  39.   left: 50%;
  40.   line-height: 2.4em;
  41.   text-align: center;
  42.   margin: -1.2em 0 0 -1.2em;
  43.   font-weight: bold;
  44. }
  45. /* 四个数字的位置控制 */
  46. #digits li:nth-child(1) {
  47.   transform: translate(3em, 0)
  48. }
  49. #digits li:nth-child(2) {
  50.   transform: translate(0, 3em)
  51. }
  52. #digits li:nth-child(3) {
  53.   transform: translate(-3em, 0)
  54. }
  55. #digits li:nth-child(4) {
  56.   transform: translate(0, -3em)
  57. }
  58. #digits:before {
  59.   content:'';
  60.   width:1.6em;
  61.   height:1.6em;
  62.   border-radius:.8em;
  63.   position:absolute;
  64.   top:50%; left:50%;
  65.   margin:-.8em 0 0 -.8em;
  66.   background:#121314;
  67. }
  68. #digits:after {
  69.   content:'';
  70.   width:4em;
  71.   height:4em;
  72.   border-radius:2.2em;
  73.   position:absolute;
  74.   top:50%; left:50%;
  75.   margin:-2.1em 0 0 -2.1em;
  76.   border:.1em solid #c6c6c6;
  77.   background:-webkit-radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
  78.   background:-moz-radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
  79.   background:radial-gradient(ellipse at center, rgba(200,200,200,0), rgba(190,190,190,1) 90%, rgba(130,130,130,1) 100%);
  80. }
  81. /* 时针 */
  82. #clock .hours-hand {
  83.     width:.8em;
  84.     height:8em;
  85.     border-radius:.5em;
  86.     background:#232425;
  87.     position:absolute;
  88.     bottom:50%;
  89.     left:50%;
  90.     margin:0 0 -.8em -.4em;
  91.     box-shadow:#232425 0 0 2px;
  92.     transform-origin:0.4em 7.2em;
  93.     transform:rotate(-25deg);
  94. }
  95. /* 分针 */
  96. #clock .minutes-hand {
  97.     width:.6em;
  98.     height:10.5em;
  99.     border-radius:.5em;
  100.     background:#343536;
  101.     position:absolute;
  102.     bottom:50%;
  103.     left:50%;
  104.     margin:0 0 -0.5em -.4em;
  105.     box-shadow:#343536 0 0 2px;
  106.     transform-origin:0.4em 10em;
  107. }
  108. /* 秒针 */
  109. #clock .seconds-hand {
  110.   width:.2em;
  111.   height:14em;
  112.   border-radius:.1em .1em 0 0/10em 10em 0 0;
  113.   background:#c00;
  114.   position:absolute;
  115.   bottom:50%; left:50%;
  116.   margin:0 0 -2em -.1em;
  117.   box-shadow:rgba(0,0,0,.8) 0 0 .2em;
  118.   transform-origin:0.1em 12em;
  119. }
  120. #clock .seconds-hand:after {
  121.   content:'';
  122.   width:1.4em;
  123.   height:1.4em;
  124.   border-radius:.7em;
  125.   background:inherit;
  126.   position:absolute;
  127.   left:-.65em; bottom:1.35em;
  128. }
复制代码
现在我们来看看这个简约的时钟:

生成刻度:

css做刻度太麻烦了。。。
  1. window.onload = function () {
  2.   // 生成刻度
  3.   let markWrap = document.getElementById('minute-marks')
  4.   for (let index = 0; index < 60; index++) {
  5.     let markItem = document.createElement('li')
  6.     markItem.style.cssText = "transform:rotate(" + index * 6 + "deg) translateY(-12.7em)";
  7.     if (index % 5 == 0) {
  8.       markItem.style.width = "0.3em";
  9.       markItem.style.height = "1em";
  10.     }
  11.     markWrap.appendChild(markItem)
  12.   }
  13. }
复制代码
控制时钟的JS代码

表盘完成,接下来写个js控制表针的旋转。 把JS写在页面最下面:
  1. setInterval(function () {
  2.     // 获得系统当前时间
  3.     var time = new Date();
  4.     var hour = time.getHours()
  5.     var minute = time.getMinutes();
  6.     var second = time.getSeconds();
  7.     var hournum;
  8.    
  9.     // 控制表针转动
  10.     if (hour > 12) {
  11.       hournum = ((hour - 12) + minute / 60) * 30;
  12.     } else {
  13.       hournum = (hour + minute / 60 * 100) * 30;
  14.     }
  15.     var minnum = (minute + second / 60) * 6 + second / 60;
  16.     var sennum = second * 6;
  17.     document.getElementsByClassName("hours-hand")[0].style.transform = "rotate(" + hournum + "deg)"
  18.     document.getElementsByClassName("minutes-hand")[0].style.transform = "rotate(" + minnum + "deg)"
  19.     document.getElementsByClassName("seconds-hand")[0].style.transform = "rotate(" + sennum + "deg)"
  20.         // 输出数字样式时间到电子表
  21.     if(hour<10){
  22.         hour="0"+parseInt(hour);
  23.     }
  24.     if(minute<10){
  25.         minute="0"+parseInt(minute);
  26.     }
  27.     if(second<10){
  28.         second="0"+parseInt(second);
  29.     }
  30.   }, 1000);
复制代码
郑重说明:这个代码不是我原创的。当时以为很酷,就复制下来放存到了我的有道里,时间久远,转载的泉源找不到了。本例对样式和结构做了少许调整,分享给各人,供各人学习和借鉴。非常感谢原作者!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4