HTML(5)canvas手绘时钟的设计与实现

一、实验项目

 5.1 手绘时钟的设计与实现

功能要求:在手绘时钟项目中,主要难点为时钟刻度与时钟的绘制以及时间实时更新的动画效果不依赖于任何图片素材,完全基于HTML5画布API绘制时钟,并实现每秒更新的动态效果。效果图如图所示。

二、实验源代码

<!DOCTYPE html>
<html lang="en">
<head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>手绘时钟</title>
     <style>
     </style>
</head>
<body onload="drawClock()">
     <h3>手绘时钟</h3>
     <hr />
     <canvas id="clockcanvas" width="300" height="300" style="border:1px solid">
     </canvas>

     <script type="text/javascript">
          var c=document.getElementById("clockcanvas");
          var ctx=c.getContext('2d')
          // 把clockcanvas赋给c 并用ctx获取该canvas的2D绘图环境
          function drawClock(){
               ctx.save();               
               ctx.clearRect(0,0,300,300);
               // x 要清除的矩形左上角的 x 坐标
               // y 要清除的矩形左上角的 y 坐标
               // width 要清除的矩形的宽度,以像素计
               // height 要清除的矩形的高度,以像素计
               //功能:清除矩形区域,使其完全透明 三种绘制方式的一种 绘制内容 边框 或者 全部清除

               ctx.translate(150,150);
               //设置画布中心为参照点 便于按照原点旋转
               ctx.rotate(-Math.PI/2);
               //画布旋转90度
               ctx.lineCap="round";
                //设置画笔线条的末端为圆形             
               ctx.lineWidth=6;
               //设置画笔线条为6像素

            //画12小时刻度
               for (var i=0;i<12;i++){
               ctx.beginPath();
               //新建一条路径
               ctx.rotate(Math.PI/6);
                //每次顺时针旋转30度
                ctx.moveTo(100,0);
                ctx.lineTo(120,0);
               //描边路径
               ctx.stroke();
               }
               
               // 画60分钟对应的一圈外边缘刻度
              ctx.lineWidth=5;
              for (i=0;i<60;i++){
               ctx.beginPath();
               ctx.moveTo(115,0);
               ctx.lineTo(120,0);
               ctx.rotate(Math.PI/30);
                ctx.stroke();
               }

               //获取当前时间
            var now = new Date();
            var s = now.getSeconds();
            var m = now.getMinutes();
            var h = now.getHours();
            //将小时设置成12小时制的数值
            if (h>12)
            h-=12;

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

            //设置指针所在角度
            ctx.rotate(h*(Math.PI/6)+(Math.PI/360)*m+(Math.PI/21600)*s);
            //设置时间样式
            ctx.lineWidth=12;
            //设置时针宽度 开始绘制时针
            ctx.beginPath();//创建新路径
            ctx.moveTo(-10,0);
            ctx.lineTo(80,0);
            ctx.stroke();
            
            //恢复当前状态1
            ctx.restore();


            //绘制分针,保存当前状态1
            ctx.save();//保存1
            //旋转角度
            ctx.rotate((Math.PI/30)*m+(Math.PI/1800)*s);
            //设置分针样式
            ctx.lineWidth=8;
            //设置分针路径
            ctx.beginPath();
            ctx.moveTo(-20,0);
            ctx.lineTo(100,0);
            //描边路径
            ctx.stroke();
            //恢复1
            ctx.restore();


            //绘制秒针,保存1
            ctx.save();
            //设置秒针路径
            ctx.rotate(s*Math.PI/30);
            ctx.strokeStyle="red";
            //6像素
            ctx.lineWidth=6;
            ctx.beginPath();
            ctx.moveTo(-30,0);
            ctx.lineTo(120,0);
            ctx.stroke();
            
            //画时钟原点
            ctx.fillStyle="red";
            ctx.beginPath();
            ctx.arc(0,0,10,0,Math.PI*2,true);//绘制圆,以旋转中心为原点,开始位置   半径 弧度  逆时针
            //填充原点为红色
            ctx.fill();
            //恢复之前状态1
            ctx.restore();

             //绘制表盘
            ctx.lineWidth=12;
            ctx.strokeStyle="gray";
            //开始绘制表盘路径
            ctx.beginPath();
            ctx.arc(0,0,140,0,Math.PI*2,true);
            //描边路径
            ctx.stroke();
            // 恢复原有状态
             ctx.restore();



        }
            setInterval("drawClock()",1000);
          
     </script>

