zoukankan      html  css  js  c++  java
  • Html 5 版 电子时钟

    效果图:

    html 5 canvas元素 

      Html 5的canvas元素可以用于在网页上绘制图形[即canvas的作用]。

      canvas画布使用JavaScript在网页上绘制图形

      其拥有绘制各种路径,矩形,圆,字符以及添加图像的方法。

      (1)在body中创建canvas元素

    <canvas id="panel" width="500" height="500" style="border:1px solid #000000"></canvas>

      <canvas>这里可以放置提示信息,当浏览器不支持canvas元素时,这里面的信息就会显示</canvas>

      (2)使用JavaScript绘制图形

      绘制图形时,首先,要获得canvas元素 

    var panel = document.getElementById("panel");

      通过id寻找到canvas,所以html中虽然可以在同一个页面内拥有相同的id标签,但是当JavaScript执行到时就会出现理论上只处理第一个id标签

      其次,创建context对象,以使用context对象绘制各种路径,矩形,圆,字符以及添加图像的方法

    var cxt=c.getContext("2d"); 

      然后就可以使用JavaScript绘制图形了

      准备工作,表盘一个:bg.jpg

         // 定义初始化方法
          function init() { }

      // 绘制秒针

      function drawSecond() {}

        // 绘制分针
        function drawMinute() {}

      // 绘制时针
          function drawHour() {}

        // 绘制表针
       function draw() {}

        // 绘制背景,加入表盘bg.jpg
        function drawBackground() {}

        // 获取string类型的当前时间
       function currTimeStr() {}

        // 获取当前时间,12小时制
         function currTime() {}

    关于坐标

     

    完整代码

    <!--!DocType html 表明该Html是一个Html 5文档,这是:Html中的注释方式-->
    <!DocType html>
    <html>
        <head>
            <title>Html 5 时钟</title>
            <script type="text/javascript">
                // JavaScript用于绘制图形了,这是script的注释形式
                var panel,cxt,img;
                var pw,ph,ox,oy;
                // 定义初始化方法
                function init() {
                    //获取canvas对象
                    panel = document.getElementById("panel");
                    // 获得canvas的宽和高
                    pw = panel.width;
                    ph = panel.height;
                    // 这样平面坐标:(ox,oy)就是canvas的中心坐标了
                    ox = pw/2;
                    oy = ph/2;
                    
                    // 检查浏览器的是否支持Html5
                    // [getContext是Html 5中canvas的方法,如果浏览器支持该方法就为真]
                    // 创建getContext对象,以使用其中的绘图方法
                    if(panel.getContext) {
                        cxt = panel.getContext('2d');
                    } else {
                        alert('对不起,你的浏览器不支持Html 5');
                    }
                    // 转化坐标,将(ox,oy)设置为坐标系的原点
                    cxt.translate(ox,oy);
                    
                    // 创建图片对象,并1000毫秒即1秒钟调用一次draw()方法来重绘图像表针
                    img = new Image();
                    
                    img.onload = function() {
                        setInterval('draw()',1000);
                    }
                    
                    // 将表盘设为canvas的背景
                    img.src = 'bg.jpg';
                }
                // 绘制秒针
                // save() 方法把当前状态的一份拷贝压入到一个保存图像状态的栈中。这就允许您临时地改变图像状态,然后,通过调用 restore() 来恢复以前的值。
                function drawSecond() {
                    cxt.save();
                    // currTime().s即为当前时间的秒钟,Math.PI即为π,弧度单位:π等于180°,2π等于360°,即一个圆周。
                    // 60秒,秒针转一圈
                    // currTime().s 获得现在的一分钟过了多少秒
                    // (2*Math.PI)/(360) 即1°对应Math.PI/180
                    // 60秒转一圈即360°,弧度2π,每秒转(Math.PI/180)*((1/60*360=6))
                    // rotate(弧度)
                    cxt.rotate(Math.PI/180*6*currTime().s);
                    // 设置所绘制图形的颜色
                    cxt.strokeStyle = "#0099FF";
                    // 设置直线的宽度
                    cxt.lineWidth = 2;
                    // 设置线段以半圆形结束,半径为线的宽度
                    cxt.lineCap = 'round';
                    // 开始准备工作了,丢弃任何当前定义的路径并且开始一条新的路径
                    // 如果没有可能会和之前的图形连起来,产生意想不到的图像
                    cxt.beginPath();
                    // 画笔的起点
                    cxt.moveTo(0,0);
                    // 终点,以直线方式
                    cxt.lineTo(0,-150);
                    // 绘制起点到终点的路径
                    cxt.stroke();
                    cxt.restore();
                }
                // 绘制分针
                function drawMinute() {
                    cxt.save();
                    // 弧度
                    cxt.rotate(Math.PI/180*6*currTime().m);
                    cxt.strokeStyle = "#073737";
                    cxt.lineWidth = 6;
                    
                    cxt.lineCap = 'round';
                    cxt.beginPath();
                    cxt.moveTo(0,0);
                    cxt.lineTo(0,-100);
                    cxt.stroke();
                    cxt.restore();
                }
                // 绘制时针
                function drawHour() {
                    cxt.save();
                    // 时钟转过的角度:例如9:30时针转了270°+(30/60)*30度
                    cxt.rotate(Math.PI/180*currTime().h*30+Math.PI/180*currTime().m/2);
                    cxt.strokeStyle = "#F6A900";
                    cxt.lineWidth = 10;
                    cxt.lineCap = 'round';
                    cxt.beginPath();
                    cxt.moveTo(0,0);
                    cxt.lineTo(0,-50);
                    cxt.stroke();
                    cxt.restore();
                }
                // 绘制表针
                function draw() {
                    cxt.clearRect(-pw/2,-ph/2,pw,ph);
                    drawBackground();
                    // 显示表针的时候这里可以设置他们的层叠关系
                    // Hour在最底层,Z轴坐标最小,先绘制的默认在画布的最底层
                    drawHour();
                    drawMinute();
                    drawSecond();
                                    
                    // innerHTML 属性可设置或返回单元格的开始标签和结束标签之间的 HTML。
                    // 设置id为time的标签[这里是span标签]的显示内容为获得系统当前时间
                    document.getElementById('time').innerHTML = '当前系统时间为:'+ currTimeStr();
                }
                // 绘制背景
                function drawBackground() {
                    cxt.save();
                    cxt.translate(0,0);
                    cxt.drawImage(img,-250,-250,500,500);
                    cxt.restore();
                }
                // 获取string类型的当前时间
                function currTimeStr() {
                    var d = new Date();
                    var h = d.getHours();
                    var m = d.getMinutes();
                    var s = d.getSeconds();
                    return h + ':' + m + ':' + s;
                }
                // 获取当前时间,12小时制
                function currTime() {
                    var d = new Date();
                    var h = d.getHours();
                    var m = d.getMinutes();
                    var s = d.getSeconds();
                    if(h > 12) {
                        h = h - 12;
                    }
                    return { "h":h,"m":m,"s":s};
                }
            </script>
        </head>
        <body onload="init()">
            <span id="time"></span><br />
            </span><canvas style="border:1px solid #000000" id="panel" width="500" height="500">
                对不起,你的浏览器不支持Html 5
            </canvas>    
        </body>
    </html>
  • 相关阅读:
    hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)
    kmp算法
    STP根交换机,指定端口,根端口,阻塞端口
    python,django安装
    交换机access与trunk口
    树状数组
    hdoj 2191(多重背包)
    hdoj 2601(判断N=i*j+i+j)
    二维背包经典问题
    hdoj 2602(背包)
  • 原文地址:https://www.cnblogs.com/liushen/p/3337897.html
Copyright © 2011-2022 走看看