javascript canvas封裝動(dòng)態(tài)時(shí)鐘
本文實(shí)例為大家分享了canvas封裝動(dòng)態(tài)時(shí)鐘的具體代碼,供大家參考,具體內(nèi)容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>canvas繪制動(dòng)態(tài)時(shí)鐘</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() {
// 繪制外圈圓環(huán)
ctx.save() // 每次開始前都要保存當(dāng)前畫布狀態(tài),以免移動(dòng)畫布影響后續(xù)繪制
ctx.translate(r, r) // 設(shè)置起始點(diǎn)為圓心
ctx.beginPath() // 每次開始繪制前必須開始一條路徑
ctx.lineWidth = 10 // 設(shè)置繪線的寬度
ctx.strokeStyle = canvasClockObj.outerRing
ctx.arc(0, 0, r - ctx.lineWidth / 2, 0, 2 * Math.PI, false) // 畫一個(gè)整圓
ctx.stroke() // 對(duì)圓進(jìn)行描邊
ctx.strokeStyle = '#000'
// 繪制分鐘 和 小時(shí)
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軸坐標(biāo)
var y = Math.sin(rad) * (r - 17) // 獲取每分鐘的y軸坐標(biāo)
ctx.beginPath() // 每次開始繪制前必須開始一條路徑
ctx.fillStyle = '#ccc'
ctx.arc(x, y, 2, 0, 2 * Math.PI, false)
ctx.fill()
})
var hourNumbers = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 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' // 設(shè)置 小時(shí)的顏色
ctx.textAlign = 'center' // 使文字左右居中
ctx.textBaseline = 'middle' // 使文字上下居中
ctx.font = 14 + 'px Arial'
ctx.fillText(number, x, y)
ctx.arc(x1, y1, 2, 0, 2 * Math.PI, false)
ctx.fill()
})
}
drawBackground()
// 繪制圓心
function drawDot() {
ctx.beginPath()
ctx.fillStyle = '#fff'
ctx.lineWidth = 1
ctx.arc(0, 0, 3, 2 * Math.PI, false)
ctx.fill()
}
// 繪制時(shí)針
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, 10)
ctx.lineTo(0, -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, 10)
ctx.lineTo(0, -r / 1.2)
ctx.lineTo(-2, 10)
ctx.lineTo(2, 10)
ctx.lineCap = 'round'
ctx.fill()
ctx.restore()
}
// 使指針動(dòng)起來
function draw() {
ctx.translate(-r, -r)
ctx.clearRect(0, 0, width, height)
var now = new Date()
var hour = now.getHours()
var minute = now.getMinutes()
var second = now.getSeconds()
drawBackground() //繪制圓盤背景
drawHour(hour, minute); //繪制時(shí)針
drawMinute(minute,second); //繪制分針
drawSecond(second); //繪制秒針
drawDot(); //繪制原點(diǎn)
}
draw()
setInterval(draw, 1000);
})(canvasClockObj)
}
canvasClock({
dom:document.getElementById('clock'), // 必填項(xiàng): canvas節(jié)點(diǎn)
// outerRing:'purple', // 外圈圓環(huán)顏色 默認(rèn)值: #000
// hourColor:'skyblue', // 小時(shí)的顏色 默認(rèn)值 #000
// secondHand:'yellow' // 秒針的顏色 默認(rèn)值: #f00
})
</script>
</body>
</html>
更多JavaScript時(shí)鐘特效點(diǎn)擊查看:JavaScript時(shí)鐘特效專題
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS 修改URL參數(shù)(實(shí)現(xiàn)代碼)
本篇文章是對(duì)JS修改URL參數(shù)的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
解決Layui數(shù)據(jù)表格中checkbox位置不居中的方法
今天小編就為大家分享一篇解決Layui數(shù)據(jù)表格中checkbox位置不居中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
用Javascript實(shí)現(xiàn)UTF8編碼轉(zhuǎn)換成gb2312編碼
這篇文章主要介紹了用Javascript實(shí)現(xiàn)UTF8編碼轉(zhuǎn)換成gb2312編碼2006-12-12
js獲取URL的參數(shù)的方法(getQueryString)示例
getQueryString方法默認(rèn)返回的是 string如果是int類型,則JS使用的時(shí)候,要進(jìn)行轉(zhuǎn)換一下,下面有個(gè)不錯(cuò)的示例,大家可以參考下2013-09-09
antDesign 自定義分頁樣式的實(shí)現(xiàn)代碼
這篇文章主要介紹了antDesign 自定義分頁樣式的實(shí)現(xiàn)代碼,這里用到了自定義指令,如果大家用不到可以按照自己的實(shí)際效果開發(fā),本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10

