canvas-clock

by bingqichen

HTML

<script src="//cdn.bootcss.com/moment.js/2.21.0/moment.min.js"></script>
<script src="//cdn.bootcss.com/moment.js/2.21.0/locale/zh-cn.js"></script>
<div class="wrap">
  <canvas id="canvas" width="400" height="400"></canvas>
</div>

CSS

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  outline: none;
  border: none;
}

JavaScript

moment.locale('zh-cn');
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

function draw() {
  ctx.resetTransform(); // 重新绘图前清除变换效果
  ctx.clearRect(0, 0, 300, 300); // 清除内容

  const now = moment();

  ctx.strokeStyle = 'black';
  ctx.strokeRect(0, 0, 300, 300);

  ctx.translate(150, 150); // 移动坐标系中心点

  // 绘制黑色底盘
  ctx.beginPath();
  ctx.moveTo(-100, -80);
  ctx.quadraticCurveTo(-100, -100, -80, -100);
  ctx.lineTo(80, -100);
  ctx.quadraticCurveTo(100, -100, 100, -80);
  ctx.lineTo(100, 80)
  ctx.quadraticCurveTo(100, 100, 80, 100);
  ctx.lineTo(-80, 100);
  ctx.quadraticCurveTo(-100, 100, -100, 80);
  ctx.fillStyle = 'black';
  ctx.fill();




  const h = now.format('h');
  const m = now.format('m');
  const s = now.format('s');
  const ms = now.format('SSS');

  // 时针
  const hour = new Path2D();
  hour.arc(0, 0, 2, 0, Math.PI * 2);

  // hour.moveTo(-2, 0);
  // hour.bezierCurveTo(-2, -2, 0, -1, -1, -12);
  hour.moveTo(-1, -1);
  hour.lineTo(-1, -12)

  hour.lineTo(-2, -13);
  hour.lineTo(-2, -45);
  hour.arc(0, -47, 2, -Math.PI, 0);
  hour.lineTo(2, -13);

  // hour.lineTo(1, -12);
  // hour.bezierCurveTo(0, 1, 2, -2, 2, 0);
  hour.lineTo(1, -12);
  hour.lineTo(1, -1);

  // 分针
  const minute = new Path2D();
  minute.arc(0, 0, 2, 0, Math.PI * 2);
  minute.moveTo(-1, -1);
  minute.lineTo(-1, -12)
  minute.lineTo(-2, -13);
  minute.lineTo(-2, -82);
  minute.arc(0, -84, 2, -Math.PI, 0);
  minute.lineTo(2, -13);
  minute.lineTo(1, -12);
  minute.lineTo(1, -1);

  // 秒针
  const second = new Path2D();
  second.arc(0, 0, 1, 0, Math.PI);
  second.moveTo(0, 10);
  second.lineTo(0, -90);

  ctx.save(); // 暂存三次上下文,绘制指针时使用
  ctx.save();
  ctx.save();

  // 指针绘制函数
  function drawHands(hand, rotate, color) {
    ctx.rotate(rotate);
    if (color) {
      ctx.fillStyle = color;
      ctx.strokeStyle = color;
    }
    ctx.fill(hand);
    ctx.stroke(hand);
    ctx.restore();
  }

  // 绘制指针
  drawHands(hour, Math.PI * 2 * (h / 12 + (m /...