CSS3和jQuery動態時鍾制作過程


本文譯自Old School Clock with CSS3 and jQuery,主要講述了如何利用CSS3和jQuery制作一個漂亮的動態時鍾。

Hi,大家好,我叫Toby Pitman,Chris曾邀請我寫一篇關於最近我在論壇上發的一些實驗成果,於是當我在WebKit blogsaw an article上看一些新的CSS3動畫時,有一個rotate屬性深深地吸引了我的眼球,於是就開始着手寫這篇文章了。我當時就在思考什么東西可以在網頁上旋轉呢(貌似GIF動畫圖片可以),於是我有個點子--是的,時鍾不就是可以旋轉的嗎!開始!

CSS3 Transform:rotate

Transform:rotate是CSS3的一個新特性,它可以讓你...當然,是實現一些旋轉的玩意兒啦。Transform也可以讓你在網頁上實現縮放、傾斜、移動對象。而且上面的這些都可以通過Transition屬性實現動畫效果。

聽起來很熟悉么?是的,當然,和以前一樣,我們將依然結合jQuery來實現頁面上元素的動畫效果。因為使用jQuery可以方便的操作CSS從而 得到動畫效果。聯想一下a:hover效果,你就會對如何實現這個例子產生一些想法。它遠沒有jQuery和Mootools那么強大,但已經足夠做一些 很酷的東西了。

請注意:這個時鍾例子只能運行在Firefox 3.1+、Safari 3+和Chrome瀏覽器上。

時鍾圖片

首先,我們需要准備一些圖片來作為時鍾的圖形界面。這里我們用一張鍾盤圖片和三張指針圖片,其中運動的指針我們是用photoshop切割出來的600×30的圖片,並將其豎直放置。然后利用rotate屬性讓其繞中心點旋轉。當然,指針使用的是透明的PNG格式圖片。

HTML標記

這個時鍾的HTML標記非常簡單,只用了ul列表,每一個列表項(li)分別對應着3根運動指針,並且給其分配相應的id,代碼如下:

<ul id="clock">
        <li id="sec"></li>
        <li id="hour"></li>
        <li id="min"></li>
</ul>

CSS代碼

#clock {
        position: relative;
        width: 600px;
        height: 600px;
        margin: 20px auto 0 auto;
        background: url(clockface.jpg);
        list-style: none;
}
  
#sec, #min, #hour {
        position: absolute;
        width: 30px;
        height: 600px;
        top: 0px;
        left: 285px;
}
  
#sec {
        background: url(sechand.png);
        z-index: 3;
}
  
#min {
        background: url(minhand.png);
        z-index: 2;
}
  
#hour {
        background: url(hourhand.png);
        z-index: 1;
}

CSS代碼也是非常簡單,由於3根運動指針尺寸相同,並且是從同一個位置開始運動,所以我們為了簡化代碼就將它們的代碼寫在一起了。為了能讓時鍾內部的指 針實現絕對定位(absolutely position)我們將ul設成相對定位(relativeposition)。

好了,下面我們的jQuery就要上場了。

The jQuery JavaScript

這里Javascript主要完成以下工作:

  • 獲取當前的時間
  • 計算並添加每個元素的CSS樣式(旋轉角度)
  • 周期性地設置CSS樣式

獲取時間

你也許會將PHP中的時間和日期等同起來,剛開始的時候我的第一想法也是利用PHP,然而后來我發現javascript中也有構造日期和時間的功能函數。只是需要注意的是javascript獲取的是本地時間並不是服務器時間。

首先我將用Date()函數獲取日期信息並將其賦給一個變量,我們可以通過GetSeconds(), GetMinutes()或GetHours()獲取3根指針的信息,如下代碼:

var seconds = new Date().getSeconds();

上面的代碼會返回一個0到59的數字並將其分配給seconds變量。

獲取角度

接下來我將計算每根指針的角度。我們將每一周分成60等分,所以只要360/60就得到每一份是6,這意味着每一秒鍾或者每一分鍾指針都將前進6度的角度。我們將計算結果保存到另一個變量中去,代碼如下:

var sdegree = seconds * 6;

對於時針的情況有點不同,因為每一個周期是12等分的,所以每小時時針前進的角度是30度:360/12=30。既然這樣如果時針按這個增量運動那就簡單 了,可是卻不是這么簡單的。它要根據分針的值運動一小段距離,比如3:30的話時針會在3和4的中間,然而我們該如何來做呢,請看下面的代碼:

var hdegree = hours * 30 + (mins / 2);

基本上我們需要在hour后面加上分鍾數除以2的值,該值在0.5到29.5之間(rotate屬性支持浮點小數值)。

例如:

2.40 將得到:   2 * 30 = 60 degrees
  + 40 / 2 = 20 degrees
    --------- --- ----------
    hdegree = 80 degrees

設置樣式

下面是CSS3 rotate的CSS樣式表代碼:

#sec {
   -webkit-transform: rotate(45deg);
   -moz-transform: rotate(45deg);
}

這里我們改用jQuery來動態添加上面的樣式:

$("#sec").css({"-moz-transform" : "rotate(45deg)", "-webkit-transform" : "rotate(45deg)"});

這里我們的一個問題是如何將'sdegree'變量替換樣式表中的45deg,可以這樣做:

var srotate = "rotate(" + sdegree + "deg)";

jquery代碼就修改成如下:

$("#sec").css({"-moz-transform" : srotate, "-webkit-transform" : srotate});

將所有代碼整合起來

所有的jQuery代碼如下:

$(document).ready(function() {
  
      setInterval( function() {
      var seconds = new Date().getSeconds();
      var sdegree = seconds * 6;
      var srotate = "rotate(" + sdegree + "deg)";
  
      $("#sec").css({"-moz-transform" : srotate, "-webkit-transform" : srotate});
  
      }, 1000 );
  
      setInterval( function() {
      var hours = new Date().getHours();
      var mins = new Date().getMinutes();
      var hdegree = hours * 30 + (mins / 2);
      var hrotate = "rotate(" + hdegree + "deg)";
  
      $("#hour").css({"-moz-transform" : hrotate, "-webkit-transform" : hrotate});
  
      }, 1000 );
  
      setInterval( function() {
      var mins = new Date().getMinutes();
      var mdegree = mins * 6;
      var mrotate = "rotate(" + mdegree + "deg)";
  
      $("#min").css({"-moz-transform" : mrotate, "-webkit-transform" : mrotate});
  
      }, 1000 );
  
});

請注意這里我們用了Javascript中的setInterval函數,這個函數每秒鍾都會執行一次。一些獲取時間的變量也在這個函數中,所以每次調用都會自動更新時間值。

這樣,我們的時鍾就可以工作了。

在線實例

CSS代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM