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

avatar
作者
猴君
阅读量:0

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);

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

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!