使用原生js仿寫win10時鐘
阿新 • • 發佈:2017-11-04
undefine 效果 d+ cloc 控制 pan roman type ext
學習web前端已經一月了,突然就像做一點什麽,於是就仿寫了一個win10時鐘(農歷計算準確度太差,於是就忽略不寫了~~)
一、HTML布局
1 <div class="wrap"> 2 <div class="time-present"> 3 <div class="time-local"> 4 <span id="hours">13</span><span>:</span><span id="minutes">11</span><span>:</span><span id="seconds">19</span> 5</div> 6 <div class="time-dty"> 7 <span id="years">2017</span><span>年</span><span id="months">10</span><span>月</span><span id="days">29</span><span>日</span><span>,</span> 8<span>星期</span><span id="wenks">日</span> 9 </div> 10 </div> 11 <div class="displaybox"> 12 <div class="times-bar mclear"> 13 <div id="oym"> 14 <span id="years-b">2017</span><span>年</span><span id="months-b">10</span><span>月</span> 15</div> 16 <div id="oy"> 17 <span id="year-b">2017</span><span>年</span> 18 </div> 19 <div id="oyy"> 20 <span id="year-bgn">2010</span><span>-</span><span id="year-end">2019</span> 21 </div> 22 <input type="image" src="img/up.png" id="up"></input> 23 <input type="image" src="img/down.png" id="down"></input> 24 </div> 25 <div class="daylists"> 26 <div class="weeklist mclear"> 27 <ul> 28 <li>一</li>*7 29 </ul> 30 </div> 31 <div class="daylist"> 32 <ul class="mclear"> 33 <li>26號</li>*42 34 </ul> 35 </div> 36 </div> 37 <div class="monthlist"> 38 <ul class="mclear"> 39 <li>1月</li>*16 40 </ul> 41 </div> 42 <div class="yearlist"> 43 <ul class="mclear"> 44 <li>2009</li>*16 45 </ul> 46 </div> 47 </div> 48 </div>
二、CSS樣式
1 body{margin:0px;} 2 ul{margin:0px;padding:0px;} 3 li{list-style:none;} 4 .mclear:after{content:"";clear:both;display:block;} 5 .wrap{height:620px;width:450px;background-color:#10446c;margin:20px auto;} 6 .time-present{border-bottom:1px solid #3e6f97;} 7 .time-local{margin-top:26px;font:40px/60px "times new roman";color:#f0ffff;text-indent:30px;} 8 .time-dty{font:20px/40px "微軟雅黑";color:#4091d3;margin-bottom:18px;text-indent:30px;} 9 .times-bar{margin-top:8px;font:18px/48px "微軟雅黑";text-indent:30px;color:#dfdfdf;position:relative;} 10 #up{ position:absolute; top:18px; right:100px; } 11 #down{ position:absolute; top:18px; right:40px; } 12 #oym,#oy,#oyy{float:left;} 13 #oym{display:block;} 14 #oy,#oyy{display:none;} 15 .daylists{display:block;} 16 .daylist{width:450px;height:300px;overflow:hidden;} 17 .daylist ul{position:relative;} 18 .weeklist ul,.daylist ul{ margin-left:20px;} 19 .weeklist ul li,.daylist ul li{ float:left; width:52px; height:44px; border:3px solid #10446c; text-align:center; } 20 .weeklist ul li{ font:13px/44px "微軟雅黑"; color:#ffffff; } 21 .daylist ul li{ font:13px/44px "微軟雅黑"; color:#708fa7;} 22 .monthlist,.yearlist{display:none;width:450px;height:350px;overflow:hidden;} 23 .monthlist ul,.yearlist ul{position:relative;} 24 .monthlist ul,.yearlist ul{ margin-left:16px; } 25 .monthlist ul li,.yearlist ul li{ float:left; width:97px; height:82px; border:3px solid #10446c; font:13px/82px "微軟雅黑"; text-align:center; color:#708fa7; } 26 .daylist ul li:hover,.monthlist ul li:hover,.yearlist ul li:hover{ border:3px solid #708fa7; } 27 .active{ color:#ffffff !important; } 28 .chsed{ border:3px solid #4097dc !important;}
三、js原生代碼
首先對頁面進行初始化,對日歷、月歷、年歷切換進行控制,以及回到當前時間進行控制~!~
1 //頁面初始化 2 clock(); 3 oYearb.innerHTML=oYrs.innerHTML; 4 oMonb.innerHTML=oMon.innerHTML; 5 oSwitch(0); 6 getDaysList(oYrs.innerHTML,oMon.innerHTML,oDay.innerHTML,oYearb.innerHTML,oMonb.innerHTML); 7 setInterval(clock,1000); 8 //展示區功能擴展 9 oDty[0].onclick=function(){//回到當前時間 10 oSwitch(0); 11 scaleShow(oDisp[0],300); 12 oMonb.innerHTML=oMon.innerHTML; 13 oYearb.innerHTML=oYrs.innerHTML; 14 getDaysList(oYrs.innerHTML,oMon.innerHTML,oDay.innerHTML,oYrs.innerHTML,oMon.innerHTML); 15 } 16 17 oym.onclick=function(){//切換至月歷 18 oSwitch(1); 19 scaleShow(oMonthList[0],300); 20 getList(oYrs.innerHTML,oMon.innerHTML,oys.innerHTML) 21 } 22 oy.onclick=function(){//切換至年歷 23 oSwitch(2); 24 scaleShow(oYearList[0],300); 25 var oNum1=Math.floor((Number(oys.innerHTML)-oYearBgn)/10); 26 oybgn.innerHTML=oYearBgn+oNum1*10; 27 oyend.innerHTML=oYearBgn+oNum1*10+9; 28 getList(oYrs.innerHTML,oMon.innerHTML,oybgn.innerHTML,oyend.innerHTML) 29 } 30 for (var i=0;i<oMonthLists.length;i++){//年歷切換月歷、月歷切換日歷控制 31 oMonthLists[i].onclick=function(){ 32 oSwitch(0); 33 scaleShow(oDisp[0],300); 34 oYearb.innerHTML=oys.innerHTML; 35 oMonb.innerHTML=parseInt(this.innerHTML); 36 getDaysList(oYrs.innerHTML,oMon.innerHTML,oDay.innerHTML,oys.innerHTML,parseInt(this.innerHTML)); 37 } 38 oYearLists[i].onclick=function(){ 39 oSwitch(1); 40 scaleShow(oMonthList[0],300); 41 oys.innerHTML=this.innerHTML; 42 getList(oYrs.innerHTML,oMon.innerHTML,this.innerHTML) 43 } 44 } 45 function clock(){//獲取當前時間程序 46 var oDate=new Date(); 47 var oYears=oDate.getFullYear();//從 Date對象以四位數字返回年份。 48 var oMonth=oDate.getMonth();//從 Date對象返回月份 (0 ~ 11)。 49 var oDays=oDate.getDate();//從 Date對象返回一個月中的某一天 (1 ~ 31)。 50 var oHours=oDate.getHours();//返回 Date對象的小時 (0 ~ 23)。 51 var oMins=oDate.getMinutes();//返回 Date對象的分鐘 (0 ~ 59)。 52 var oSecs=oDate.getSeconds();//返回 Date對象的秒數 (0 ~ 59)。 53 if (oMins<10){oMins=‘0‘+oMins;} 54 if (oSecs<10){oSecs=‘0‘+oSecs;} 55 if (oHours<10){oHours=‘0‘+oHours;} 56 oMonth++; 57 58 //設置當前時間/日期顯示 59 oHrs.innerHTML=oHours; 60 oMin.innerHTML=oMins; 61 oSec.innerHTML=oSecs; 62 oYrs.innerHTML=oYears; 63 oMon.innerHTML=oMonth; 64 65 oWenks.innerHTML=weekday(oYears,oMonth,oDays); 66 if (Number(oDay.innerHTML)!=oDays){ 67 oDay.innerHTML=oDays; 68 oYearb.innerHTML=oYears; 69 oMonb.innerHTML=oMonth; 70 getDaysList(oYrs.innerHTML,oMon.innerHTML,oDay.innerHTML,oYearb.innerHTML,oMonb.innerHTML); 71 } 72 }
然後,對日歷、農歷、年歷動態顯示進行控制,對上下翻頁這只時運用了遞歸的思路~
1 function getDaysList(y,m,d,yb,mb){ 2 //日期顯示 3 oBtnUp.onclick=null; 4 oBtnDown.onclick=null; 5 y=Number(y); 6 m=Number(m); 7 d=Number(d); 8 yb=Number(yb); 9 mb=Number(mb); 10 var aWeekday=[‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘,‘日‘]; 11 var oWeek=weekday(yb,mb,1); 12 var oNow=getDaysInMonth(yb,mb) 13 var oNum=0; 14 var otemp=0; 15 var otemps=0; 16 var oUps=0; 17 var oDowns=0; 18 mb==1?(otemp=12,otemps=yb-1):(otemp=mb-1,otemps=yb); 19 oUps=getDaysInMonth(otemps,otemp); 20 for (var j=0;j<aWeekday.length;j++){ 21 if (aWeekday[j]==oWeek){ 22 oNum=j; 23 break; 24 } 25 } 26 for (var k=0;k<oDayLists.length;k++){ 27 oDayLists[k].style.backgroundColor=‘‘; 28 oDayLists[k].classList.remove(‘active‘,‘chsed‘); 29 if(k<oNum){ 30 oDayLists[k].innerHTML=oUps-oNum+k+1; 31 oDayLists[k].classList.remove(‘active‘); 32 }else if(k>oNow+oNum-1){ 33 oDayLists[k].innerHTML=k-oNow-oNum+1; 34 oDayLists[k].classList.remove(‘active‘); 35 }else{ 36 oDayLists[k].innerHTML=k-oNum+1 37 oDayLists[k].classList.add(‘active‘); 38 } 39 } 40 for (var i=0;i<oDayLists.length;i++){ 41 oDayLists[i].index=i; 42 oDayLists[i].onclick=function(){ 43 oDowns<oNum||oDowns>oNow+oNum-1?(oDayLists[oDowns].classList.remove(‘active‘),oDayLists[oDowns].classList.remove(‘chsed‘)):oDayLists[oDowns].classList.remove(‘chsed‘); 44 this.classList.add(‘active‘,‘chsed‘); 45 oDowns=this.index; 46 } 47 if(i>=oNum&&i<=oNow+oNum-1&&Number(oDayLists[i].innerHTML)==d&&m==mb&&y==yb){ 48 oDayLists[i].style.backgroundColor=‘#0177d9‘; 49 oDayLists[i].classList.add(‘active‘,‘chsed‘); 50 oDowns=i; 51 }else if(i>oNow+oNum-1&&Number(oDayLists[i].innerHTML)==d&&Number(m)==Number(mb)+1&&y==yb){ 52 oDayLists[i].style.backgroundColor=‘#0177d9‘; 53 oDayLists[i].classList.add(‘active‘,‘chsed‘); 54 oDowns=i; 55 }else if(i<oNum&&Number(oDayLists[i].innerHTML)==d&&m==mb-1&&y==yb){ 56 oDayLists[i].style.backgroundColor=‘#0177d9‘; 57 oDayLists[i].classList.add(‘active‘,‘chsed‘); 58 oDowns=i; 59 } 60 } 61 oBtnUp.onclick=function(){ 62 mb==1?(mb=12,yb-=1):mb--; 63 oYearb.innerHTML=yb; 64 oMonb.innerHTML=mb; 65 getDaysList(y,m,d,yb,mb); 66 upDownShow(oDayUl,300,1); 67 68 } 69 oBtnDown.onclick=function(){ 70 mb==12?(mb=1,yb+=1):mb++; 71 oYearb.innerHTML=yb; 72 oMonb.innerHTML=mb; 73 getDaysList(y,m,d,yb,mb); 74 upDownShow(oDayUl,300,-1); 75 } 76 } 77 function getList(y,m,yb,mb){ 78 //月歷、年歷顯示 79 oBtnUp.onclick=null; 80 oBtnDown.onclick=null; 81 if(typeof(mb)==‘undefined‘){ 82 m=Number(m); 83 for (var i=0;i<oMonthLists.length;i++){ 84 oMonthLists[i].style.backgroundColor=‘‘; 85 oMonthLists[i].classList.remove(‘active‘); 86 } 87 for (var i=0;i<oMonthLists.length;i++){ 88 if(i<12){ 89 oMonthLists[i].innerHTML=i+1+‘月‘; 90 oMonthLists[i].classList.add(‘active‘); 91 if(y==yb&&i+1==m){oMonthLists[i].style.backgroundColor=‘#0177d9‘;} 92 }else{ 93 oMonthLists[i].innerHTML=i-12+1+‘月‘; 94 } 95 } 96 oBtnUp.onclick=function(){ 97 if(--yb<oYearBgn){yb=oYearBgn;} 98 oys.innerHTML=yb; 99 getList(y,m,yb); 100 upDownShow(oMonthUl,300,1); 101 } 102 oBtnDown.onclick=function(){ 103 ++yb; 104 oys.innerHTML=yb; 105 getList(y,m,yb); 106 upDownShow(oMonthUl,300,-1); 107 } 108 109 }else{ 110 y=Number(y); 111 yb=Number(yb); 112 mb=Number(mb); 113 var oIndexs=(yb-oYearBgn)%16; 114 oIndexs<=6?oIndexs=oIndexs:oIndexs%=4; 115 for (var i=0;i<oYearLists.length;i++){ 116 oYearLists[i].style.backgroundColor=‘‘; 117 oYearLists[i].classList.remove(‘active‘); 118 } 119 for (var i=0;i<oYearLists.length;i++){ 120 oYearLists[i].innerHTML=yb-oIndexs+i; 121 if(i>=oIndexs&&i<=oIndexs+9){ 122 oYearLists[i].classList.add(‘active‘); 123 if(y==yb-oIndexs+i){oYearLists[i].style.backgroundColor=‘#0177d9‘;} 124 } 125 } 126 oBtnUp.onclick=function(){ 127 yb-=10; 128 if(yb<oYearBgn){yb=oYearBgn;} 129 oybgn.innerHTML=yb; 130 oyend.innerHTML=yb+9; 131 getList(y,m,yb,yb+9); 132 upDownShow(oYearUl,300,1); 133 134 } 135 oBtnDown.onclick=function(){ 136 yb+=10; 137 oybgn.innerHTML=yb; 138 oyend.innerHTML=yb+9; 139 getList(y,m,yb,yb+9); 140 upDownShow(oYearUl,300,-1); 141 } 142 } 143 }
最後是動畫控制的小程序及其它小程序
1 function weekday(y,m,d){ 2 //本計算原理為蔡勒公式,僅適用於 1582 年以後 3 //W=[C/4]-2C+Y+[Y/4]+[13*(M+1)/5]+D-1 4 //W:星期,C:世紀減 1,Y:年後兩位,M:月{M=m(當m>2);M=m+12(m<3)},D:日,[]代表向下取整 5 //w:星期; w對7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 6 y=Number(y,10); 7 m=Number(m,10); 8 d=Number(d,10); 9 if (m<3){m+=12;y-=1;} 10 var aWeekday=[‘日‘,‘一‘,‘二‘,‘三‘,‘四‘,‘五‘,‘六‘] 11 var oC=Math.floor(y/100);//世紀 12 var oY=y%100;//年後兩位 13 var w=Math.floor(oC/4)-2*oC+oY+Math.floor(oY/4)+Math.floor(13*(m+1)/5)+d-1; 14 return aWeekday[(w%7+7)%7]; 15 } 16 function getDaysInMonth(y,m){ 17 //獲取當月天數 18 //y年份,m月份 19 m=parseInt(m); 20 var temp=new Date(y,m,0); 21 return temp.getDate(); 22 } 23 function scaleShow(elem,speed) { 24 //日歷、年歷、年歷切換動畫 25 elem.style.transition=‘0ms‘; 26 elem.style.transform=‘scale(0.5)‘; 27 setTimeout(function () { 28 elem.style.transition=speed+‘ms‘; 29 elem.style.transform=‘scale(1)‘; 30 },0); 31 } 32 function upDownShow(elem,speed,num){ 33 //上下切換動畫 34 var oHeight=getComputedStyle(elem).height; 35 oHeight=oHeight.substring(0,oHeight.length-2); 36 elem.style.transition=‘0ms‘; 37 if (num==1){ 38 elem.style.top=‘-‘+oHeight+‘px‘; 39 }else{ 40 elem.style.top=oHeight+‘px‘; 41 } 42 setTimeout(function(){ 43 elem.style.transition=speed+‘ms‘; 44 elem.style.top=‘0px‘; 45 },0); 46 }
學習了一個月,很多編程習慣還沒養成,存在諸多瑕疵~~不過從一個編程小白能寫出這樣的效果,暫時還是滿足了,以後繼續加油了!
使用原生js仿寫win10時鐘