css3製作時鐘,css3時鐘
製作時鐘之前需要瞭解幾點知識:
一、圓上點座標的計算
二、時鐘上時針、分針、秒針的換算
我們觀察一下時鐘,首先想到的是與角度有關。再有是,秒針,分針,時針之間的進位關係。
比如說h時m分s秒,時針、分針、秒針此時此刻的角度:(-90,是因為rotateZ角度旋轉規則,預設是從水平開始,逆時針為+,順時針為-)
ds = s*6-90;
dm = m*6+(s/60*6)-90;
dh = h*30+(m/60*30)-90;
三、js擷取時間
- 獲得目前時間,
var date = new Date()
,獲得目前時間,以毫秒數表示。
getFullYear()
,4位年份
getMonth()
,從0-11,分別表示1-12月
getDate()
,月份中的天數
getDay()
,從0-6,分別表示星期日-星期六
getHours()
,0-23
getMinutes()
,0-59
getSecond()
,0-59
代碼如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>時鐘效果的製作</title>
<meta charset="utf-8"/>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="jquery.js"></script>
<style type="text/css">
body {
font-family: 'Microsoft Yahei';
}
ol,ul {
margin: 0;
padding: 0;
list-style: none;
}
h1 {
margin-top: 40px;
text-align: center;
color: #333;
}
/*錶盤*/
.clock {
position: relative;
width: 200px;
height: 200px;
border-radius: 100%;
background-color: #000;
margin: 50px auto;
}
.pointer li.circle {
position: absolute;
top: 50%;
left: 50%;
transform-origin: left center; /*基點設定在最左邊中間,保證繞著圓心旋轉*/
background: #fff;
width: 10px;
height: 10px;
border-radius: 100%;
margin-top: -5px;
margin-left: -5px;
}
/*刻度*/
.line-hour li,
.line-min li {
position: absolute;
left: 50%;
top: 50%;
transform-origin: 0 0;
background-color: #fff;
}
.line-hour li {
width: 10px;
height: 2px;
}
.line-min li {
width: 5px;
height: 2px;
}
/*數字*/
.number {
position: absolute;
height: 150px;
width: 150px;
left: 50%;
top: 50%;
transform: translate(-50%, -50%); /*保證數字置中*/
font-size: 15px;
color: #fff;
}
.number li {
position: absolute;
transform: translate(-50%, -50%);
}
/*指標*/
.pointer li {
position: absolute;
top: 50%;
left: 50%;
transform-origin: left center; /*基點設定在最左邊中間,保證繞著圓心旋轉*/
background: #fff;
}
.pointer li.hour {
width: 45px;
height: 3px;
margin-top: -1px;
}
.pointer li.min {
width: 60px;
height: 2px;
margin-top: -1px;
}
.pointer li.sec {
width: 90px;
height: 1px;
margin-top: -1px;
background-color: red;
}
</style>
</head>
<body>
<h1>CSS 時鐘效果示範</h1>
<div class="clock">
<ul class="line-min"></ul>
<ul class="line-hour"></ul>
<ol class="number"></ol>
<ul class="pointer">
<li class="hour"></li>
<li class="min"></li>
<li class="sec"></li>
<li class="circle"></li>
</ul>
</div>
<script type="text/javascript">
$(document).ready(function() {
function init(){
drawLines($('.line-min'), 60, 85);
drawLines($('.line-hour'), 12, 80);
drawNumbers($('.number'));
move();
}
init();
/*
* 繪製鐘錶刻度標記
* @param wrap 刻度標記的父容器
* @param total 刻度標記的總個數
* @param translateX 刻度標記在x軸方向的位移量
*/
function drawLines(wrap,total,translateX){
var gap = 360/total;
var strHtml ='';
for (var i = 0; i < total; i++) {
strHtml += '<li style="transform:rotate('+ (i*gap) + 'deg) translate(' + translateX + 'px,-50%)"></li>';
};
wrap.html(strHtml);
}
/*
* 繪製時鐘數字
* @param wrap 數位父容器,仿照弧形功能表原理http://www.cnblogs.com/wuxiaobin/p/4644806.html
* 由於旋轉是從水平x軸開始旋轉的,所以需要-90
*/
function drawNumbers(wrap){
var radius = wrap.width() / 2;
var strHtml = '';
for(var i=1; i<=12; i++){
var myAngle = (i-3)/6 * Math.PI; //原公式 角度=>弧度 (i*30-90)*(Math.PI/180) => (i-3)/6 * Math.PI;
var myX = radius + radius*Math.cos(myAngle), // x=r+rcos(θ)
myY = radius + radius*Math.sin(myAngle); // y=r+rsin(θ)
strHtml += '<li style="left:' + myX + 'px; top:'+ myY +'px">' + i + '</li>';
}
wrap.html(strHtml);
}
/*
* 鐘錶走動,轉動秒針、分針、時針
*/
function move(){
var domHour = $(".hour"),
domMin = $(".min"),
domSec = $(".sec");
setInterval(function(){
var now = new Date(),
hour = now.getHours(),
min = now.getMinutes(),
sec = now.getSeconds();
var secAngle = sec*6 - 90, // s*6-90
minAngle = min*6 + sec*0.1 - 90, // m*6+s*0.1-90
hourAngle = hour*30 + min*0.5 - 90; // h*30+m*0.5 - 90
domSec.css('transform', 'rotate(' + secAngle + 'deg)');
domMin.css('transform', 'rotate(' + minAngle + 'deg)');
domHour.css('transform', 'rotate(' + hourAngle + 'deg)');
document.title = hour + ':' + min + ':' + sec;
},1000);
}
})
</script>
</body>
</html>
最終效果: