时钟特效程序
做了个特效小程序,在过程中发现自己在学过的知识中有掌握的不够牢固的,今天在这里复习一下:
一、三目运算符中能否使用{}吗?
不可以,三目运算符的语法:条件 ? 结果1 : 结果2;
结果不可以用语句代替
二、canvas可以嵌套吗?
不可以,
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 #can1{background:#000;} 8 #can2{background:red;} 9 </style> 10 </head> 11 <body> 12 <canvas id="can1"> 13 <canvas id="can2"></canvas> 14 </canvas> 15 <script> 16 var can1=document.getElementById('can1'); 17 var can2=document.getElementById('can2'); 18 var con1=can1.getContext('2d'); 19 var con2=can2.getContext('2d'); 20 </script> 21 </body> 22 </html>
这个代码的显示结果为
并没有显示出颜色为红的画布,所以在需要画布的更新时尽量使用局部更新
三、jCanvaScript.js的使用
jCanvaScript.js是一个方便用户进行canvas绘图的插件,使用时将该js文件链接进来即可
使用方法:
1 var can1=document.getElementById('can1'); 2 var con1=can1.getContext('2d'); 3 jc.start('can1',true); 4 jc.circle(10,10,10,'#ff0000',1);
在(10,10)处绘制一个半径为10px的红色的圆。
其他详细使用信息:
<script type="text/javascript" src="jCancaScript.1.5.18.min.js"></script> <script> var oInput=document.getElmentById("input1"); var oc=document.getElmentById("c1"); var ogc=oc.getContext("2d"); //开始 jc.start("c1");//代表:只是指定id为c1的画布 只绘制了一次 ,只能进行一次操作 //jc.start("c1",true);//第二个参数代表可以重绘,可以进行多个操作 //jc.rect(100,100,50,50);带边框的正方形 默认 //jc.rect(100,100,50,50,1);带边框的正方形 bool为1或者true时 : 整个正方形是填充的 //jc.rect(100,100,50,50,"#ff0000",1);填充色是红色 //下面画个圆形 jc.circle(100,100,50,"#ff0000",1); 接下来 给这个圆形加个点击事件【以下代码运行无效 木有点击事件产生 原因:红色代码】 jc.circle(100,100,50,"#ff0000",1).click(function(){ alert(123); }); //在画布中间对画出的圆进行任意方向的拖拽 jc.circle(100,100,50,"#ff0000",1).draggable(); //在画布外面添加一个按钮点击改变图形的颜色,请看蓝色代码 jc.circle(100,100,50,"#ff0000",1).id("c1");//id是针对单个,name可以针对一组 //结束 jc.start("c1"); oInput.onclick=function(){ jc("#c1").color("#ffff00"); //jc("#c1").color("#ffff00").animate({x:200,y:200,radius:5},2000);//从坐标为100,100半径为50的 //大圆慢慢匀速缩小到坐标为200,200半径为5的小圆,总共耗时2秒. } </script> <canvas id="c1" style="width:400px;height:400px;background:blue"></canvas> <input type="button" value="点击" id="input1" />
四、js中判断获取的时间是否相等 :
var date1=new date(),date2=new date();
date1.getTime()==date2.getTime()?
五、删除数组中x开始的n的字符
arry.splice(x,n);
其他数组操作方法:
1、数组元素的添加 arrayObj. push([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组结尾,并返回数组新长度 arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);// 将一个或多个新元素添加到数组开始,数组中的元素自动后移,返回数组新长度 arrayObj.splice(insertPos,0,[item1[, item2[, . . . [,itemN]]]]);//将一个或多个新元素插入到数组的指定位置,插入位置的元素自动后移,返回""。 2、数组元素的删除 arrayObj.pop(); //移除最后一个元素并返回该元素值 arrayObj.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移 arrayObj.splice(deletePos,deleteCount); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返回所移除的元素 3、数组的截取和合并 arrayObj.slice(start, [end]); //以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制 start 之后的所有元素 arrayObj.concat([item1[, item2[, . . . [,itemN]]]]); //将多个数组(也可以是字符串,或者是数组和字符串的混合)连接为一个数组,返回连接好的新的数组 4、数组的拷贝 arrayObj.slice(0); //返回数组的拷贝数组,注意是一个新的数组,不是指向 arrayObj.concat(); //返回数组的拷贝数组,注意是一个新的数组,不是指向 5、数组元素的排序 arrayObj.reverse(); //反转元素(最前的排到最后、最后的排到最前),返回数组地址 arrayObj.sort(); //对数组元素排序,返回数组地址 6、数组元素的字符串化 arrayObj.join(separator); //返回字符串,这个字符串将数组的每一个元素值连接在一起,中间用 separator 隔开。
顺便再复习一下字符串操作方法:
concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串。 indexOf() – 返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回 -1 。 charAt() – 返回指定位置的字符。 lastIndexOf() – 返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回 -1 。 match() – 检查一个字符串是否匹配一个正则表达式。 substring() – 返回字符串的一个子串。传入参数是起始位置和结束位置。 replace() – 用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。 search() – 执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回 -1 。 slice() – 提取字符串的一部分,并返回一个新字符串。 split() – 通过将字符串划分成子串,将一个字符串做成一个字符串数组。 length – 返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。 toLowerCase() – 将整个字符串转成小写字母。 toUpperCase() – 将整个字符串转成大写字母。
另外,通过这次写的这个小代码,我总结了一下自己思考问题上的不足之处:
之前写代码时总是很乱,不会将要实现的目标模块化,导致自己总是在写过的代码上添添删删,导致这个部分变得臃肿且不清晰,然后代码就越写越乱,要改的地方也变得越来越多,参考了别人的代码后,我总结一下今后应该怎样解决比较复杂的问题:
1.仔细分析问题,将问题模块化
2.针对每一个模块写对应的函数,每个函数完成一个特定功能
3.学会多角度思考问题,切莫钻进一个牛角尖,其实换个思路解决问题说不定会更简单
以下是程序源代码:
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 canvas{background:#fff;margin-top:50px;margin-left:50px;} 8 </style> 9 </head> 10 <body> 11 <canvas id="canvas"></canvas> 12 <script src="jCanvaScript.1.5.18.js"></script> 13 <script> 14 var RADIUS=8; //定义圆的半径 15 var timer; //定义计时器 16 var oTime; //定义时间变量 17 var nowTimer; //获取现在时间的时、分、秒 18 var lastTimer; //获取上次时间的时、分、秒 19 var nowTime=new Date();; //现在时间 20 var lastTime; //上次时间 21 var addBalls=[]; //添加掉落的小球 22 23 var canvas=document.getElementsByTagName('canvas')[0], 24 content=canvas.getContext('2d'); 25 26 var arry = [ 27 [ 28 [0, 0, 1, 1, 1, 0, 0], 29 [0, 1, 1, 0, 1, 1, 0], 30 [1, 1, 0, 0, 0, 1, 1], 31 [1, 1, 0, 0, 0, 1, 1], 32 [1, 1, 0, 0, 0, 1, 1], 33 [1, 1, 0, 0, 0, 1, 1], 34 [1, 1, 0, 0, 0, 1, 1], 35 [1, 1, 0, 0, 0, 1, 1], 36 [0, 1, 1, 0, 1, 1, 0], 37 [0, 0, 1, 1, 1, 0, 0] 38 ], //0 39 [ 40 [0, 0, 0, 1, 1, 0, 0], 41 [0, 1, 1, 1, 1, 0, 0], 42 [0, 0, 0, 1, 1, 0, 0], 43 [0, 0, 0, 1, 1, 0, 0], 44 [0, 0, 0, 1, 1, 0, 0], 45 [0, 0, 0, 1, 1, 0, 0], 46 [0, 0, 0, 1, 1, 0, 0], 47 [0, 0, 0, 1, 1, 0, 0], 48 [0, 0, 0, 1, 1, 0, 0], 49 [1, 1, 1, 1, 1, 1, 1] 50 ], //1 51 [ 52 [0, 1, 1, 1, 1, 1, 0], 53 [1, 1, 0, 0, 0, 1, 1], 54 [0, 0, 0, 0, 0, 1, 1], 55 [0, 0, 0, 0, 1, 1, 0], 56 [0, 0, 0, 1, 1, 0, 0], 57 [0, 0, 1, 1, 0, 0, 0], 58 [0, 1, 1, 0, 0, 0, 0], 59 [1, 1, 0, 0, 0, 0, 0], 60 [1, 1, 0, 0, 0, 1, 1], 61 [1, 1, 1, 1, 1, 1, 1] 62 ], //2 63 [ 64 [1, 1, 1, 1, 1, 1, 1], 65 [0, 0, 0, 0, 0, 1, 1], 66 [0, 0, 0, 0, 1, 1, 0], 67 [0, 0, 0, 1, 1, 0, 0], 68 [0, 0, 1, 1, 1, 0, 0], 69 [0, 0, 0, 0, 1, 1, 0], 70 [0, 0, 0, 0, 0, 1, 1], 71 [0, 0, 0, 0, 0, 1, 1], 72 [1, 1, 0, 0, 0, 1, 1], 73 [0, 1, 1, 1, 1, 1, 0] 74 ], //3 75 [ 76 [0, 0, 0, 0, 1, 1, 0], 77 [0, 0, 0, 1, 1, 1, 0], 78 [0, 0, 1, 1, 1, 1, 0], 79 [0, 1, 1, 0, 1, 1, 0], 80 [1, 1, 0, 0, 1, 1, 0], 81 [1, 1, 1, 1, 1, 1, 1], 82 [0, 0, 0, 0, 1, 1, 0], 83 [0, 0, 0, 0, 1, 1, 0], 84 [0, 0, 0, 0, 1, 1, 0], 85 [0, 0, 0, 1, 1, 1, 1] 86 ], //4 87 [ 88 [1, 1, 1, 1, 1, 1, 1], 89 [1, 1, 0, 0, 0, 0, 0], 90 [1, 1, 0, 0, 0, 0, 0], 91 [1, 1, 1, 1, 1, 1, 0], 92 [0, 0, 0, 0, 0, 1, 1], 93 [0, 0, 0, 0, 0, 1, 1], 94 [0, 0, 0, 0, 0, 1, 1], 95 [0, 0, 0, 0, 0, 1, 1], 96 [1, 1, 0, 0, 0, 1, 1], 97 [0, 1, 1, 1, 1, 1, 0] 98 ], //5 99 [ 100 [0, 0, 0, 0, 1, 1, 0], 101 [0, 0, 1, 1, 0, 0, 0], 102 [0, 1, 1, 0, 0, 0, 0], 103 [1, 1, 0, 0, 0, 0, 0], 104 [1, 1, 0, 1, 1, 1, 0], 105 [1, 1, 0, 0, 0, 1, 1], 106 [1, 1, 0, 0, 0, 1, 1], 107 [1, 1, 0, 0, 0, 1, 1], 108 [1, 1, 0, 0, 0, 1, 1], 109 [0, 1, 1, 1, 1, 1, 0] 110 ], //6 111 [ 112 [1, 1, 1, 1, 1, 1, 1], 113 [1, 1, 0, 0, 0, 1, 1], 114 [0, 0, 0, 0, 1, 1, 0], 115 [0, 0, 0, 0, 1, 1, 0], 116 [0, 0, 0, 1, 1, 0, 0], 117 [0, 0, 0, 1, 1, 0, 0], 118 [0, 0, 1, 1, 0, 0, 0], 119 [0, 0, 1, 1, 0, 0, 0], 120 [0, 0, 1, 1, 0, 0, 0], 121 [0, 0, 1, 1, 0, 0, 0] 122 ], //7 123 [ 124 [0, 1, 1, 1, 1, 1, 0], 125 [1, 1, 0, 0, 0, 1, 1], 126 [1, 1, 0, 0, 0, 1, 1], 127 [1, 1, 0, 0, 0, 1, 1], 128 [0, 1, 1, 1, 1, 1, 0], 129 [1, 1, 0, 0, 0, 1, 1], 130 [1, 1, 0, 0, 0, 1, 1], 131 [1, 1, 0, 0, 0, 1, 1], 132 [1, 1, 0, 0, 0, 1, 1], 133 [0, 1, 1, 1, 1, 1, 0] 134 ], //8 135 [ 136 [0, 1, 1, 1, 1, 1, 0], 137 [1, 1, 0, 0, 0, 1, 1], 138 [1, 1, 0, 0, 0, 1, 1], 139 [1, 1, 0, 0, 0, 1, 1], 140 [0, 1, 1, 1, 0, 1, 1], 141 [0, 0, 0, 0, 0, 1, 1], 142 [0, 0, 0, 0, 0, 1, 1], 143 [0, 0, 0, 0, 1, 1, 0], 144 [0, 0, 0, 1, 1, 0, 0], 145 [0, 1, 1, 0, 0, 0, 0] 146 ], //9 147 [ 148 [0, 0, 0, 0], 149 [0, 0, 0, 0], 150 [0, 1, 1, 0], 151 [0, 1, 1, 0], 152 [0, 0, 0, 0], 153 [0, 0, 0, 0], 154 [0, 1, 1, 0], 155 [0, 1, 1, 0], 156 [0, 0, 0, 0], 157 [0, 0, 0, 0] 158 ] //: 159 ]; //0~9的显示数组 160 var color=['#E98F4E','#E93C59','#8948E9','#6DBFE9','#25E9AF','#6EE975','#9315E9','#E9C71C','#E98893']; //掉落小球的颜色 161 162 163 canvas.width=1000; //在js里设置canvas的宽和高,在style里设置会拉伸画布,即画布中的内容也拉伸 164 canvas.height=350; 165 /*主函数*/ 166 (function(){ 167 timer=setInterval(function(){ 168 updateTime(); 169 ballTime(); //调用ballTime函数画出时间,传递参数是updateTime函数获取到的当前时间 170 update(); 171 },50); 172 })(); 173 174 function updateTime(){ 175 lastTime=nowTime; //获取50ms以前的时间 176 nowTime = new Date(); //获取当前时间 177 lastTimer=[parseInt(lastTime.getHours()/10), 178 parseInt(lastTime.getHours()%10), 179 parseInt(lastTime.getMinutes()/10), 180 parseInt(lastTime.getMinutes()%10), 181 parseInt(lastTime.getSeconds()/10), 182 parseInt(lastTime.getSeconds()%10)]; 183 184 nowTimer=[parseInt(nowTime.getHours()/10), 185 parseInt(nowTime.getHours()%10), 186 parseInt(nowTime.getMinutes()/10), 187 parseInt(nowTime.getMinutes()%10), 188 parseInt(nowTime.getSeconds()/10), 189 parseInt(nowTime.getSeconds()%10)]; 190 } 191 192 function ballTime(){ 193 jc.clear('canvas'); //清除上次绘制内容 194 for(var i=0;i<6;i++){ 195 var space=(i==0||i==2||i==4)?30:0; //时与分、分与秒之间的间隔 196 for (var y = 0; y < 10; y++) { 197 for (var x = 0; x < 7; x++) { 198 jc.start('canvas', true); 199 if (arry[nowTimer[i]][y][x] == 1) { 200 jc.circle(i * 150 + x * 2*RADIUS + RADIUS + space, y * 2*RADIUS + RADIUS + 20, RADIUS, '#008', 1).id('canvas'); 201 } else { 202 jc.circle(i * 150 + x * 2*RADIUS + RADIUS + space, y * 2*RADIUS + RADIUS + 20, RADIUS, '#fff', 1).id('canvas'); 203 } 204 } 205 } 206 } 207 } 208 209 function update(){ //更新时间,判断是否有新的掉落小球生成 210 for(var index=0;index<nowTimer.length;index++){ 211 if(lastTimer[index]!=nowTimer[index]){ 212 addBall(index); //将新的掉落小球添加进数组中 213 } 214 } 215 updateBalls(); //在画布上画出 216 } 217 218 function addBall(index){ 219 var space=(index==1||index==4)?30:0; //时与分、分与秒之间的间隔 220 for (var y = 0; y < 10; y++) { 221 for (var x = 0; x < 7; x++) { 222 jc.start('canvas', true); 223 if (arry[nowTimer[index]][y][x] == 1) { 224 var balls={ //添加掉落小球的属性 225 x:index * 150 + x * 2*RADIUS + RADIUS + space, //掉落小球的位置 226 y:y * 2*RADIUS + RADIUS, 227 color:color[Math.floor(Math.random()*8+1)], 228 speedX:Math.floor(Math.random()*12-6), //初始横向速度 229 speedY:0, 230 thisTime:index 231 }; 232 addBalls.push(balls); 233 } 234 } 235 } 236 } 237 /*在画布上绘制掉落小球*/ 238 function updateBalls(){ 239 for(var index=0;index<addBalls.length;index++){ 240 jc.start('canvas',true); 241 if((addBalls[index].y+2*RADIUS+50)<canvas.height){ 242 jc.circle(addBalls[index].x+=addBalls[index].speedX,addBalls[index].y+=addBalls[index].speedY,RADIUS,addBalls[index].color,1).id('canvas'); 243 addBalls[index].speedY+=2; //从高处掉落的速度 244 }else{ 245 addBalls[index].speedY=8-addBalls[index].speedY; //掉落到地上后反弹起来的速度 246 if(addBalls[index].speedY>0||addBalls[index].x>canvas.width||addBalls[index]<0||addBalls[index].speedY==0){ 247 addBalls.splice(index,1); //如果某个掉落小球的横向坐标超出画布范围或者速度小于8则删除该小球 248 } 249 if(addBalls.length>200){ 250 addBalls.splice(0,100); 251 } 252 jc.circle(addBalls[index].x+=addBalls[index].speedX,addBalls[index].y+=addBalls[index].speedY,RADIUS,addBalls[index].color,1).id('canvas'); 253 } 254 } 255 } 256 </script> 257 </body> 258 </html>