Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 自拍偷在线精品自拍偷无码专区,国产人成77777视频网站,九九国产精品视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          javascript入門系列之二《定時器使用之動態數碼時鐘》

          avascript入門系列之二《定時器的使用—動態數碼時鐘》

          題外話:畢竟只是用文字來表達自己的思想,所以有些意思可能表述的不到位,歡迎大家來信交流,郵箱:82287538@qq.com。


          今天的主題主要是利用定時器來做幾個常用的小效果,因為代碼編輯起來太麻煩,主要講思路和重要代碼部分。用到的部分函數大家可以去http://www.w3school.com.cn/學習具體內容。

          一、動態數碼時鐘設計思路

          動態數碼時鐘效果圖

          先從最簡單的說起,暫時不用圖片顯示時間,先用文字直接在頁面上顯示時間。

          (1)獲取當前的系統時間。用到的是Date對象,這是專門為時間而設計的。

          function timer() //創建一個timer函數,方便以后操作

          {

          var oDate = new Date(); //創建一個時間對象

          var hours = oDate1.getHours(); //取得當前的小時數

          var minutes = oDate1.getMinutes(); //取得當前的分鐘數

          var seconds = oDate1.getSeconds(); //取得當前的秒數

          }

          可以先用alert()函數測試下每個變量的輸出結果(一定自己試下哦)

          (2)解決第一步時間輸出的問題。我們希望時間顯示為11:03:38,即小時、分鐘、秒都顯示為兩位數的格式。為此,我們設計一個函數用于將顯示一位的變成兩位顯示出來。新建一個函數toDou()

          function toDou(n){

          if(n < 10){

          return "0" + n;

          }else{

          return "" + n;

          }

          }

          這樣,就可以將我們獲取到的時間丟到函數內,返回一個兩位數的字符串。

          (3)將時間字符串顯示到頁面上。這里需要用到innerHTML函數(具體效果自己查哦)

          oDiv = document.getElementById("div1");

          oDiv.innerHTML = "現在的時間是:" + toDou(hours) + ":" + toDou(minutes) + ":" + toDou(seconds);

          這時候就會把時間顯示到頁面的div標簽中了。

          (4)設置定時器。因為是每隔一秒執行一次,所以選擇setInterval()。

          setInterval(timer, 1000);

          (5)不知道大家發現問題了沒有,當刷新頁面的時候,會有一秒鐘的空白(這個在用圖片顯示時間的例子中可能表現的更明顯),這是為什么呢?很簡單,我們設置的是一秒后才開始執行timer()。

          解決辦法:在最后加上一個timer(); 相當于網頁一加載就先運行一下timer(),然后每隔一秒再運行timer()。

          問題解決,到此為止,一個動態時間顯示的效果就出來了。

          二、帶圖片的動態時鐘設計思路

          (1)先在頁面上添加時鐘圖片(暫且不考慮樣式好不好看,主要談原理)

          <img src="./images/0.jpg" alt="">

          <img src="./images/0.jpg" alt="">

          :

          <img src="./images/0.jpg" alt="">

          <img src="./images/0.jpg" alt="">

          :

          <img src="./images/0.jpg" alt="">

          <img src="./images/0.jpg" alt="">

          (2)獲取當前的時間,生成一個表示時間的字符串,如“122222”,表示12:22:22

          //獲取當前的時間

          var oDate = new Date();

          var hours = oDate.getHours();

          var minutes = oDate.getMinutes();

          var seconds = oDate.getSeconds();

          // 生成一個表示時間的數字字符串,如“122222”,表示12:22:22

          var str = toDou(hours) + toDou(minutes) + toDou(seconds);

          (3)修改每張圖片的src屬性

          var aImg = document.getElementsByTagName("img");

          var len = aImg.length;

          for(var i=0; i<len; i++){

          aImg[i].src = "images/" + str.charAt(i) +".jpg";

          }

          這里使用了str.charAt(i)而不是str[i],沒有理由,僅為兼容。

          到這里為止,接下來該怎么做,大家動手試一下吧。完整代碼歡迎大家到我的百度云盤https://pan.baidu.com/s/1o85Bnlw下載。

          么是Canvas

          <canvas> 是HTML中的一個元素,它可被用來通過 JavaScript(Canvas API 或 WebGL API)繪制圖形及圖形動畫。

          Canvas API 提供了一個通過 JavaScriptHTML<canvas> 元素來繪制圖形的方式。它可以用于動畫、游戲畫面、數據可視化、圖片編輯以及實時視頻處理等方面。

          <canvas>標簽本身沒有繪圖能力,它僅僅是圖形的容器。在HTML,一般通過Javascript語言來完成實際的操作。

          創建HTML頁面并添加繪圖容器

          本文通過Javascript操作Canvas制作一個簡單的顯示當前時間的動畫時鐘,了解和學習簡單的canvas用法,僅以拋磚引玉。

          首先創建一個HTML文件,為了方便管理,使用一個div標簽包裹兩個canvas標簽,并加上一些簡單的css樣式。

          <!doctype html>
          <html lang="zh-cn">
          <head><title>Canvas繪制動畫時鐘</title>
          <style>
          html,body{margin:0;padding:0}
          #clockWrap {
          	position: relative;
          }
          canvas {
          	position: absolute;
          }
          #clock-ui {
          	z-index: 2;
          }
          #clock-plate {
          	z-index: 1;
          }
          </style>
          </head>
          <body>
            <div id="clockWrap">
            <canvas id="clock-plate"></canvas>
            <canvas id="clock-ui"></canvas>
          </div>
          <script></script>
          </body></html>

          本示例中使用了兩個canvas標簽(為什么使用兩個,一個不是更簡單嗎?),一個用于繪制鐘面,一個根據當前時間實時顯示和更新時針、分針和秒針的動態指向。好了,話不多說,開干。

          繪制鐘面刻度

          一個簡單的時鐘,可以分為鐘面上的刻度和指針。其中刻度和12個數字是固定的,我們可以將它們繪制在當作背景的canvas上(示例中id為clock-plate的canvas)。

          (1)要使用canvas,首先必須通過容器獲取渲染上下文:

          var $=function(id){return document.querySelector(id);}//這個函數只是為了方便獲取dom元素
          const canvasbg=$("#clock-plate"),
                canvas=$("#clock-ui"),
                ctx = canvasbg.getContext("2d"),//背景容器上下文
                ctxUI = canvas.getContext("2d");//指針容器上下文,后面代碼要用
          //定義畫布寬度和高度,時鐘圓直徑,并設置畫布大小
          const oW=1000,oH=800,cW=400,r=cW/2,oX=oW/2,oY=oH/2;
          canvas.width=oW;
          canvas.height=oH;
          canvasbg.width=oW;
          canvasbg.height=oH;

          (2)畫鐘的邊框,為了好看,這里畫兩個圈:

           //畫出時鐘外圓框
            ctx.lineWidth = 12;
          	ctx.beginPath();
          	ctx.arc(oX, oY, r+14, 0, 2 * Math.PI);
          	ctx.stroke();
          	ctx.closePath();
          	ctx.lineWidth = 8;
          	//畫出時鐘內圓框(刻度圈)
          	ctx.beginPath();
          	ctx.arc(oX, oY, r, 0, 2 * Math.PI);
          	ctx.stroke();
          	ctx.closePath();
          	ctx.beginPath();

          邊框效果圖

          (3)繪制刻度線和數字,可以利用三角函數計算出每個刻度的坐標:

          利用三角函數計算刻度線的坐標位置

          鐘面上有12個大格,從正上方12開始,它們的度數分別是270,300,330,0,30,60,90,120,150,180,210,240。然后利用JS的Math.sin和Math.cos分別計算出各大格的坐標。注意:js中Math.sin()和Math.cos()的參數不是角度數弧度??梢允褂肕ath.PI/180*角度來轉化,比如將30度轉換成弧度=Math.PI/180*30

          //繪制鐘表中心點
          	ctx.beginPath();
          	ctx.arc(oX, oY, 8, 0, 2 * Math.PI);//圓心
          	ctx.fill();
          	ctx.closePath();
          	//設置刻度線粗細度
          	ctx.lineWidth = 3;
          	//設置鐘面12個數字的字體、大小和對齊方式
          	ctx.font = "30px serif";
          	ctx.textAlign="center";
          	ctx.textBaseline="middle";
          	var kdx,kdy;
          	//繪制12個大刻度和12個數字
          	//為方便計算,先定義了0-11這12個刻度對應的度數,也可以直接定義對應的弧度。
          	const hd=Math.PI/180,degr=[270,300,330,0,30,60,90,120,150,180,210,240];
          	for(var i=0;i<12;i++){
          		kdx=oX+Math.cos(hd*degr[i])*(r-3);
          		kdy=oY+Math.sin(hd*degr[i])*(r-3);
          		ctx.beginPath();
          		ctx.arc(kdx, kdy, 6, 0, 2 * Math.PI);//畫圓形大刻度
          		ctx.fill();
              //繪制刻度對應的數字
          		ctx.strokeText(i==0? 12 : i,oX+Math.cos(hd*degr[i])*(r-24),oY+Math.sin(hd*degr[i])*(r-24));
          		ctx.closePath();
          	}
          	
          	//繪制小刻度
          	ctx.lineWidth = 2;
          	for(var i=0;i<60;i++){
          		if(i % 5 == 0) continue;//跳過與刻度重疊的刻度
          		x0=Math.cos(hd*i*6);
          		y0=Math.sin(hd*i*6);
          		ctx.beginPath();
          		ctx.moveTo(oX+x0*(r-10), oY+y0*(r-10)); 
          		ctx.lineTo(oX+x0*r, oY+y0*r); //畫短刻度線
          		ctx.stroke(); 
          		ctx.closePath();
          	}

          效果如圖:

          鐘面效果圖

          (4)根據當前時間繪制指針

          習慣上,時針粗短,分針略粗而長,秒針細長。為加大區別,示例中秒針細長并且繪制成紅色。

          function drawHp(i){//繪制時針
          	const x0=Math.cos(hd*i*30),y0=Math.sin(hd*i*30);
          	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
          }
          function drawMp(i){//繪制分針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
          }
          function drawSp(i){//繪制秒針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
          }
          //抽取出繪制三種指針時共同的部分,注意指針繪制在渲染上下文ctxUI中
          function drawPointer(ox,oy,tx,ty,width,color){
          	ctxUI.strokeStyle = color;
          	ctxUI.lineCap = "round";
          	ctxUI.lineWidth = width;
          	ctxUI.beginPath();
          	ctxUI.moveTo(ox, oy);
          	ctxUI.lineTo(tx,ty);
          	ctxUI.stroke();
          	ctxUI.closePath();
          }

          現在已經有了繪制三種指針的方法,參數是當前時間的時、分和秒,將根據它們的值確定指針的坐標。不過,因為使用的是默認的convas坐標體系,0值實際指向3的位置,需要小小的修正一下。

          window.requestAnimationFrame(function fn(){
          		var d = new Date();
          		ctxUI.clearRect(0,0,oW,oH);
          		//度數從0開始,而0在3刻度(15分/秒位置),修正為全值減15,如果小于0則修正回來
              var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;
          		hour=hour>11? hour-15 : hour-3;
          		drawHp(hour>=0? hour : 12+hour);
          		drawMp(minute>=0? minute : 60+minute);
          		drawSp(second>=0? second : 60+second);
          		window.requestAnimationFrame(fn);
          });

          接下來,調用window.requestAnimationFrame,在其中繪制并更新指標的位置??纯葱Ч绾危?/p>

          指針繪制情況與實際時間相符

          貌似效果有了,截圖時電腦上的時間是10時17分,指針繪制上,時針指向10時,分針指向17。嗯,感覺有點別扭?對了,時針和分針怎么是端端正正地指向它們的整時整分刻度上呢?實際鐘表上時針和分針是展示動態進度的,此時時針應該越過10時的位置才對。沒關系,我們在繪制時針和分針時別點東西,讓它的角度值加上分針和秒針的值試試。

          //修改后的繪制三種指針的方法
          function drawHp(i,f,m){//繪制時針,參數:時,分,秒
          	const x0=Math.cos(hd*(i+(f/60)+(m/600))*30),y0=Math.sin(hd*(i+(f/60)+(m/600))*30);
          	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
          }
          function drawMp(i,f){//繪制分針,參數,分,秒
          	const x0=Math.cos(hd*(i+(f/60))*6),y0=Math.sin(hd*(i+(f/60))*6);
          	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
          }
          function drawSp(i){//繪制秒針
          	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
          	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
          }

          再來看看效果,嗯,立竿見影呀:

          指針指向更合理了

          到此為止,canvas繪制一個簡易時鐘就完成了。下面繼續優化一下。剛才使用requestAnimationFrame方法即時更新繪制情況。這個方法與刷新率有關,看看mdn上面怎么說的:

          window.requestAnimationFrame() 方法會告訴瀏覽器你希望執行一個動畫。它要求瀏覽器在下一次重繪之前,調用用戶提供的回調函數。

          對回調函數的調用頻率通常與顯示器的刷新率相匹配。雖然 75hz、120hz 和 144hz 也被廣泛使用,但是最常見的刷新率還是 60hz(每秒 60 個周期/幀)。為了提高性能和電池壽命,大多數瀏覽器都會暫停在后臺選項卡或者隱藏的 <iframe> 中運行的 requestAnimationFrame()。

          本示例中,更新指針的位置并不需要很高的刷新頻率,可以通過節流進行一下優化:

          var fps = 5, fpsInterval = 1000 / fps,lastTime = new Date().getTime(); //記錄上次執行的時間
          function runStep() {
              requestAnimationFrame(runStep);
              var d=new Date(),now = d.getTime()
              var elapsed = now - lastTime;
              if (elapsed > fpsInterval) {
          				ctxUI.clearRect(0,0,oW,oH);
                  lastTime = now - (elapsed % fpsInterval); 
          			//度數從0開始,而0在3刻度(15分/秒位置),修正為全值-15,如果小于0則用60減回
                  var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;//console.log(d.getSeconds(),second);
                  hour=hour>11? hour-15 : hour-3;
                  drawHp(hour>=0? hour : 12+hour,minute+15,second+15);
                  drawMp(minute>=0? minute : 60+minute,second+15);
                  drawSp(second>=0? second : 60+second);
              }
          }
          runStep();

          當然,實現時鐘的方法是很多,比如可以使用畫布的旋轉(rotate方法)來實現指針的動態轉動等等。

          完整HTML+JS源碼:

          擊查看時鐘特效

          極簡主義,程序員javascript打造極簡時鐘特效


          對于javascript特效的學習,重要的是邏輯思路,所以這個時鐘特效不是很華麗,但是功能都展現出來了,而學習javascript并不是單純的扣代碼,很多人都覺得,摳完代碼,能看懂了,就算是學會了,但是,說的難聽點這樣的學習方式其實是自斷前程的學習方法,若是一門月薪過萬的技術有那么簡單學習,那么怎么還會有那么多人找不到工作呢?學習javascript特效最重要的是仔細研究一個特效的思路方法,然后根據這個特效可以擴展最初其他類似功能或者更復雜的特效,才算徹底的掌握好了這方面的知識!我的頭條號里面也有許多華麗的特效以及HTML5/javascript游戲,有興趣的朋友可以去看看!文末附上本次javascript時鐘的源碼!

          如果想要更多的企業求職加分項目,案例,學習方法可以來一下我的前端群570946165,每天都會精挑細選一個特效,項目出來詳細講解,分享!包括答疑解惑!

          HTML5/javascript時鐘特效源碼

          代碼過長需要文檔版源碼來我的前端群570946165,已上傳到群文件

          頭條號里有許多web前端學習視頻/源碼,企業常用特效/案例/項目,敬請關注!


          上一篇:HTML入門練習案例
          下一篇:HTML 元素
          主站蜘蛛池模板: 国产一区二区三区国产精品| 日韩人妻不卡一区二区三区| 成人免费一区二区无码视频| 国产成人高清精品一区二区三区 | 国产一区二区三区在线观看影院 | 日本精品3d动漫一区二区| 国产伦精品一区二区三区视频猫咪 | 国精产品一区一区三区免费视频 | 亚拍精品一区二区三区| 中文字幕一区二区日产乱码| 日韩美女视频一区| 国产在线精品一区在线观看| 国产精品成人99一区无码| 精品人妻无码一区二区三区蜜桃一 | 日本一区二区三区精品国产| 亚洲AV无码国产一区二区三区| 无码人妻久久一区二区三区免费 | 精品人妻一区二区三区毛片| 日本一区二区高清不卡| 一区二区三区精品高清视频免费在线播放| 最新中文字幕一区| 日本精品一区二区久久久| 国产一区韩国女主播| 一区二区三区精品高清视频免费在线播放 | 国产在线一区二区| 亚洲av无码一区二区三区不卡 | 精品人妻中文av一区二区三区| 国产精品一区二区三区99 | 精品久久久中文字幕一区| 国产午夜精品一区二区三区极品| 成人一区二区三区视频在线观看| 精品国产一区二区三区久 | 日韩亚洲一区二区三区| 色欲综合一区二区三区| 51视频国产精品一区二区| 国产a久久精品一区二区三区| 日韩视频在线观看一区二区| 人妻少妇AV无码一区二区| 无码国产精品一区二区免费16 | 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲一区日韩高清中文字幕亚洲|