用JS Canvas画一个腕表⌚️送给自己

作者 : 开心源码 本文共4537个字,预计阅读时间需要12分钟 发布时间: 2022-05-13 共213人阅读

没钱买表 某前台程序员竟然 用代码画了个表?

clock.jpeg

在线Demo https://codepen.io/DiscoverForever/pen/dyXKaqb

HTML代码

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>test</title>  <style>    html,    body {      height: 100%;      width: 100%;      display: flex;      justify-content: center;      align-items: center;    }    #canvas {      width: 200px;      height: 200px;    }  </style>  <script src="./index.js"></script></head><body>  <canvas id="canvas" width="200" height="200"></canvas></body></html>

Javascript代码

function init() {  const canvas = document.getElementById('canvas')  const width = canvas.width  const height = canvas.height  canvas.style.width = width + 'px'  canvas.style.height = height + 'px'  canvas.height = height * devicePixelRatio  canvas.width = width * devicePixelRatio  let ctx = null  if (canvas.getContext) {    ctx = canvas.getContext('2d')  } else {    alert('该浏览器暂不支持Canvas')    return  }  setInterval(() => {    // 清空画布    canvas.height = height * devicePixelRatio    canvas.width = width * devicePixelRatio    run(ctx)  }, 1000)}function run(ctx) {  const date = new Date()  renderCircle(ctx, 100, 100, 99, 'grey')  renderCircle(ctx, 100, 100, 94, 'black')  renderHourHand(ctx, getHourHandAngle(date.getHours()))  renderMinuteHand(ctx, getMinuteHandAngle(date.getMinutes()))  renderSecondHand(ctx, getSecondHandAngle(date.getSeconds()))  artCenterCircle(ctx)  renderScaleLabel(ctx)  renderHourScale(ctx)  renderMinuteScale(ctx)}/** * 获取时针偏转角度 * @param {*} second * @returns */function getHourHandAngle(hour) {  let currentHour = null  if (hour <= 12) {    currentHour = hour  } else {    currentHour = hour - 12  }  return currentHour * 30 * (Math.PI / 180)}/** * 获取分针偏转角度 * @param {*} second * @returns */function getMinuteHandAngle(minute) {  return minute * 6 * (Math.PI / 180)}/** * 获取秒针偏转角度 * @param {*} second * @returns */function getSecondHandAngle(second) {  return second * 6 * (Math.PI / 180)}/** * 画圆 */function renderCircle(ctx, x, y, radius, color, lineWidth = 1) {  ctx.beginPath()  ctx.strokeStyle = color  ctx.lineWidth = lineWidth  ctx.arc(x * devicePixelRatio, y * devicePixelRatio, radius * devicePixelRatio, 0, 2 * Math.PI, false)  ctx.stroke()  ctx.closePath()}/** * 画时针 * @param {*} ctx  * @param {*} angle  */function renderHourHand(ctx, angle) {  ctx.beginPath()  ctx.save()  ctx.translate(100 * devicePixelRatio, 100 * devicePixelRatio)  ctx.rotate(angle)  ctx.strokeStyle = 'black'  ctx.lineWidth = 10  ctx.moveTo(0, 0)  ctx.lineTo(0, -40 * devicePixelRatio)  ctx.stroke()  ctx.restore()  ctx.closePath()}/** * 画分针 * @param {*} ctx * @param {*} angle */function renderMinuteHand(ctx, angle) {  ctx.beginPath()  ctx.save()  ctx.translate(100 * devicePixelRatio, 100 * devicePixelRatio)  ctx.rotate(angle)  ctx.strokeStyle = 'black'  ctx.lineWidth = 6  ctx.moveTo(0, 0)  ctx.lineTo(0, -60 * devicePixelRatio)  ctx.stroke()  ctx.restore()  ctx.closePath()}/** * 画秒针 * @param {*} ctx * @param {*} angle */function renderSecondHand(ctx, angle) {  ctx.beginPath()  ctx.save()  ctx.translate(100 * devicePixelRatio, 100 * devicePixelRatio)  ctx.rotate(angle)  ctx.strokeStyle = 'black'  ctx.lineWidth = 2  ctx.moveTo(0, 0)  ctx.lineTo(0, -90 * devicePixelRatio)  ctx.stroke()  ctx.restore()  ctx.closePath()}/** * 表心 * @param {*} ctx  */function artCenterCircle(ctx) {  ctx.beginPath()  ctx.lineWidth = 1  ctx.fillStyle = 'black'  ctx.arc(100 * devicePixelRatio, 100 * devicePixelRatio, 4 * devicePixelRatio, 0, 2 * Math.PI, false)  ctx.fill()}/** * 画表盘刻度 * @param {*} ctx  */function renderScale(ctx) {  const lables = genClockScale(100, 100, 94)  ctx.beginPath()  lables.forEach(label => {    ctx.moveTo(label.x, label.y)    ctx.lineTo(100 * devicePixelRatio, 100 * devicePixelRatio)  })  ctx.stroke()}/** * 画小时刻度 */function renderHourScale(ctx) {  for (var i = 0; i < 12; i++) {    ctx.beginPath()    ctx.save()    ctx.translate(102 * devicePixelRatio, 98 * devicePixelRatio)    ctx.lineWidth = 2    ctx.strokeStyle = 'black'    ctx.rotate(i * 30 * Math.PI / 180)    ctx.moveTo(0, -94 * devicePixelRatio)    ctx.lineTo(0, -89 * devicePixelRatio)    ctx.stroke()    ctx.restore()    ctx.closePath()  }}/** * 画分刻度 */function renderMinuteScale(ctx) {  for (var i = 0; i < 60; i++) {    ctx.beginPath()    ctx.save()    ctx.translate(102 * devicePixelRatio, 98 * devicePixelRatio)    ctx.lineWidth = 1    ctx.strokeStyle = 'black'    ctx.rotate(i * 6 * Math.PI / 180)    ctx.moveTo(0, -94 * devicePixelRatio)    ctx.lineTo(0, -92 * devicePixelRatio)    ctx.stroke()    ctx.restore()    ctx.closePath()  }}/** * 画表盘数字 */function renderScaleLabel(ctx) {  const lables = genClockScale(100, 100, 82)  ctx.beginPath()  ctx.font = `${10 * devicePixelRatio}px Pingfang`  ctx.translate(-2 * devicePixelRatio, 2 * devicePixelRatio)  lables.forEach(label => ctx.fillText(label.text, label.x, label.y))  ctx.translate(0, 0)  ctx.closePath()}/** * 获取刻度坐标 * @param {*} x 圆心x * @param {*} y 圆心y * @param {*} radius 半径 * @returns */function genClockScale(ccX, ccY, radius, offset = 0) {  const lables = [9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8]  return lables.map((label, index) => {    const angle = Math.PI * 2 / 12 * index    let x = ccX - radius * Math.cos(angle) + offset    let y = ccY - radius * Math.sin(angle) + offset    return {      angle,      text: label,      x: x * devicePixelRatio,      y: y * devicePixelRatio,    }  })}window.onload = init
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 用JS Canvas画一个腕表⌚️送给自己

发表回复