canvas时钟绘制

index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>时钟</title>
    <style>
        div{
            text-align: center;
            margin-top: 250px;
        }
    </style>
</head>
<body>
    <div>
        <canvas id="clock" width="400" height="400" style="border:1px solid #ccc;"></canvas>
    </div>
        <script src="./shizhong.js"></script>
</body>
</html>

shizhong.js
var dom=document.getElementById(‘clock‘);
var ctx=dom.getContext(‘2d‘);
var width=ctx.canvas.width;//定义宽度
var height=ctx.canvas.height;//定义高度
var r=width /2;//定义半径
var rem=width /200;//定义钟的大小变化

//绘制外圆
function dranbackground(){

    ctx.save();//保存当前环境状态

    ctx.translate(r,r);//调动或移动
    ctx.beginPath();//起始路径
    ctx.lineWidth=10 *rem;//设置线条宽度
    ctx.arc(0,0,r-ctx.lineWidth /2 ,0,2*Math.PI,false);//绘制弧形:X=0,Y=0,半径减去ctx.lineWidth/2宽度,起始路径,终点路径,为顺时针旋转

    ctx.stroke();//绘制线条

// 绘制数字
    var hours=[3,4,5,6,7,8,9,10,11,12,1,2];//12个小时
    ctx.font=18 *rem+ ‘px Arial‘;//字体属性
    ctx.textAlign=‘center‘;//左右对齐
    ctx.textBaseline=‘middle‘;//上下对齐
    hours.forEach(function(number,i){
        var rad=2*Math.PI/12*i;//每一个小时数的弧度*i
        var x=Math.cos(rad)*(r-30 *rem);
        var y=Math.sin(rad)*(r-30 *rem);

        ctx.fillText(number,x,y);//在画布上绘制被填充的文本(文本,X轴,Y轴)
    });

//绘制妙钟点
    for(var i=0;i<60;i++){
        var rad=2*Math.PI/60*i;//每一个妙数的弧度*i
        var x=Math.cos(rad)*(r-18*rem);
        var y=Math.sin(rad)*(r-18*rem);
        ctx.beginPath();//起始点
        //这条IF涵数是如果每隔5个小时的填充为黑色,否则为灰色
        if(i%5===0){
            ctx.fillStyle=‘#000‘;
            ctx.arc(x,y,2*rem,0,2*Math.PI,false);
        } else{
            ctx.fillStyle=‘#ccc‘;
            ctx.arc(x,y,2*rem,0,2*Math.PI,false);
        }

        ctx.fill();//绘制填充
    }
}

//绘制时针
function dranhour(hour,minute){
    ctx.save();//保存当前环境状态
    ctx.beginPath();//起点
    var rad=2*Math.PI/12*hour;//弧度为圆圈/60秒*时针1点
    var mrad=2*Math.PI/12/60*minute;//弧度为圆圈/60秒*分针30分
    ctx.rotate(rad+mrad);//旋转为时针弧度+分针弧度
    ctx.lineWidth=6*rem;//线条宽度为6
    ctx.lineCap=‘round‘;//线条变圆
    ctx.moveTo(0,10);//从X为0到Y为10
    ctx.lineTo(0,-r/2);//画到X为0到Y为-R/2长度
    ctx.stroke();//绘制线条
    ctx.restore();//返回之前保存过的路径状态和属性
}
//绘制分针
function dranminute(minute){
    ctx.save();//保存当前环境状态
    ctx.beginPath();//起点
    var rad=2*Math.PI/60*minute;//弧度为圆圈/60秒*分针30分
    ctx.rotate(rad);//旋转为分针弧度
    ctx.lineWidth=3*rem;//线条宽度为3
    ctx.lineCap=‘round‘;//线条变圆
    ctx.moveTo(0,10*rem);//从X为0到Y为10
    ctx.lineTo(0,-r+30*rem);//画到X为0到Y为-R+30长度
    ctx.stroke();//绘制线条
    ctx.restore();//返回之前保存过的路径状态和属性
}
//绘制妙针
function dransecond(second){
    ctx.save();//保存当前环境状态
    ctx.beginPath();//起点
    ctx.fillStyle=‘red‘;//填充为红色
    var rad=2*Math.PI/60*second;//弧度为圆圈/60秒*秒针15秒
    ctx.rotate(rad);//旋转秒针弧度
    ctx.moveTo(-2*rem,20*rem);//从X为-2到Y为20
    ctx.lineTo(2*rem,20*rem);//画到X为2到Y为20长度
    ctx.lineTo(1,-r+18*rem);//画到X为1到Y为-R+18长度
    ctx.lineTo(-1,-r+18*rem);//画到X为-1到Y为-R+18长度
    ctx.fill();//绘制填充
    ctx.restore();//返回之前保存过的路径状态和属性
}
//绘制时针、分针、妙针中的白色圆点
function drandot(){
    ctx.beginPath();//起点
    ctx.fillStyle=‘#fff‘;//填充为白色
    ctx.arc(0,0,3*rem,0,2*Math.PI,false);//X轴为0,Y轴为0,半径为3,起点为0,终点为2*Math.PI(圆圈),为顺时针
    ctx.fill();//绘制填充
}

