1. 程式人生 > 程式設計 >javascript canvas封裝動態時鐘

javascript canvas封裝動態時鐘

本文例項為大家分享了canvas封裝動態時鐘的具體程式碼,供大家參考,具體內容如下

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width,initial-scale=1.0">
 <title>canvas繪製動態時鐘</title>
 <style>
 #clock {
  display: block;
  margin: 30px auto;
 }
 </style>
</head>

<body>
 <canvas id="clock" width="200" height="200"></canvas>
 <script>

 function canvasClock(canvasClockObj) {
  return (function (canvasClockObj) {
  var ctx = canvasClockObj.dom.getContext('2d')
  let width = ctx.canvas.width
  let height = ctx.canvas.height
  let r = width > height ? height / 2 : width / 2

  // 繪製背景板
  function drawBackground() {
   // 繪製外圈圓環
   ctx.save() // 每次開始前都要儲存當前畫布狀態,以免移動畫布影響後續繪製
   ctx.translate(r,r) // 設定起始點為圓心
   ctx.beginPath() // 每次開始繪製前必須開始一條路徑
   ctx.lineWidth = 10 // 設定繪線的寬度
   ctx.strokeStyle = canvasClockObj.outerRing
   ctx.arc(0,r - ctx.lineWidth / 2,2 * Math.PI,false) // 畫一個整圓
   ctx.stroke() // 對圓進行描邊
   ctx.strokeStyle = '#000'
   // 繪製分鐘 和 小時
   var minuteNumbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60]
   minuteNumbers.map(function (number,i) {
   var rad = 2 * Math.PI / 60 * i
   var x = Math.cos(rad) * (r - 17) // 獲取每分鐘的x軸座標
   var y = Math.sin(rad) * (r - 17) // 獲取每分鐘的y軸座標
   ctx.beginPath() // 每次開始繪製前必須開始一條路徑
   ctx.fillStyle = '#ccc'
   ctx.arc(x,y,false)
   ctx.fill()
   })
   var hourNumbers = [3,1,2]
   hourNumbers.map(function (number,i) {
   var rad = 2 * Math.PI / 12 * i
   var x = Math.cos(rad) * (r - 30)
   var y = Math.sin(rad) * (r - 30)
   var x1 = Math.cos(rad) * (r - 17)
   var y1 = Math.sin(rad) * (r - 17)
   ctx.beginPath() // 每次開始繪製前必須開始一條路徑
   ctx.fillStyle = canvasClockObj.hourColor ? canvasClockObj.hourColor :'#000' // 設定 小時的顏色
   ctx.textAlign = 'center' // 使文字左右居中
   ctx.textBaseline = 'middle' // 使文字上下居中
   ctx.font = 14 + 'px Arial'
   ctx.fillText(number,x,y)
   ctx.arc(x1,y1,false)
   ctx.fill()
   })
  }
  drawBackground()

  // 繪製圓心
  function drawDot() {
   ctx.beginPath()
   ctx.fillStyle = '#fff'
   ctx.lineWidth = 1
   ctx.arc(0,false)
   ctx.fill()
  }
  // 繪製時針
  function drawHour(hour,minute) {
   ctx.save()
   ctx.beginPath()
   var hrad = Math.PI / 12 * hour * 2
   var mrad = Math.PI / 12 / 60 * minute * 2
   ctx.rotate(hrad + mrad)
   ctx.lineWidth = 4
   ctx.moveTo(0,10)
   ctx.lineTo(0,-r / 2.5)
   ctx.lineCap = 'round'
   ctx.stroke()
   ctx.restore()
  }
  // 繪製分針
  function drawMinute(minute,second) {
   ctx.save()
   ctx.beginPath()
   var mrad = Math.PI / 60 * minute * 2
   var srad = Math.PI / 60 / 60 * second * 2
   ctx.rotate(srad + mrad)
   ctx.lineWidth = 0.5
   ctx.lineJoin = 'round'
   ctx.fillStyle = '#000'
   ctx.moveTo(2,-r / 1.7)
   ctx.lineTo(-2,10)
   ctx.lineTo(2,10)
   ctx.lineCap = 'round'
   ctx.fill()
   ctx.restore()
  }
  // 繪製秒針
  function drawSecond(second) {
   ctx.save()
   ctx.beginPath()
   var srad = Math.PI / 30 * second
   ctx.rotate(srad)
   ctx.lineWidth = 0.5
   ctx.lineJoin = 'round'
   ctx.fillStyle = canvasClockObj.secondHand ? canvasClockObj.secondHand : '#f00'
   ctx.moveTo(2,-r / 1.2)
   ctx.lineTo(-2,10)
   ctx.lineCap = 'round'
   ctx.fill()
   ctx.restore()
  }
  // 使指標動起來
  function draw() {
   ctx.translate(-r,-r)
   ctx.clearRect(0,width,height)
   var now = new Date()
   var hour = now.getHours()
   var minute = now.getMinutes()
   var second = now.getSeconds()
   drawBackground()        //繪製圓盤背景
   drawHour(hour,minute);       //繪製時針
   drawMinute(minute,second);        //繪製分針
   drawSecond(second);        //繪製秒針
   drawDot();           //繪製原點 
  }
  draw()
  setInterval(draw,1000);
  })(canvasClockObj)
 }
 canvasClock({
  dom:document.getElementById('clock'),// 必填項: canvas節點
  // outerRing:'purple',// 外圈圓環顏色 預設值: #000 
  // hourColor:'skyblue',// 小時的顏色 預設值 #000
  // secondHand:'yellow' // 秒針的顏色 預設值: #f00
 })
 </script>
</body>

</html>

更多JavaScript時鐘特效點選檢視:JavaScript時鐘特效專題

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。