整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          用CSS3實(shí)現(xiàn)鐘表效果

          用CSS3實(shí)現(xiàn)鐘表效果

          :最近在學(xué)習(xí)CSS3,看到了一個(gè)小案例,通過(guò)自己的學(xué)習(xí),動(dòng)手實(shí)現(xiàn)了它,現(xiàn)在把它分享出來(lái)。

          鐘表效果

          實(shí)現(xiàn)過(guò)程

          1.首先我們需要在頁(yè)面中寫(xiě)出一個(gè)靜態(tài)的鐘表效果。首先我們需要一個(gè)表盤(pán)div wrap 對(duì)其進(jìn)行簡(jiǎn)單的樣式設(shè)置,用border-radius屬性將其設(shè)置成圓形。


          <div id="wrap"></div>
           #wrap{width:200px; height:200px; border:2px solid #000; margin:100px auto;border-radius:50%; position:relative;}

          2.接下來(lái)我們用ul和li來(lái)寫(xiě)表盤(pán)中的刻度,對(duì)其進(jìn)行簡(jiǎn)單的樣式設(shè)置。其中需要注意的是,我們用 -webkit-transform-origin:center 100px;來(lái)設(shè)置我們的旋轉(zhuǎn)基點(diǎn)。然后利用 -webkit-transform: rotate(0);讓我們的li旋轉(zhuǎn)相應(yīng)的角度形成相應(yīng)的刻度。

           <ul id="list">
           <li></li> <!--刻度-->
           <li></li>
           <li></li>
           <li></li>
           <li></li>
           <li></li>
           <li></li>
           <li></li>
           </ul> #wrap ul{margin:0; padding:0; height:200px; position:relative; list-style:none;} #wrap ul li{width:2px; height:6px; background:#000; position:absolute; left:99px; top: 0;-webkit-transform-origin:center 100px;} #wrap ul li:nth-of-type(1){-webkit-transform: rotate(0);} #wrap ul li:nth-of-type(2){-webkit-transform: rotate(6deg);} #wrap ul li:nth-of-type(3){-webkit-transform: rotate(12deg);} 
           #wrap ul li:nth-of-type(4){-webkit-transform: rotate(18deg);} #wrap ul li:nth-of-type(5){-webkit-transform: rotate(24deg);} #wrap ul li:nth-of-type(6){-webkit-transform: rotate(30deg);} #wrap ul li:nth-of-type(7){-webkit-transform: rotate(36deg);} #wrap ul li:nth-of-type(8){-webkit-transform: rotate(42deg);} #wrap ul li:nth-of-type(5n+1){ height:12px;}

          3.其中我們?cè)O(shè)計(jì)到了css3的選擇器nth-of-type() ,它規(guī)定其屬于其父元素的第幾個(gè)li元素。

          當(dāng)然,我們不可能將表盤(pán)的刻度都統(tǒng)統(tǒng)去設(shè)置li的樣式去完成。我們后面需要用js去渲染它。

          在渲染之前,我們需要去寫(xiě)上我們的秒針、分針、時(shí)針。分別是div hour、min、sec,并且我們對(duì)其進(jìn)行樣式的設(shè)置。為了美化一下,我們?cè)賹?xiě)一個(gè)div icon,圓點(diǎn)。并對(duì)其進(jìn)行簡(jiǎn)單樣式設(shè)置。

           <div id="hour"></div>
           <div id="min"></div>
           <div id="sec"></div>
           <div class="icon"></div>
           #hour{width:6px; height:45px; background:#000; position:absolute; left:97px; top:55px;-webkit-transform-origin:bottom ;}
           #min{width:4px; height:65px; background:#999; position:absolute; left:98px; top:35px;-webkit-transform-origin:bottom ;}
           #sec{width:2px; height:80px; background:red; position:absolute; left:99px; top:20px;-webkit-transform-origin:bottom ;}
           .icon{width:20px; height:20px; background:#000; border-radius:50%; position:absolute; left:90px; top: 90px;}

          4.接下來(lái)我們來(lái)寫(xiě)一下讓鐘表動(dòng)起來(lái)的JavaScript,首先用js去獲取各個(gè)div。

           var oList=document.getElementById("list");//獲取到刻度
           var oCss=document.getElementById("css"); var oHour=document.getElementById("hour");//獲取時(shí)針
           var oMin=document.getElementById("min");//獲取分針
           var oSec=document.getElementById("sec");//獲取秒針
           var oLi=""; var sCss="";

          5.接下來(lái)去渲染表盤(pán)的刻度。

           for (var i=0;i<60;i++) { //一個(gè)表盤(pán)總共是60個(gè)刻度
           sCss+="#wrap ul li:nth-of-type("+(i+1)+"){-webkit-transform: rotate("+i*6+"deg);}";
           oLi+="<li></li>";
           };
           oList.innerHTML=oLi;
           oCss.innerHTML+=sCss;//表盤(pán)刻度渲染完成

          6.接下來(lái)我們?nèi)?xiě)一個(gè)鐘表表針根據(jù)時(shí)間變動(dòng)的函數(shù),先利用new Date()獲取時(shí)間,然后通過(guò)去改變表針的樣式去讓表針根據(jù)時(shí)間去轉(zhuǎn)動(dòng),秒針一秒相當(dāng)于旋轉(zhuǎn)6度,分鐘一秒相當(dāng)轉(zhuǎn)動(dòng)6度,時(shí)針轉(zhuǎn)動(dòng)1秒相當(dāng)于轉(zhuǎn)動(dòng)30度。

          function toTime(){ var oDate=new Date();//獲取當(dāng)前時(shí)間
           var iSec=oDate.getSeconds();//獲取當(dāng)前秒
           var iMin=oDate.getMinutes()+iSec/60;//獲取當(dāng)前分
           var iHour=oDate.getHours()+iMin/60;//獲取當(dāng)前時(shí)
           oSec.style.WebkitTransform="rotate("+iSec*6+"deg)";//秒針轉(zhuǎn)動(dòng)角度1秒6度 (表盤(pán)一圈360度一圈60秒所以一秒6度)
           oMin.style.WebkitTransform="rotate("+iMin*6+"deg)";//分鐘轉(zhuǎn)動(dòng)角度1分6度 (表盤(pán)一圈360度一圈60分所以一分6度)
           oHour.style.WebkitTransform="rotate("+iHour*30+"deg)";//時(shí)針轉(zhuǎn)動(dòng)角度一小時(shí)30度(表盤(pán)一圈360度一圈12小時(shí)所以一小時(shí)30度)
           };

          7.最后我們來(lái)開(kāi)一個(gè)定時(shí)器,讓函數(shù)隔一秒執(zhí)行一次。

           toTime();
           setInterval(toTime,1000);

          至此一個(gè)鐘表效果就寫(xiě)完了,下面是全部源代碼

          效果源碼

          先貼上另一位開(kāi)發(fā)者的原文地址,其實(shí)里面顯示的是2種風(fēng)格的時(shí)鐘,一種為傳統(tǒng)的掛鐘,一種為數(shù)字時(shí)鐘,我就分開(kāi)來(lái)顯示了。這里再另外改了個(gè)不同背景色的方形時(shí)鐘,對(duì)于數(shù)字時(shí)鐘也進(jìn)行了改進(jìn)。

          在最后會(huì)放出源碼,給喜歡研究的小伙伴一個(gè)參考。當(dāng)然咯,最好還是自己能實(shí)踐一下。




          此教程版本是基于原文地址基礎(chǔ)上進(jìn)行小的修改而來(lái),使用的是LESS的Mixin代碼方式,使得后期調(diào)整大小及顏色會(huì)更加方便,只需要調(diào)整不同參數(shù)即可。

          如果你對(duì)LESS以及mixin不太了解,建議先學(xué)習(xí)基礎(chǔ)知識(shí)。less編譯css的軟件,推薦使用koala。

          第一步,創(chuàng)建文件


          結(jié)構(gòu)如上圖所示,CSS里創(chuàng)建style.less就可以了(編譯引用會(huì)生成css文件),另外創(chuàng)建resource文件夾,里面可以再創(chuàng)建mixin_clock.less(不需要編譯),文件起名可以根據(jù)自己的項(xiàng)目需求。clock.html中正常引用style.css文件就可以了。

          把css目錄拖到koala軟件中,并且開(kāi)啟style.less右邊的source map,這樣在瀏覽器上,f12可以看到對(duì)應(yīng)的代碼位置,方便調(diào)整。


          style.less里的引用代碼,編譯后就可以自動(dòng)生成同名.css文件了:

          //公共文件夾根目錄
          @resource_path: '../resource';
          // 組件擴(kuò)展
          @import '@{resource_path}/mixin_clock';

          等以后resource里組件多的話,也可以單獨(dú)留一個(gè)引用的文件。接下來(lái)就可以正式開(kāi)工了。

          第二步,按原教程錄入內(nèi)容

          原來(lái)的css樣式的部分,全都放在mixin_clock.less文件中,因?yàn)槭且貌⑶乙恢痹诰幾g的,所以都能正常顯示。

          這里要提幾點(diǎn)順便的調(diào)整

          1、border-radius,如果是正圓的,則改為50%,而不是具體的數(shù)值。

          2、background: linear-gradient(top, #f9f9f9, #666),里面的top,改為180deg,因?yàn)樵诓糠謈hrome中可能會(huì)報(bào)錯(cuò),而具體的角度不會(huì)


          3、有些div用了position: absolute,就順便加上z-index值,具體數(shù)字,根據(jù)層疊的前后進(jìn)行設(shè)置

          4、將最后的數(shù)字時(shí)鐘和掛鐘拆分(如果你想和在一起的話,建議改為年月日可能更實(shí)用)

          第三步,調(diào)整為L(zhǎng)ESS的結(jié)構(gòu)寫(xiě)法

          使用less有個(gè)好處就是不需要反復(fù)寫(xiě)父級(jí)名稱,部分的修改基礎(chǔ)結(jié)構(gòu)如下:

          // 表盤(pán)
              .frame_face {
                ...
                &:before {
                  ...
               }
                &:before {
                  ...
               }
             }

          tips: 因?yàn)橐傻絼e的框架中,自己定義的名稱,建議統(tǒng)一改用下劃線,以作區(qū)分。

          這里的&,相當(dāng)于.frame_face:before{}

          第四步,提取公共部分,改為變量,并改成Mixin形式調(diào)用

          這一步比較重要,這也是LESS比寫(xiě)標(biāo)準(zhǔn)CSS最顯著的優(yōu)勢(shì),當(dāng)然現(xiàn)在CSS也可以寫(xiě)變量,但是遠(yuǎn)沒(méi)有LESS寫(xiě)的方便。

          將里面一些需要以后調(diào)整的都提取出來(lái)作為變量,我也大致羅列下調(diào)整的地方:

          1、比如鐘的大小,如果調(diào)整的話,里面的大小也都需要跟著調(diào)整,所以上面提到最好是按百分比作為相對(duì)的數(shù)值,那么調(diào)整一個(gè)地方,相對(duì)的部分也能跟著進(jìn)行調(diào)整。

          2、涉及到的顏色,比如背景色,文字顏色等。當(dāng)然咯這里涉及的地方比較多,并非所有的都需要提取出來(lái),根據(jù)自己的需求即可。

          3、倒角數(shù)值也可以取出來(lái),比如最終需要一個(gè)方形的時(shí)鐘,那就改成數(shù)值就可以了。

          4、改為Mixin版,以方便參數(shù)調(diào)用,為了便于區(qū)分,可以前綴加上mixin,格式參考:

          .mixin_basic_clock(變量名1: 參數(shù); 變量名2: 參數(shù)){
            代碼部分1: 變量名1;
            代碼部分2: 變量名2;
          }

          第5步,JS更改為jQuery形式,并且改進(jìn)

          其實(shí)這個(gè)改動(dòng)不難,并且對(duì)數(shù)字時(shí)鐘增加了年月日周。

          原來(lái)的每個(gè)公共的判斷方法提取出來(lái),因?yàn)橐话愣际秋@示2位數(shù),原來(lái)的小于2位,就自動(dòng)在前面加個(gè)“0”,改進(jìn)如下

          function checkTime (i) {
           if (i < 10) {
          i="0" + i;
           }
          return i;
           }
          hour=checkTime(hour);
          minute=checkTime(minute);
          second=checkTime(second);

          最終代碼

          clock.html

          <!DOCTYPE html>
          <html lang="zh-CN">
          <head>
            <meta http-equiv="X-UA-Compatible" content="IE=Edge">
            <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>時(shí)鐘</title>
            <link href="../css/style.css" rel="stylesheet" />
            <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
            <script src="../js/clock.js"></script>
          </head>
          <body>
            <div class="circle_clock">
              <!-- 圓形掛鐘表盤(pán) -->
              <div class="frame_face">
                <!-- 刻度 -->
                <ul class="minute_marks"></ul>
                <!-- 刻度數(shù)字 -->
                <ul class="digits">
                  <li>3</li>
                  <li>5</li>
                  <li>9</li>
                  <li>12</li>
                </ul>
                <!-- 指針 -->
                <div class="hours_hand"></div>
                <div class="minutes_hand"></div>
                <div class="seconds_hand"></div>
                <!-- 指針中心點(diǎn) -->
                <div class="clock_center"></div>
              </div>
            </div>
            <div class="squire_clock">
              <!-- 方形掛鐘表盤(pán) -->
              <div class="frame_face">
                <!-- 刻度 -->
                <ul class="minute_marks"></ul>
                <!-- 刻度數(shù)字 -->
                <ul class="digits">
                  <li>3</li>
                  <li>6</li>
                  <li>9</li>
                  <li>12</li>
                </ul>
                <!-- 指針 -->
                <div class="hours_hand"></div>
                <div class="minutes_hand"></div>
                <div class="seconds_hand"></div>
                <!-- 指針中心點(diǎn) -->
                <div class="clock_center"></div>
              </div>
            </div>
            <br>
            <br>
            <!-- 數(shù)字時(shí)鐘 -->
            <div class="digital_clock">
              <div class="digit_ymd num"></div>
              <div class="digit_hms num"></div>
            </div>
          </body>
          </html>

          mixin_clock.less

          //傳統(tǒng)掛鐘
          //@clock_wh: 鐘的寬度/高度
          //@clock_border: 鐘的邊框,50%為圓形,也可以設(shè)置成具體數(shù)值
          //@frame_bgc1: 表盤(pán)背景漸變色1
          //@frame_bgc2: 表盤(pán)背景漸變色2
          //@mm_bgc: 刻度背景色
          //@digits_c: 表盤(pán)數(shù)字文字顏色
          //@hh_bgc: 時(shí)針背景顏色
          //@mh_bgc:分針背景顏色
          //@sh_bgc:秒針背景顏色
          .mixin_basic_clock(@clock_wh: 30em; @clock_border: 50%; @frame_bgc1:#fff; @frame_bgc2:#ccc; @mm_bgc: #666; @digits_c: #555; @hh_bgc:#232425; @mh_bgc: #343536; @sh_bgc: #c00) {
              //@digits: 表盤(pán)文字中心距離
              //@digits_s: 表盤(pán)文字大小
              //@clock_center: 表盤(pán)中心大小
              @digits: @clock_wh / 4.2;
              @digits_s: @clock_wh / 20;
              @clock_center: @clock_wh / 8;
              // 表盤(pán)
              .frame_face {
                  position: relative;
                  width: @clock_wh;
                  height: @clock_wh;
                  border-radius: @clock_border;
                  background: linear-gradient(180deg, #f9f9f9, #666);
                  box-shadow: 0.5em 0.5em 4em rgba(0, 0, 0, 0.8);
                  &:before {
                      content: '';
                      width: @clock_wh * 0.98;
                      height: @clock_wh * 0.98;
                      border-radius: @clock_border;
                      position: absolute;
                      top: @clock_wh * 0.01;
                      left: @clock_wh * 0.01;
                      background: radial-gradient(
                          ellipse at center,
                          rgba(246, 248, 249, 1) 0%,
                          rgba(229, 235, 238, 1) 65%,
                          rgba(205, 212, 217, 1) 66%,
                          rgba(245, 247, 249, 1) 100%
                      );
                  }
                  &:after {
                      content: '';
                      width: @clock_wh * 0.94;
                      height: @clock_wh * 0.94;
                      border-radius: @clock_border;
                      position: absolute;
                      top: @clock_wh * 0.03;
                      left: @clock_wh * 0.03;
                      box-shadow: inset rgba(0, 0, 0, 0.2) 0.2em 0.2em 1em;
                      // border: (@clock_wh * 0.001) solid rgba(0, 0, 0, 0.2);
                      background: linear-gradient(180deg, @frame_bgc1, @frame_bgc2);
                  }
              }
              // 刻度
              .minute_marks li {
                  display: block;
                  width: 0.2em;
                  height: 0.6em;
                  background: @mm_bgc;
                  position: absolute;
                  top: 50%;
                  left: 50%;
                  margin: -0.4em 0 0 -0.1em;
                  z-index: 8;
              }
              // 刻度數(shù)字
              .digits {
                  width: @clock_wh;
                  height: @clock_wh;
                  border-radius: 50%;
                  position: absolute;
                  top: 50%;
                  left: 50%;
                  margin-top: -@clock_wh / 2;
                  margin-left: -@clock_wh / 2;
                  padding: 0;
                  z-index: 9;
                  li {
                      font-size: @digits_s;
                      display: block;
                      width: @digits_s;
                      height: @digits_s;
                      position: absolute;
                      top: 50%;
                      left: 50%;
                      line-height: @digits_s;
                      text-align: center;
                      margin: (-@digits_s / 2) 0 0 (-@digits_s / 2);
                      font-weight: bold;
                      color: darken(@digits_c, 10%);
                      &:nth-child(1) {
                          transform: translate(@digits, 0);
                      }
                      &:nth-child(2) {
                          transform: translate(0, @digits);
                      }
                      &:nth-child(3) {
                          transform: translate(-@digits, 0);
                      }
                      &:nth-child(4) {
                          transform: translate(0, -@digits);
                      }
                  }
              }
              // 時(shí)針
              .hours_hand {
                  width: 0.8em;
                  height: 7em;
                  border-radius: 0 0 0.9em 0.9em;
                  background: @hh_bgc;
                  position: absolute;
                  bottom: 50%;
                  left: 50%;
                  margin: 0 0 -0.8em -0.4em;
                  box-shadow: @hh_bgc 0 0 2px;
                  transform-origin: 0.4em 6.2em;
                  transform: rotate(-25deg);
                  z-index: 21;
                  &:before {
                      content: '';
                      background: inherit;
                      width: 1.8em;
                      height: 0.8em;
                      border-radius: 0 0 0.8em 0.8em;
                      box-shadow: @hh_bgc 0 0 1px;
                      position: absolute;
                      top: -0.7em;
                      left: -0.5em;
                  }
                  &:after {
                      content: '';
                      width: 0;
                      height: 0;
                      border: 0.9em solid @hh_bgc;
                      border-width: 0 0.9em 2.4em 0.9em;
                      border-left-color: transparent;
                      border-right-color: transparent;
                      position: absolute;
                      top: -3.1em;
                      left: -0.5em;
                  }
              }
              // 分針
              .minutes_hand {
                  width: 0.6em;
                  height: 12.5em;
                  border-radius: 0.5em;
                  background: @mh_bgc;
                  position: absolute;
                  bottom: 50%;
                  left: 50%;
                  margin: 0 0 -1.5em -0.3em;
                  box-shadow: @mh_bgc 0 0 2px;
                  transform-origin: 0.3em 11em;
                  z-index: 22;
              }
              // 秒針
              .seconds_hand {
                  width: 0.2em;
                  height: 14em;
                  border-radius: ~'0.1em 0.1em 0 0 / 10em 10em 0 0';
                  background: @sh_bgc;
                  position: absolute;
                  bottom: 50%;
                  left: 50%;
                  margin: 0 0 -2em -0.1em;
                  box-shadow: rgba(0, 0, 0, 0.8) 0 0 0.2em;
                  transform-origin: 0.1em 12em;
                  z-index: 23;
                  &:before {
                      content: '';
                      width: 0.6em;
                      height: 3em;
                      border-radius: ~'0.2em 0.2em 0.4em 0.4em / 0.2em 0.2em 2em 2em';
                      box-shadow: rgba(0, 0, 0, 0.8) 0 0 0.2em;
                      background: inherit;
                      position: absolute;
                      left: 50%;
                      bottom: -3em;
                      margin-left: -0.3em;
                  }
                  &:after {
                      content: '';
                      width: 1em;
                      height: 1em;
                      border-radius: 50%;
                      background: inherit;
                      position: absolute;
                      left: 50%;
                      bottom: 1.5em;
                      margin-left: -0.5em;
                  }
              }
              //中心點(diǎn)
              .clock_center {
                  &:before {
                      content: '';
                      width: 1.6em;
                      height: 1.6em;
                      border-radius: 50%;
                      position: absolute;
                      top: 50%;
                      left: 50%;
                      margin: -0.8em 0 0 -0.8em;
                      background: #121314;
                      z-index: 10;
                  }
                  &:after {
                      content: '';
                      width: @clock_center;
                      height: @clock_center;
                      border-radius: 50%;
                      position: absolute;
                      top: 50%;
                      left: 50%;
                      margin: (-@clock_center / 2) 0 0 (-@clock_center / 2);
                      border: 0.1em solid #c6c6c6;
                      background: radial-gradient(
                          ellipse at center,
                          rgba(200, 200, 200, 0),
                          rgba(190, 190, 190, 1) 90%,
                          rgba(130, 130, 130, 1) 100%
                      );
                      z-index: 11;
                  }
              }
          }
          
          // 數(shù)字時(shí)鐘
          //@clock_w: 時(shí)鐘寬度
          //@clock_fs1: 文字大小1
          //@clock_fs2: 文字大小2
          //@clock_bgc1: 時(shí)鐘背景色1
          //@clock_bgc2: 時(shí)鐘背景色2
          //@clock_fc: 時(shí)鐘文字顏色
          .mixin_digital_clock(@clock_w: 30em; @clock_fs1: 2em; @clock_fs2: 5em; @clock_bgc1:#0a2e38; @clock_bgc2:#000; @clock_fc: #daf6ff) {
              width: @clock_w;
              border-radius: 0.6em;
              padding: 1em;
              overflow: hidden;
              background: @clock_bgc1;
              background: radial-gradient(ellipse at center, @clock_bgc1 0%, @clock_bgc2 70%);
              .num {
                  padding: 0.1em;
                  color: @clock_fc;
                  text-align: center;
                  word-break: keep-all;
                  letter-spacing: 0.05em;
                  font-family: 'Share Tech Mono', Consolas, monaco, monospace;
                  text-shadow: ~'0 0 20px #0aafe6, 0 0 20px rgb(10 175 230 / 0%)';
              }
              .digit_ymd {
                  font-size: @clock_fs1;
              }
              .digit_hms {
                  font-size: @clock_fs2;
              }
          }

          style.less

          //公共文件夾根目錄
          @resource_path: '../resource';
          // 組件擴(kuò)展
          @import '@{resource_path}/mixin_clock';
          
          //圓形掛鐘
          .circle_clock {
              .mixin_basic_clock();
              display: inline-block;
              margin: 2em;
          }
          
          //方形掛鐘
          .squire_clock {
              .mixin_basic_clock(@clock_border: 2em; @frame_bgc1:#90bef3; @frame_bgc2:#616fad; @mm_bgc: #333;);
              display: inline-block;
              margin: 2em;
          }
          
          //數(shù)字時(shí)鐘
          .digital_clock {
              .mixin_digital_clock();
              margin: 2em;
          }

          clock.js

          window.onload=function () {
            // 生成刻度
            var markWrap=$('.minute_marks');
            for (index=0; index < 60; index++) {
              var markItem=$('<li></li>');
              markItem.css("transform", "rotate(" + index * 6 + "deg) translateY(-12.7em)");
              if (index % 5==0) {
                markItem.css({ "width": "0.3em", "height": "1em" });
              }
              markWrap.append(markItem);
            }
          
            setInterval(function () {
              var today=new Date();
              var year=today.getFullYear();
              var month=today.getMonth() + 1;
              var date=today.getDate();
              var week="星期" + "日一二三四五六".split(/(?!\b)/)[today.getDay()];
              var hour=today.getHours();
              var minute=today.getMinutes();
              var second=today.getSeconds();
              var hournum;
              // 指針轉(zhuǎn)動(dòng)
              if (hour > 12) {
                hournum=((hour - 12) + minute / 60) * 30;
              } else {
                hournum=(hour + minute / 60) * 30;
              }
              var minnum=(minute + second / 60) * 6 + second / 60;
              var sennum=second * 6;
              $('.hours_hand').css('transform', 'rotate(' + hournum + 'deg)');
              $('.minutes_hand').css('transform', 'rotate(' + minnum + 'deg)');
              $('.seconds_hand').css('transform', 'rotate(' + sennum + 'deg)');
          
              // 數(shù)字時(shí)鐘
              function checkTime (i) {
                if (i < 10) {
                  i="0" + i;
                }
                return i;
              }
              month=checkTime(month);
              date=checkTime(date);
              hour=checkTime(hour);
              minute=checkTime(minute);
              second=checkTime(second);
              $('.digit_ymd').text(year + '/' + month + '/' + date + ' ' + week);
              $('.digit_hms').text(hour + ':' + minute + ':' + second);
            }, 1000);
          }

          時(shí)鐘的樣式還可以有更豐富的方法,比如給掛鐘加個(gè)背景,8字形的數(shù)字時(shí)鐘等等,可以在原有引用mixin之后再自己加樣式覆蓋,更多創(chuàng)意等待你的發(fā)現(xiàn)

          anvas是HTMl5中的重要標(biāo)簽之一,它可以在瀏覽器中繪制圖形。canvas標(biāo)簽需要指定一個(gè)寬度和高度。

          本文將包括以下內(nèi)容:

          1. 準(zhǔn)備canvas
          2. 繪制時(shí)鐘外框
          3. 繪制刻度
          4. 繪制時(shí)針、分針和秒針
          5. 更新時(shí)鐘

          1、準(zhǔn)備canvas

          <canvas id="canvas" width="200" height="200"></canvas>  
          var canvas=document.getElementById("canvas");
          var ctx=canvas.getContext("2d");

          我們首先獲取到canvas元素,然后使用 getContext方法 獲取2D上下文,從而可以控制canvas。


          2、繪制時(shí)鐘外框

          // 繪制時(shí)鐘外框
          function drawBorder(){
              ctx.beginPath(); //開(kāi)始繪制路徑  
              ctx.arc(100, 100, 90, 0, Math.PI * 2); //繪制圓形  
              ctx.strokeStyle='black'; //設(shè)置顏色  
              ctx.lineWidth=5; //設(shè)置線條寬度  
              ctx.stroke(); //繪制路徑  
          }

          這個(gè)代碼塊中,我們使用 beginPath()方法 開(kāi)始繪制,然后使用arc()方法繪制圓形。圓心的坐標(biāo)為(100, 100),半徑為90像素。我們還使用strokeStyle屬性設(shè)置顏色,使用lineWidth屬性設(shè)置線條寬度,并最終使用stroke()方法繪制。


          3、繪制刻度

          //繪制刻度
          function drawTicks() {
            for (var i=0; i < 60; i++) {
              ctx.beginPath(); //開(kāi)始繪制路徑
              ctx.lineWidth=(i%5==0) ? 5 : 2; //設(shè)置線條寬度
              ctx.strokeStyle=(i%5==0) ? '#e2e2e2' : '#f2f2f2'; //設(shè)置顏色
              var angle=(i/60) * (2*Math.PI); //計(jì)算角度
              var x=100 + Math.cos(angle) * 80; //計(jì)算X坐標(biāo)
              var y=100 + Math.sin(angle) * 80; //計(jì)算Y坐標(biāo)
              ctx.moveTo(x, y); //移動(dòng)到刻度點(diǎn)
              ctx.lineTo(100, 100); //向圓心連線
              ctx.stroke(); //繪制路徑
            }
          }

          這個(gè)代碼塊中,我們使用for循環(huán)來(lái)繪制60個(gè)刻度。在每個(gè)迭代中,我們?cè)O(shè)置線條寬度和顏色,然后計(jì)算出刻度點(diǎn)的坐標(biāo),并使用moveTo()方法移動(dòng)到該點(diǎn)。接下來(lái),我們使用lineTo()方法將該點(diǎn)與圓心連線,并使用stroke()方法繪制路徑。


          4、繪制時(shí)針、分針和秒針

          //繪制指針
          function drawHands() {
            var now=new Date(); //獲取當(dāng)前時(shí)間
            var hour=now.getHours(); //獲取小時(shí)
            var minute=now.getMinutes(); //獲取分鐘
            var second=now.getSeconds(); //獲取秒鐘
            var hourAngle=(hour/12) * (Math.PI*2) - (Math.PI/2); //計(jì)算時(shí)針角度
            var minuteAngle=(minute/60) * (Math.PI*2) - (Math.PI/2); //計(jì)算分針角度
            var secondAngle=(second/60) * (Math.PI*2) - (Math.PI/2); //計(jì)算秒針角度
            
            //繪制時(shí)針
            ctx.beginPath(); //開(kāi)始繪制路徑
            ctx.lineWidth=8; //設(shè)置線條寬度
            ctx.strokeStyle='black'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(hourAngle) * 60, 100 + Math.sin(hourAngle) * 60); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制分針
            ctx.beginPath(); //開(kāi)始繪制路徑
            ctx.lineWidth=5; //設(shè)置線條寬度
            ctx.strokeStyle='black'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(minuteAngle) * 80, 100 + Math.sin(minuteAngle) * 80); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制秒針
            ctx.beginPath(); //開(kāi)始繪制路徑
            ctx.lineWidth=2; //設(shè)置線條寬度
            ctx.strokeStyle='red'; //設(shè)置顏色
            ctx.moveTo(100, 100); //移動(dòng)到圓心
            ctx.lineTo(100 + Math.cos(secondAngle) * 90, 100 + Math.sin(secondAngle) * 90); //繪制路徑
            ctx.stroke(); //繪制路徑
            
            //繪制圓心
            ctx.beginPath(); //開(kāi)始繪制路徑
            ctx.arc(100, 100, 5, 0, Math.PI * 2); //繪制圓形
            ctx.fillStyle='black'; //設(shè)置填充色
            ctx.fill(); //填充路徑
          }

          在這個(gè)代碼塊中,我們首先獲取當(dāng)前的時(shí)間,然后計(jì)算時(shí)針、分針和秒針的角度。我們使用beginPath()方法開(kāi)始繪制路徑,然后使用moveTo()方法移動(dòng)到圓心。使用lineTo()方法繪制指針,并使用stroke()方法繪制路徑。最后,我們使用arc()方法繪制圓心,并使用fill()方法填充路徑。


          5、更新時(shí)鐘

          setInterval(function() {
            ctx.clearRect(0, 0, canvas.width, canvas.height); //清空畫(huà)布
            drawBorder(); //繪制時(shí)鐘外框
            drawTicks(); //繪制刻度
            drawHands(); //繪制指針
          }, 1000);

          在這個(gè)代碼塊中,我們使用clearRect()方法清空畫(huà)布,讓我們可以重新繪制指針。然后,每秒鐘調(diào)用drawBorder、drawTicks、drawHands函數(shù),以重新繪制時(shí)鐘。


          希望本文能夠?qū)δ兴鶐椭兄x您的閱讀!

          人人為我,我為人人,謝謝您的瀏覽,我們一起加油吧。


          主站蜘蛛池模板: 乱子伦一区二区三区| 人妻少妇精品视频三区二区一区| 国产无人区一区二区三区 | 久久国产精品免费一区| 国产成人免费一区二区三区| 亚洲第一区二区快射影院| 精品一区二区久久| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 一区二区免费视频| 国产丝袜无码一区二区三区视频 | 亚洲香蕉久久一区二区三区四区 | 精品一区二区三区中文字幕| 97精品国产福利一区二区三区| 精品日产一区二区三区手机| 中文字幕一区视频| 亚洲香蕉久久一区二区| 精品免费国产一区二区| 性色AV一区二区三区天美传媒| 日本免费一区尤物| 日韩精品电影一区亚洲| 三上悠亚精品一区二区久久| 中文字幕无线码一区二区| 国产精品亚洲专一区二区三区| 久久婷婷色一区二区三区| 春暖花开亚洲性无区一区二区 | 波多野结衣精品一区二区三区 | 日韩精品无码视频一区二区蜜桃 | 亚洲中文字幕久久久一区| 国产婷婷一区二区三区| 亚洲日本乱码一区二区在线二产线| 国产大秀视频在线一区二区| 中文字幕一区二区日产乱码| 亚洲AV成人精品一区二区三区| 精品人妻一区二区三区四区| 污污内射在线观看一区二区少妇 | 国产AV午夜精品一区二区入口| 亚洲AV无码一区二区三区电影| 久久久久人妻一区精品| 亚洲欧美日韩中文字幕在线一区| 色国产精品一区在线观看| 一区二区高清视频在线观看|