function dran(){
    ctx.clearRect(0,0,width,height);//清空指定图形像素
    var now=new Date();//获取当前时间
    var hour=now.getHours();//执行当前时针
    var minute=now.getMinutes();//执行当前分针
    var second=now.getSeconds();//执行当前秒针
    dranbackground();//变量外圆值
    dranhour(hour,minute);//变量时针值
    dranminute(minute);//变量分针值
    dransecond(second);//变量妙针值
    drandot();//变量中心圆点值

    ctx.restore();//返回之前保存过的路径状态和属性
}

dran();//先执行一次
setInterval(dran,1000)//每秒执行一次
时间: 2024-08-06 17:15:24

canvas时钟绘制的相关文章

Canvas - 时钟绘制

导语:距离上一次写canvas,已经过去两年半,如今业务需要,再次拾起,随手记录. [思考] 时钟的绘制主要在于圆的绘制:1. 使用context.arc()方法直接绘制圆或圆弧: 2. 使用圆的方程(x = r * cosA + X, y = r * sinA + Y)进行描点绘制.指针运行速率较慢,故使用setInterval进行刷新重绘.[优化]可以使用两个canvas,一个用来绘制表盘,另一个绘制指针,如此,只需刷新重绘指针canvas,表盘canvas保持不变. <!DOCTYPE h

canvas基础绘制-绚丽时钟

效果图: 与canvas基础绘制-绚丽倒计时的代码差异: // var endTime = new Date();//const声明变量,不可修改,必须声明时赋值: // endTime.setTime( endTime.getTime() + 3600*1000);//当前时间向后一小时: var curShowTimeSeconds = 0; function getCurrentShowTimeSeconds() { var curTime = new Date();//获取目前时间: /

原生js之canvas时钟组件

canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 canvas元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. canvas标签只是图形容器,您必须使用脚本来绘制图形. 浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 和 Safari 支持 那么本篇文章就通过一个时钟组件来熟悉使用一下关

HTML5在canvas中绘制复杂形状附效果截图

HTML5在canvas中绘制复杂形状附效果截图 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath() : 开始绘制一个新路径. closePath() : 通过绘制一条当前点到路径起点的线段来闭合形状. fill() , stroke() : 填充形状或绘制空心形状. moveTo() : 将当前点移动到点(x,y). lineTo() : 从当前点绘制一条直线到点(x,y). arc(x,y,r,sAngle,eAn

Android中使用SurfaceView和Canvas来绘制动画

其实每个View中都有Canvas可以用来绘制动画,只需要在这个View中重载onDraw()方法就可以,但是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做"画布")就和HTML5中的canvas标签一样可以在一定区域内自由绘制图形.Canvas+SurfaceView制作的动画与View Animation和Property Animation这类动画比起来更加适合大量的集中播放的动画,比如游戏画面.相机的图像显示等. 因为SurfaceView通常会在

HTML5 在canvas中绘制矩形

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统,x坐标向右递增,y坐标向下递增. 使用绘图环境的矩形绘制函数来绘制矩形. fillRect(x,y,width,height) : 绘制一个实心的矩形. strokeRect(x,y,width,height) : 绘制一个空心的矩形. clearRect(x,y,width,height) : 清

[HTML5 Canvas学习]绘制矩形

1.使用strokeRect和fillRect方法绘制矩形 a.strokeRect是绘制一个不填充的矩形 b.fillRect是绘制一个填充的矩形 代码: <script> var canvas = document.getElementById('canvas'), context = canvas.getContext('2d'); context.lineJoin = 'round'; context.lineWidth = 20; context.strokeRect(10, 10,

canvas基础绘制-绚丽倒计时

效果图: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ball</title> <script src="digit_1.js"></script> <script src="countdown.js"></

HTML5 在canvas中绘制复杂形状

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/32942667 一.绘制复杂形状或路径 在简单的矩形不能满足需求的情况下,绘图环境提供了如下方法来绘制复杂的形状或路径. beginPath()  : 开始绘制一个新路径. closePath()  : 通过绘制一条当前点到路径起点的线段来闭合形状. fill() , stroke()  : 填充形状或绘制空心形状. moveTo()  : 将当前点移动到点(x,y). lin