美文网首页网页前端后台技巧(CSS+HTML)【HTML+CSS】
HTML5 Canvas笔记——一个基本的时钟程序

HTML5 Canvas笔记——一个基本的时钟程序

作者: 没昔 | 来源:发表于2020-04-07 21:46 被阅读0次

    参考书目:《HTML5 Canvas核心技术 图形、动画与游戏开发》

    用HTML5 Canvas实现一个基本的时钟程序

    1-4.html

    <!DOCTYPE html>

    <html>

      <head>

        <title>Clock</title>

          <style>

            body {

                background: #dddddd;

            }

            #canvas {

                position: absolute;

                left: 0px;

                top: 0px;

                margin: 20px;

                background: #ffffff;

                border: thin solid #aaaaaa;

            }

          </style>

      </head>

      <body>

        <canvas id='canvas' width='400' height='400'>

          Canvas not supported

        </canvas>

        <script src='1-4.js'></script>

      </body>

    </html>

    1-4.js

    var canvas = document.getElementById('canvas'),

        context = canvas.getContext('2d'),

        FONT_HEIGHT = 15,

        MARGIN = 35,

        HAND_TRUNCATION = canvas.width/25,

        HOUR_HAND_TRUNCATION = canvas.width/10,

        NUMERAL_SPACING = 20,

        RADIUS = canvas.width/2 - MARGIN,

        HAND_RADIUS = RADIUS + NUMERAL_SPACING;

    function drawCircle() {

      context.beginPath();

      context.arc(canvas.width/2, canvas.height/2,

                  RADIUS, 0, Math.PI*2, true);

      context.stroke();

    }

    function drawNumerals() {

      var numerals = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ],

          angle = 0,

          numeralWidth = 0;

      numerals.forEach(function(numeral) {

          angle = Math.PI/6 * (numeral-3);

          numeralWidth = context.measureText(numeral).width;

          context.fillText(numeral,

            canvas.width/2  + Math.cos(angle)*(HAND_RADIUS) - numeralWidth/2,

            canvas.height/2 + Math.sin(angle)*(HAND_RADIUS) + FONT_HEIGHT/3);

      });

    }

    function drawCenter() {

      context.beginPath();

      context.arc(canvas.width/2, canvas.height/2, 5, 0, Math.PI*2, true);

      context.fill();

    }

    function drawHand(loc, isHour) {

      var angle = (Math.PI*2) * (loc/60) - Math.PI/2,

          handRadius = isHour ? RADIUS - HAND_TRUNCATION-HOUR_HAND_TRUNCATION

                              : RADIUS - HAND_TRUNCATION;

      context.moveTo(canvas.width/2, canvas.height/2);

      context.lineTo(canvas.width/2  + Math.cos(angle)*handRadius,

                      canvas.height/2 + Math.sin(angle)*handRadius);

      context.stroke();

    }

    function drawHands() {

      var date = new Date,

          hour = date.getHours();

      hour = hour > 12 ? hour - 12 : hour;

      drawHand(hour*5 + (date.getMinutes()/60)*5, true, 0.5);

      drawHand(date.getMinutes(), false, 0.5);

      drawHand(date.getSeconds(), false, 0.2);

    }

    function drawClock() {

      context.clearRect(0,0,canvas.width,canvas.height);

      drawCircle();

      drawCenter();

      drawHands();

      drawNumerals();

    }

    context.font = FONT_HEIGHT + 'px Arial';

    loop = setInterval(drawClock, 1000);

    效果如图:

    相关文章

      网友评论

        本文标题:HTML5 Canvas笔记——一个基本的时钟程序

        本文链接:https://www.haomeiwen.com/subject/eugophtx.html