日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript Canvas繪制動態線框效果

瀏覽:208日期:2023-12-02 10:21:32

本文實例為大家分享了JavaScript Canvas繪制動態線框效果的具體代碼,供大家參考,具體內容如下

本周項目,移動端頁面開發,要求豐富的動效,主要技術實現 Canvas ;其中繪制動態線框,走了點彎路,所謂的彎路是邏輯問題,非技術實現方式。

一、涉及技術點,具體如下:

1.html 中引入canvas 標簽,設置寬高;

<canvas width=xx height=xx>您的瀏覽器不支持canvas,請更換版本</canvas>

2.js中 定義ctx–beginPath–moveTo-lineTo-stroke–closePath;

var ctx=canvas.getContext(’2d’);ctx.beginPath();ctx.strokeStyle=#f00;ctx.lineWidth=1;ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.lineTo(..)..ctx.stroke();ctx.closePath();

繪制靜態折線,比較簡單,直接從moveTo初始節點開始lineTo到每一個節點,項目需求是繪制線條的動畫效果,那實現方式就是在每一條直線段間,通過定時器多次重回moveTo起點到lineTo直線段上有序增量的點位,代碼如下:

ctx.moveTo(x1,y3);xm1+=fre1;ym1+=fre2;ctx.lineTo(xm1,ym1)二、邏輯彎路及解決

1、邏輯彎路

項目是移動端,考慮適配問題,在繪制節點的時候,開始使用的是以百分比與獲取屏幕后的寬高的乘積做為判斷moveTo更改的true or false; 鑒于乘積的非整數,在if語句里x,y的增量變化 只能使用++;而且是px單位的增量,所以導致在繪制時速度很慢,即便是setInterval 的時間個位毫秒

