时钟制作效果:
首先你要知道时钟的运行规律(虽然大部分人都知道),然后给三个针制作符合自身运动规律的动
画,这里需要用到定时器,但是如果只需要像定时器一样可刷新,用infinit也行。其次是针的摆放需要应用到
transform-origin这一属性
transform-origin: x-axis y-axis z-axis;
值 | 描述 |
---|---|
x-axis | 定义视图被置于 X 轴的何处。可能的值:
|
y-axis | 定义视图被置于 Y 轴的何处。可能的值:
|
z-axis | 定义视图被置于 Z 轴的何处。可能的值:
|
上面是w3school中transform-origin的详解
布局部分:
<body>
<div class="clock-wrap">
<div class="clock">
<ul id="list">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<div class="num" id="num">
<ul>
<li>12</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
</ul>
</div>
<div class="hour" id="hour" style="transform: rotate(12deg);"></div>
<div class="min" id="min" style="transform: rotate(18deg);"></div>
<div class="sec" id="sec" style="transform: rotate(150deg);"></div>
<div class="circle"></div>
</div>
样式部分:
<style>
.hour,.min,.sec{
background: #fff;
position: absolute;
left: 50%;
top: 50%;
transform-origin: bottom;
box-shadow: 0 0 6px rgb(0 0 0 /50%);
}
body{
font: 1px "微软雅黑";
color: #666;
background-color: #333;
display: block;
}
body, ul{
margin: 0;
padding: 0;
}
*{
margin: 0;
padding:0;
}
.clock-wrap{
width: 400px;
height: 400px;
border: 10px solid #fff;
border-radius: 50%;
margin: 80px auto 0;
position: relative;
box-shadow:0 0 40px rgba(0, 0, 0) ;
}
.clock ul{
width: 400px;
height: 400px;
position: relative;
border-radius: 50%;
background: radial-gradient(circle at center,rgb(14, 14, 51),#000000);
box-shadow: 0 0 50px rgba(0, 0, 0 /50%) inset;
}
.clock li:nth-child(5n+1){
height: 18px;
}
.clock ul li{
position: absolute;
left: 50%;
margin-left: -2px;
top: 0;
width: 4px;
height: 10px;
background: rgba(255, 255, 255,50%);
transform-origin: center 200px;
}
li{
list-style: none;
}
li{
display: list-item;
text-align:-webkit-match-parent;
}
ul{
list-style-type: disc;
}
.num{
position: absolute;
width: 360px;
height: 360px;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
.num li{
position: absolute;
left: 50%;
margin-left: -10px;
top: 0;
color: rgba(255, 255, 255, 50%);
font: 2em Arial, Helvetica, sans-serif;
transform-origin: center 180px;
}
.hour{
width: 14px;
height: 100px;
margin-left: -7px;
margin-top: -100px;
border-radius: 3px;
}
.min{
width: 10px;
height: 150px;
margin-left: -5px;
margin-top: -150px;
border-radius: 2px;
}
.sec{
width: 4px;
height: 180px;
margin-left: -2px;
margin-top: -180px;
border-radius: 1px;
}
.circle{
width: 40px;
height: 40px;
border-radius: 50%;
background: #fff;
position: absolute;
left: 50%;
margin-left: -20px;
top: 50%;
margin-top: -20px;
box-shadow: 0 0 20px rgba(0, 0, 0 /40%);
}
.clock li:nth-child(1){transform: rotate(0deg);}
.clock li:nth-child(2){transform: rotate(6deg);}
.clock li:nth-child(3){transform: rotate(12deg);}
.clock li:nth-child(4){transform: rotate(18deg);}
.clock li:nth-child(5){transform: rotate(24deg);}
.clock li:nth-child(6){transform: rotate(30deg);}
.clock li:nth-child(7){transform: rotate(36deg);}
.clock li:nth-child(8){transform: rotate(42deg);}
.clock li:nth-child(9){transform: rotate(48deg);}
.clock li:nth-child(10){transform: rotate(54deg);}
.clock li:nth-child(11){transform: rotate(60deg);}
.clock li:nth-child(12){transform: rotate(66deg);}
.clock li:nth-child(13){transform: rotate(72deg);}
.clock li:nth-child(14){transform: rotate(78deg);}
.clock li:nth-child(15){transform: rotate(84deg);}
.clock li:nth-child(16){transform: rotate(90deg);}
.clock li:nth-child(17){transform: rotate(96deg);}
.clock li:nth-child(18){transform: rotate(102deg);}
.clock li:nth-child(19){transform: rotate(108deg);}
.clock li:nth-child(20){transform: rotate(114deg);}
.clock li:nth-child(21){transform: rotate(120deg);}
.clock li:nth-child(22){transform: rotate(126deg);}
.clock li:nth-child(23){transform: rotate(132deg);}
.clock li:nth-child(24){transform: rotate(138deg);}
.clock li:nth-child(25){transform: rotate(144deg);}
.clock li:nth-child(26){transform: rotate(150deg);}
.clock li:nth-child(27){transform: rotate(156deg);}
.clock li:nth-child(28){transform: rotate(162deg);}
.clock li:nth-child(29){transform: rotate(168deg);}
.clock li:nth-child(30){transform: rotate(174deg);}
.clock li:nth-child(31){transform: rotate(180deg);}
.clock li:nth-child(32){transform: rotate(186deg);}
.clock li:nth-child(33){transform: rotate(192deg);}
.clock li:nth-child(34){transform: rotate(198deg);}
.clock li:nth-child(35){transform: rotate(204deg);}
.clock li:nth-child(36){transform: rotate(210deg);}
.clock li:nth-child(37){transform: rotate(216deg);}
.clock li:nth-child(38){transform: rotate(222deg);}
.clock li:nth-child(39){transform: rotate(228deg);}
.clock li:nth-child(40){transform: rotate(234deg);}
.clock li:nth-child(41){transform: rotate(240deg);}
.clock li:nth-child(42){transform: rotate(246deg);}
.clock li:nth-child(43){transform: rotate(252deg);}
.clock li:nth-child(44){transform: rotate(258deg);}
.clock li:nth-child(45){transform: rotate(264deg);}
.clock li:nth-child(46){transform: rotate(270deg);}
.clock li:nth-child(47){transform: rotate(276deg);}
.clock li:nth-child(48){transform: rotate(282deg);}
.clock li:nth-child(49){transform: rotate(288deg);}
.clock li:nth-child(50){transform: rotate(294deg);}
.clock li:nth-child(51){transform: rotate(300deg);}
.clock li:nth-child(52){transform: rotate(306deg);}
.clock li:nth-child(53){transform: rotate(312deg);}
.clock li:nth-child(54){transform: rotate(318deg);}
.clock li:nth-child(55){transform: rotate(324deg);}
.clock li:nth-child(56){transform: rotate(330deg);}
.clock li:nth-child(57){transform: rotate(336deg);}
.clock li:nth-child(58){transform: rotate(342deg);}
.clock li:nth-child(59){transform: rotate(348deg);}
.clock li:nth-child(60){transform: rotate(354deg);}
.num li:nth-child(1){transform: rotate(0deg);}
.num li:nth-child(2){transform: rotate(30deg);}
.num li:nth-child(3){transform: rotate(60deg);}
.num li:nth-child(4){transform: rotate(90deg);}
.num li:nth-child(5){transform: rotate(120deg);}
.num li:nth-child(6){transform: rotate(150deg);}
.num li:nth-child(7){transform: rotate(180deg);}
.num li:nth-child(8){transform: rotate(210deg);}
.num li:nth-child(9){transform: rotate(240deg);}
.num li:nth-child(10){transform: rotate(270deg);}
.num li:nth-child(11){transform: rotate(300deg);}
.num li:nth-child(12){transform: rotate(330deg);}
</style>
脚本部分:
<script>
window.onload=function(){
var oList=document.getElementById("list");
var oCSS=document.getElementById("css"); //style标签也可以加id属性。
var aNums=document.getElementById("num").getElementsByTagName("li");
var oHour=document.getElementById("hour");
var oMin=document.getElementById("min");
var oSec=document.getElementById("sec");
var aLi="";
var sCSS="";
for(var i=0;i<60;i++){ //循环60次,产生刻度值和每一个刻度旋转的度数。
aLi+="<li></li>";
sCSS+="#clock li:nth-child("+(i+1)+"){transform:rotate("+i*6+"deg);}"
}
for(var i=0;i<12;i++){
sCSS+="#num li:nth-child("+(i+1)+"){transform:rotate("+i*30+"deg);}"
}
oList.innerHTML=aLi;
oCSS.innerHTML+=sCSS; //css需要追加到原来的css文档中。
myTime(); //初始化函数。
setInterval(myTime,1000); //设置定时器,每隔1秒执行一次函数。
function myTime(){
var oDate=new Date();
var iSec=oDate.getSeconds();
//精确到秒数的分钟数。
var iMin=oDate.getMinutes()+iSec/60;
//精确到分秒的小时数。可以在旋转的时候更精确。
var iHour=oDate.getHours()+iMin/60;
oSec.style.transform="rotate("+iSec*6+"deg)" ;
oMin.style.transform="rotate("+iMin*6+"deg)";
oHour.style.transform="rotate("+iHour*30+"deg)"; //时针的指向需要把分钟和秒数算进去才精确。
}
}
</script>