</body>
<html>

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 下面是一个简单的 HTML 手绘时钟设计实现设计图: ``` <!DOCTYPE html> <html> <head> <title>Hand-drawn Clock</title> <style> body { background-color: #f2f2f2; } .clock { margin: 50px auto; width: 200px; height: 200px; border-radius: 50%; background-color: #fff; position: relative; } .hour-hand { position: absolute; left: 100px; top: 70px; width: 0; height: 50px; border-radius: 20px; transform-origin: 50% 90%; background-color: #000; transform: rotate(60deg); z-index: 3; } .minute-hand { position: absolute; left: 100px; top: 50px; width: 0; height: 80px; border-radius: 20px; transform-origin: 50% 90%; background-color: #000; transform: rotate(120deg); z-index: 2; } .second-hand { position: absolute; left: 100px; top: 30px; width: 0; height: 100px; border-radius: 20px; transform-origin: 50% 90%; background-color: #f00; transform: rotate(180deg); z-index: 1; } .center-dot { position: absolute; left: 95px; top: 95px; width: 10px; height: 10px; border-radius: 50%; background-color: #000; z-index: 4; } .number { position: absolute; left: 90px; top: 5px; width: 20px; height: 20px; color: #000; font-size: 20px; text-align: center; z-index: 5; } .number-1 { transform: rotate(-30deg); left: 150px; top: 70px; } .number-2 { transform: rotate(0deg); left: 180px; top: 100px; } .number-3 { transform: rotate(30deg); left: 175px; top: 150px; } .number-4 { transform: rotate(60deg); left: 150px; top: 180px; } .number-5 { transform: rotate(90deg); left: 100px; top: 185px; } .number-6 { transform: rotate(120deg); left: 50px; top: 150px; } .number-7 { transform: rotate(150deg); left: 25px; top: 100px; } .number-8 { transform: rotate(180deg); left: 50px; top: 70px; } .number-9 { transform: rotate(210deg); left: 100px; top: 65px; } .number-10 { transform: rotate(240deg); left: 150px; top: 70px; } .number-11 { transform: rotate(270deg); left: 175px; top: 100px; } .number-12 { transform: rotate(300deg); left: 150px; top: 150px; } </style> </head> <body> <div class="clock"> <div class="hour-hand"></div> <div class="minute-hand"></div> <div class="second-hand"></div> <div class="center-dot"></div> <div class="number number-1">1</div> <div class="number number-2">2</div> <div class="number number-3">3</div> <div class="number number-4">4</div> <div class="number number-5">5</div> <div class="number number-6">6</div> <div class="number number-7">7</div> <div class="number number-8">8</div> <div class="number number-9">9</div> <div class="number number-10">10</div> <div class="number number-11">11</div> <div class="number number-12">12</div> </div> </body> </html> ``` 上面的代码实现了一个简单的手绘时钟,包括时、分、秒针、中心点和12个数字。每个数字都是用 `<div>` 元素实现的,通过设置 `transform` 属性来控制每个数字的位置。时、分、秒针也是用 `<div>` 元素实现的,通过设置 `transform` 和 `transform-origin` 属性来控制它们的旋转和位置。 ### 回答2: HTML手绘时钟设计实现设计图主要需要考虑以下几个方面: 1. 页面布局:设计一个合适的页面布局,包括时钟的显示区域、时钟的指针、时间显示等组件的位置和大小。可以使用HTML的div元素进行页面布局设置。 2. 时钟的样式:可以利用CSS样式来设置时钟的外观,包括时钟的边框、背景色、指针的颜色等。可以为整个页面设置一个时钟的主题样式,以增加视觉上的统一感。 3. 时间的获取与更新:使用JavaScript来获取当前的系统时间,并动态更新时钟的显示。可以使用setInterval函数每秒刷新一次时间,然后将获取到的时间显示在时钟的相应位置上。 4. 指针的转动:根据获取到的时间,计算时钟指针的旋转角度,并使用CSS的transform属性来设置指针的旋转效果。可以使用transition属性来添加过渡动画,使指针转动更加平滑。 5. 可交互性:可以为时钟添加一些鼠标事件,增加时钟的交互性。例如,可以实现点击指针时切换指针的颜色、点击时钟时显示当前时间等。 6. 响应式设计:考虑到不同设备和屏幕尺寸的适配,可以使用CSS的媒体查询来设置不同屏幕尺寸下时钟的布局和样式。 设计图的实现可以通过使用HTMLCSS进行静态页面的设计,然后结合JavaScript实现动态的效果和交互。可以利用HTML5canvas元素来绘制时钟的外观,然后使用JavaScript来操作和更新时钟的显示。同时,通过合理的CSS样式和布局设置,可以使时钟在不同设备和屏幕上呈现出良好的响应式效果。 ### 回答3: HTML手绘时钟设计实现设计图需要运用HTMLCSSJavaScript技术来完成。以下是我给出的一个简单的设计实现示例: 首先,我们需要使用HTML创建一个基本的页面结构。在<body>标签中,创建一个<div>元素,并为其添加一个特定的class名称,比如"clock"。然后在这个<div>元素中,我们可以使用<h1>元素来添加一个标题,比如"Hand-drawn Clock"。 接下来,我们需要为时钟的表盘创建一个圆形的容器。我们可以使用CSS来为这个容器添加样式,比如设置宽度和高度为300px,并将颜色设置为白色。然后,使用border-radius属性将边界设置为圆形。在这个圆形容器的中心,我们可以使用CSS的flexbox属性来将时钟的表盘放置在容器中心。 然后,我们需要使用CSS来创建时钟的刻度。我们可以使用伪元素(::before和::after)来添加刻度线的样式。使用绝对定位,将刻度线放置在时钟的表盘上。通过旋转这些刻度线,使它们围绕表盘均匀分布。 接下来,我们需要使用JavaScript实现时钟的指针移动。首先,在JavaScript中获取到HTML中的容器元素和指针元素。然后,使用JavaScript中的Date对象来获取当前的时间。根据当前时间,计算时针、分针和秒针指示的角度,并将其应用到相应的指针元素中。使用JavaScript的setTimeout函数每秒钟调用一次这个函数,实现指针的动态移动。 最后,我们还可以通过CSSJavaScript来添加一些额外的样式和交互效果,比如给指针元素添加动画效果,让指针平滑地移动。 这就是HTML手绘时钟设计实现设计图。通过HTMLCSSJavaScript的配合使用,我们可以创建一个简单而功能完整的手绘时钟。当然,这只是一个基础的示例,根据实际需求,我们可以进行更多的设计和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都不会…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值