网页如果有影像文档的元素,那么在运行之前,必须下载它。彭博的钟表,就需要从 http://static.oschina.net/uploads/space/2012/0712/125855_nnla_89964.png 下载表盘刻度影像,方可制成钟表。如果,这
http://static.oschina.nethttp://img.558idc.com/uploadfile/space/2012/0712/125855_nnla_89964.png
下载表盘刻度影像,方可制成钟表。如果,这个影像文档,一时得不到,这个钟表就无法正常显示。我有个提议:利用 HTML5 canvas的绘图功能,尽可能以“手工绘制”代替影像文档。
我的贡献:
1. 按照影像文档,“手工绘制”了表盘刻度。
2. 增添了变大、缩小的功能。
新手,望指点。
彭博 2012 年的时钟出处:
http://www.oschina.net/code/snippet_89964_11897
运行本代码见:
http://runjs.cn/detail/4umhjowy
1. [图片] clock.png
2. [文件] clock_ZhongGuanCun.html ~ 5KB 下载(6)
<html> <head> <meta charset="utf-8" /> <title>中关村钟表</title> <script> /* 根据 开源中国社区 彭博的作品 "http://www.oschina.net/code/snippet_89964_11897" 改进:用手工绘制表盘刻度, 增添变大、缩小功能。 日期:2016-05-26 */ var canvas, ctx, c, g; var clockRadius =250; function locateCircle(){ canvas = document.getElementById('canvas'); ctx = canvas.getContext('2d'); ctx.translate(clockRadius,clockRadius); c=document.getElementById("myCanvas"); g=c.getContext("2d"); g.translate(clockRadius,clockRadius); } function writting(){ document.write("Hello World!"); } function clockSmaller(){ clockRadius--; } function clockBigger(){ clockRadius++; } function drawScene() { //获取即时时间 var date = new Date(); var hours = date.getHours(); var minute = date.getMinutes(); var seconds = date.getSeconds(); hours = hours > 12 ? hours - 12 : hours; var hour = hours + minute / 60; // 清频 ctx.clearRect(-clockRadius,-clockRadius ,2*clockRadius ,2*clockRadius); ctx.beginPath(); ctx.font= 36*clockRadius/250 + 'px Arial'; ctx.fillStyle = '#000'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; for (var n = 1; n <= 12; n++) { var theta = (n - 3) * (Math.PI * 2) / 12; var x = clockRadius * 0.7 * Math.cos(theta); var y = clockRadius * 0.7 * Math.sin(theta); ctx.fillText(n, x, y); } // 画时针 ctx.save(); var theta = (hour - 3) * 2 * Math.PI / 12; ctx.rotate(theta); ctx.beginPath(); ctx.moveTo(-clockRadius*0.06, -clockRadius*0.02); ctx.lineTo(-clockRadius*0.06, clockRadius*0.02); ctx.lineTo(clockRadius * 0.5, clockRadius*0.01); ctx.lineTo(clockRadius * 0.5, -clockRadius*0.01); ctx.fill(); ctx.restore(); // 也可以用 ctx.rotate(-theta); // 画分针 ctx.save(); var theta = (minute - 15) * 2 * Math.PI / 60; ctx.rotate(theta); ctx.beginPath(); ctx.moveTo(-clockRadius*0.06, -clockRadius*0.016); ctx.lineTo(-clockRadius*0.06, clockRadius*0.016); ctx.lineTo(clockRadius * 0.8, 1); ctx.lineTo(clockRadius * 0.8, -1); ctx.fillStyle="orange"; ctx.fill(); ctx.restore(); // 也可以用ctx.rotate(-theta); // 画秒针 ctx.save(); var theta = (seconds - 15) * 2 * Math.PI / 60; ctx.rotate(theta); ctx.beginPath(); ctx.moveTo(-clockRadius*0.06, -clockRadius*0.012); ctx.lineTo(-clockRadius*0.06, clockRadius*0.012); ctx.lineTo(clockRadius * 0.9, 1); ctx.lineTo(clockRadius * 0.9, -1); ctx.fillStyle = '#0f0'; ctx.fill(); ctx.restore(); // 也可以用 ctx.rotate(-theta); face(); } function initialization(){ locateCircle(); setInterval('drawScene()', 1000); } function face(){ g.save(); g.clearRect(-clockRadius,-clockRadius ,2*clockRadius ,2*clockRadius); g.font= clockRadius/6 + "px 楷体"; // 创建梯度背景 var gradient=g.createLinearGradient(0,0,canvas.width,0); gradient.addColorStop("0","magenta"); gradient.addColorStop("0.5","blue"); gradient.addColorStop("1.0","red"); g.fillStyle=gradient; //设置创建好的梯度背景 g.fillText("中关村",-clockRadius/4,clockRadius/3); g.fillStyle="green"; //用绿色填充表盘刻度 for(var i=0;i<60;i++){ //画表盘刻度 if (i%5==0){ // 画整点刻度 g.beginPath(); g.moveTo(clockRadius * 0.77, -clockRadius/48); g.lineTo(clockRadius * 0.96, -clockRadius/48); g.lineTo(clockRadius * 0.96, clockRadius/48); g.lineTo(clockRadius * 0.77, clockRadius/48); g.fill(); } else{ // 画整点以外的分钟刻度 g.beginPath(); g.arc(clockRadius*0.862,0,clockRadius*0.024,0,2*Math.PI); g.fill(); } g.rotate(Math.PI/30.0); // 旋转一分钟的度数:6 度 } g.restore(); } </script> <style> #myCanvas{ z-index:2; position:absolute; left:0px; top:0px; border:solid 7px #0F9; } #canvas{ z-index:3; } #clocks{ position:absolute; left:0px; top:0px; } #controlPanel{ z-index=3; position:absolute; left:0px; top:514px; width:200px; } </style> </head> <body onLoad="initialization()" > <canvas id="myCanvas" width="500" height="500" > <p>Your browserdoes not support the canvas element!</p ></canvas> <div class="clocks"> <canvas id="canvas" width="500" height="500"></canvas> </div> <div id="controlPanel"> <input type ="button" value="缩小" onClick="clockSmaller()" /> <input type="button" value="变大" onClick="clockBigger()" /> </div> </body> </html>