var lg01=ctx.createLinearGradient(0,.12*winH,0,.5*winH);lg01.addColorStop(0,’#6DEAFF’);lg01.addColorStop(.5,’#78C7FF’);lg01.addColorStop(1,’#4A84FF’);var fre=4;function drawUpBox(){ ctx.beginPath(); ctx.strokeStyle=lg01; ctx.lineWidth=0.05*rem; if(xm1>x2&&ym1==y1){ctx.clearRect(x2,y1-0.025*rem,x3-x2,0.05*rem);ctx.moveTo(x3,y1);xm1-=fre;ctx.lineTo(xm1,ym1) }else if(xm1>x1&&ym1<=y2){ctx.moveTo(x2,y1);xm1-=fre;ym1+=fre;ctx.lineTo(xm1,ym1) }else if(xm1<=x1&&ym1<y3){ctx.clearRect(x1-0.025*rem,y2,0.05*rem,y3-y2)ctx.moveTo(x1,y2);ym1+=fre;ctx.lineTo(xm1,ym1) } else if(ym1<y4){ctx.moveTo(x1,y3);xm1+=fre;ym1+=fre;ctx.lineTo(xm1,ym1) }else if(xm1>=x2&&ym1>=y4){if(xm1<=winW/2){ ctx.clearRect(x1,y4-0.025*rem,winH/2-x1,0.05*rem); ctx.moveTo(x2,y4) xm1+=fre; ctx.lineTo(xm1,ym1)} } if(xm2<x5&&ym2==yd1){ctx.clearRect(x4,yd1-0.025*rem,x5-x4,0.05*rem);ctx.moveTo(x4,yd1);xm2+=fre;ctx.lineTo(xm2,ym2); }else if(xm2<x6&&ym1<=yd2){ctx.moveTo(x5,yd1);xm2+=fre;ym2+=fre;ctx.lineTo(xm2,ym2) }else if(xm2<=x6&&ym2<yd3){ctx.clearRect(x6-0.025*rem,yd2,0.05*rem,yd3-yd2)ctx.moveTo(x6,yd2);ym2+=fre;ctx.lineTo(xm2,ym2) }else if(ym2<yd4){ctx.moveTo(x6,yd3);xm2-=fre;ym2+=fre;ctx.lineTo(xm2,ym2) }else if(xm2<=x5&&ym2>=yd4){if(xm2>=winW/2){ ctx.clearRect(winW/2,yd4-0.025*rem,x6-winW/2,0.05*rem); ctx.moveTo(x5,yd4) xm2-=fre; ctx.lineTo(xm2,ym2)}else{ drawOuterAndInnerLine(); clearInterval(timer01)} } ctx.stroke(); ctx.closePath()}

效果:

JavaScript Canvas繪制動態線框效果

如果更改fre增量的值,比如改為4,就會出現如下邊框不完整問題:

JavaScript Canvas繪制動態線框效果

2.解決方案:

在判斷語句中,橫向100等分,節點即為100以內整數值,增量也以此累加,moveTo 和 lineTo的時候 再換算成具體px; 通過百分值,可以提高單位時間的繪制效率,此時只需控制增量每次++;再配合定時器 的周期,很容易實現不同頻率的線條繪制;另外對節點封裝于一個對象內,可以快速調整節點繪制不同尺寸 類型的動態線框圖:

canvas3.width=winW;canvas3.height=.15*winH;//$(’#canvas3’).css(’background’,’#eee’);var node3X={x1:20,x2:22,x3:36,x4:64,x5:78,x6:80};var node3Y={y1:2,yh:20};var xd=node3X.x2-node3X.x1,xml3=node3X.x3,xmr3=node3X.x4,yml3=ymr3= 0;//var winWB=winW/100,winHB=winH/100,winCHB=winHB/2;node3Y.y1Ready=node3Y.y1*winCHB;node3Y.y2Ready=node3Y.y1*winCHB+(node3X.x2-node3X.x1)*winWB;node3Y.y3Ready=node3Y.y2Ready+node3Y.yh*winCHB;node3Y.y4Ready=node3Y.y3Ready+(node3X.x2-node3X.x1)*winWB;var yml3Ready=node3Y.y1Ready;var ymr3Ready=node3Y.y1Ready;var ctx3=canvas3.getContext('2d');var lg03=ctx3.createLinearGradient(0,0,0,canvas3.height);lg03.addColorStop(0,’#6DEAFF’);lg03.addColorStop(.5,’#78C7FF’);lg03.addColorStop(1,’#4A84FF’);var mainBoxTimer3=setInterval(drawMainBox3,20);function drawMainBox3(){ drawPath(ctx3,node3X.x4*winWB,node3Y.y1Ready,4,winWB,lg03) drawPath(ctx3,node3X.x3*winWB,node3Y.y1Ready,4,winWB,lg03) ctx3.beginPath(); ctx3.strokeStyle=lg03; ctx3.lineWidth=.1*rem; //繪制左半部分 if(xml3>node3X.x2&&yml3==0){//ctx3.clearRect(0,0,winW,winH/2);xml3--;ctx3.moveTo(node3X.x3*winWB,node3Y.y1*winCHB)ctx3.lineTo(xml3*winWB,node3Y.y1*winCHB); }else if(xml3>node3X.x1&&yml3Ready<node3Y.y2Ready){xml3--;yml3Ready=node3Y.y1*winCHB+(node3X.x2-xml3)*winWB;ctx3.moveTo(node3X.x2*winWB,node3Y.y1*winCHB)ctx3.lineTo(xml3*winWB,yml3Ready) }else if(xml3==node3X.x1&&yml3<node3Y.yh){yml3++;ctx3.moveTo(node3X.x1*winWB,node3Y.y2Ready);ctx3.lineTo(node3X.x1*winWB,node3Y.y2Ready+yml3*winCHB); }else if(yml3==node3Y.yh&&xml3<node3X.x2){xml3++;ctx3.moveTo(node3X.x1*winWB,node3Y.y3Ready);ctx3.lineTo(xml3*winWB,node3Y.y3Ready+(xml3-node3X.x1)*winWB) }else if(xml3>=node3X.x2&&xml3<50){xml3++;ctx3.moveTo(node3X.x2*winWB,node3Y.y4Ready);ctx3.lineTo(xml3*winWB,node3Y.y4Ready); } //繪制右半部分 if(xmr3<node3X.x5&&ymr3==0){xmr3++;ctx3.moveTo(node3X.x4*winWB,node3Y.y1*winCHB)ctx3.lineTo(xmr3*winWB,node3Y.y1*winCHB); }else if(xmr3<node3X.x6&&ymr3Ready<node3Y.y2Ready){xmr3++;ymr3Ready=node3Y.y1*winCHB+(xmr3-node3X.x5)*winWB;ctx3.moveTo(node3X.x5*winWB,node3Y.y1*winCHB)ctx3.lineTo(xmr3*winWB,ymr3Ready) }else if(xmr3==node3X.x6&&ymr3<node3Y.yh){ymr3++;ctx3.moveTo(node3X.x6*winWB,node3Y.y2Ready);ctx3.lineTo(node3X.x6*winWB,node3Y.y2Ready+ymr3*winCHB); }else if(ymr3==node3Y.yh&&xmr3>node3X.x5){xmr3--;ctx3.moveTo(node3X.x6*winWB,node3Y.y3Ready);ctx3.lineTo(xmr3*winWB,node3Y.y3Ready+(node3X.x6-xmr3)*winWB) }else if(xmr3<=node3X.x5&&xmr3>50){xmr3--;ctx3.moveTo(node3X.x5*winWB,node3Y.y4Ready);ctx3.lineTo(xmr3*winWB,node3Y.y4Ready); }else{ctx3.clearRect(0,0,canvas3.width,canvas3.height);ctx3.beginPath();ctx3.moveTo(node3X.x3*winWB,node3Y.y1Ready);ctx3.lineTo(node3X.x2*winWB,node3Y.y1Ready);ctx3.lineTo(node3X.x1*winWB,node3Y.y2Ready);ctx3.lineTo(node3X.x1*winWB,node3Y.y3Ready);ctx3.lineTo(node3X.x2*winWB,node3Y.y4Ready);ctx3.lineTo(node3X.x5*winWB,node3Y.y4Ready);ctx3.lineTo(node3X.x6*winWB,node3Y.y3Ready);ctx3.lineTo(node3X.x6*winWB,node3Y.y2Ready);ctx3.lineTo(node3X.x5*winWB,node3Y.y1Ready);ctx3.lineTo(node3X.x4*winWB,node3Y.y1Ready);clearInterval(mainBoxTimer3); } ctx3.stroke(); ctx3.closePath();}

技術實現是基礎,邏輯優化是提升,是質量和效率的提升。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品三区视频| 青青国产精品| 日本一区二区高清不卡| 国产日韩欧美三级| 国产麻豆一区二区三区精品视频| 97久久精品| 国产精品视频一区二区三区四蜜臂 | 亚洲综合国产| 亚洲一区二区三区四区五区午夜 | 国产精品二区影院| 精品久久久网| 一区二区精品伦理...| www.com.cn成人| 另类中文字幕国产精品| 日本精品不卡| 一区久久精品| 欧美精选视频一区二区| 欧美另类综合| 蜜桃91丨九色丨蝌蚪91桃色| 青草av.久久免费一区| 另类综合日韩欧美亚洲| 亚洲精品一级二级| 亚洲天堂免费| 国产精品最新自拍| 日韩国产网站| 一级成人国产| 久久久精品区| 国产尤物精品| 奇米狠狠一区二区三区| 精品一区二区三区亚洲| 99成人在线视频| 亚洲精品看片| 国产a亚洲精品| 国产亚洲福利| 免费在线观看一区| 欧美~级网站不卡| 日韩一区中文| 国产高清不卡| 中文字幕日本一区| 国产精品久久久久久久免费观看 | 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 日本高清不卡一区二区三区视频| 亚洲少妇一区| 国产精品自拍区| 亚洲香蕉网站| 国产欧美日韩综合一区在线播放| 日韩专区精品| 久久亚洲成人| 日韩高清在线不卡| 成人看片网站| 日本视频在线一区| 国产66精品| 蜜桃一区二区三区在线| 国产成人调教视频在线观看| 久久福利毛片| 亚洲综合电影| 日本va欧美va精品| 在线日韩电影| 免费一级欧美片在线观看网站| 偷拍欧美精品| 精品久久久亚洲| 亚洲综合中文| 日韩欧美另类一区二区| 日本中文字幕一区二区视频| 精品国产免费人成网站| 日韩免费精品| 久久国产精品成人免费观看的软件| 日本少妇精品亚洲第一区| 伊人精品一区| 久久只有精品| 日韩一区免费| 红桃视频国产一区| 成人台湾亚洲精品一区二区 | 夜夜嗨网站十八久久| 成人污污视频| 国产日韩亚洲| 喷白浆一区二区| 欧美日韩在线二区| 成人午夜毛片| 国产精品一页| 免费日韩视频| 久久精品1区| 丰满少妇一区| 欧美日韩一区二区三区四区在线观看| 亚洲精华国产欧美| 婷婷综合六月| 精品欠久久久中文字幕加勒比| 亚洲精品极品| 久久国产精品久久久久久电车 | 国产精品99视频| 国产日产高清欧美一区二区三区| 亚洲综合日本| 蜜桃精品在线| 国产精品视频一区二区三区综合| 午夜电影一区| 热久久久久久久| 亚洲欧美日韩在线观看a三区| 日韩精品一卡| 裤袜国产欧美精品一区| 久久超碰99| 国产毛片精品| 青草国产精品| 亚洲区欧美区| 欧美国产中文高清| 国产精品入口久久| 国产精品一区二区免费福利视频 | 奇米狠狠一区二区三区| 免费人成精品欧美精品| 精品欧美激情在线观看| 久久激情一区| 久久五月天小说| 欧美日韩国产免费观看视频| 久久夜夜操妹子| 久久精品国产亚洲aⅴ| 国产精品一区二区精品| 91欧美极品| 日韩av电影一区| 青青草国产成人99久久| 国产日韩亚洲欧美精品| 日本中文字幕视频一区| 亚洲人成毛片在线播放女女| 亚洲伊人影院| 亚洲一区二区三区久久久| 丝袜美腿高跟呻吟高潮一区| 亚洲欧美高清| 亚洲另类视频| 欧美日韩1区2区3区| 欧美一区二区三区久久精品| 国产日韩一区| 精品视频网站| 国产精品久久久久久久久久10秀| 97精品国产| 久久久夜夜夜| 午夜日韩福利| 久久成人亚洲| 日本中文字幕一区二区视频| 国产美女亚洲精品7777| 国语精品一区| 久久亚洲成人| 亚洲综合中文| 国产精品22p| 欧美日韩国产v| 欧美性感美女一区二区| 久久久影院免费| 国产精品2023| 丰满少妇一区| 中文不卡在线| 国产伦久视频在线观看| 午夜在线视频一区二区区别| 国产日韩三级| 美女少妇全过程你懂的久久| 日本精品另类| 亚洲a在线视频| 97久久超碰| 久久影院一区| 国产伦精品一区二区三区千人斩| 欧美日一区二区| 国产精品对白| 亚洲少妇在线| 97国产成人高清在线观看| 国产一区成人| 日韩不卡在线观看日韩不卡视频| 精品国产美女a久久9999| 亚洲午夜电影| 日韩毛片网站| 精品少妇一区| 国产毛片久久| 国产乱码精品一区二区三区四区| 日韩美女一区二区三区在线观看| 亚洲一级在线| 久久av免费| 亚洲成人免费| 国产精品亚洲片在线播放| 99久久www免费| 日欧美一区二区| 国产精品99在线观看| 视频在线在亚洲| 免费在线观看一区| 国产偷自视频区视频一区二区| 久久黄色影视| 99久久夜色精品国产亚洲1000部| 日韩欧美2区| 亚洲大片在线| 欧美精品1区| 9国产精品视频| 精品亚洲成人| 麻豆91精品| 精品久久中文| 亚洲精选久久| 午夜av成人| 国产精品久久久久久妇女 | 国产精品毛片aⅴ一区二区三区| 88xx成人免费观看视频库| 青青草精品视频| 国产一区二区中文| 国产精品久久久久久久久久妞妞 | 99精品一区| 久久不见久久见国语| 亚洲综合精品四区| 日本欧美国产|