国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

HTML5 canvas實現雪花飄落特效

2020-03-24 17:31:27
字體:
來源:轉載
供稿:網友
看到網上很多展示html5雪花飛動的效果,確實非常引人入勝,我相信大家也跟我一樣看著心動的同時,也很好奇,想研究下代碼如何實現;雖然很多地方也能下載這些源碼,不過也不知道別人制作此類動畫時的思路及難點分析。我這幾天剛好學習了一下,也趁著此刻有時間從需求分析、知識點、程序編寫一步步給大家解剖下,要是在各位關公面前耍大刀了,可別見笑喲。最終效果圖如下:圖1一、需求分析1、圓形雪花本示例中雪花形狀使用圓形2、雪花數量固定根據圖1仔細觀察白色雪花數量,飄落過程中,整張圖的雪花數量應該是固定的,這個需求是需要通過我們觀察分析所得。這與我們現實生活中看到一幅雪花滿天飛的場景是一致的。3、雪花大小不一致每朵雪花它們大小各有不同,也就意味著雪花的半徑是隨機的。這與我們現實生活中看到一幅雪花滿天飛的場景也是一致的。4、雪花位置在移動雪花飄落,自然它們的位置也在移動。二、知識點1、使用Html5 Canvas+JavaScript畫圓 構成圓形雪花在Html5中,需要使用Canvas同時借助JavaScript畫圓,以構成圓形雪花 arc(x,y,r,start,stop);2、隨機數 產生不同半徑、坐標的圓形雪花本示例中,網頁第一次加載時,需要生成一定數量的不同半徑及位置的雪花,故半徑、坐標為隨機數;雪花在飄落過程中,其半徑不變,坐標在一定幅度內變化,故此時坐標也為隨機數 Math.random()三、程序編寫1、準備工作放一個畫布canvas,并且設置整個body背景色為黑色HTML代碼:XML/HTML Code復制內容到剪貼板
注意:canvas默認是有一個初始化高度和寬度的,所以不用去糾結2、畫布滿屏顯示JavaScript代碼如下:JavaScript Code復制內容到剪貼板
//獲取mycanvas畫布 varcan=document.getElementById( mycanvas ); varctx=can.getContext( 2d ); //畫布寬度 varwid=window.innerWidth; //畫布高度 varhei=window.innerHeight; can.width=wid; can.height=hei;
3、初始化生成固定數量的雪花根據我們上述需求分析及知識點解讀,首先雪花的數量是固定的,所以我們需要定義一個變量var snow = 100;這里假設雪花數量為100,;生成雪花的時候,每個雪花半徑、位置都不同,我們把每個雪花當做一個對象,那么這個對象的屬性就包含:半徑、坐標(X、Y),那么一個雪花對象可以寫成var snowOject={x:1,y:10,r:5},這里就代表一個坐標為(1,10)半徑為5的圓形雪花;本示例中由于半徑和坐標都為隨機數,故使用Math.random()分別為100個雪花生成半徑、坐標(X、Y);那我們這里是100個雪花,所以為了方便后面操作,就用一個數組保存這100個雪花對象。JavaScript代碼如下:JavaScript Code復制內容到剪貼板
//雪花坐標、半徑 vararr=[];//保存各圓坐標及半徑 for(vari=0;i snow;i++){ arr.push({ x:Math.random()*wid, y:Math.random()*hei, r:Math.random()*10+1 }) }

4、繪制雪花上面我們已經將100個雪花半徑、坐標(X、Y)生成,下面就是循環使用canvas畫出雪花了(這里就是畫圓),這里定義一個函數JavaScript代碼如下:JavaScript Code復制內容到剪貼板
functionDrawSnow(){ ctx.fill >然后調用 DrawSnow()函數,效果如下:可以嘗試多次刷新網頁看是否會生成不同大小、位置的雪花(正常情況下是可以的),做到這里就已經接近最終效果了注意:由于這里需要繪制100個圓,所以每當畫一個圓時重新定義繪制開始坐標即:ctx.moveTo(p.x,p.y);否則會出現異樣效果,不信可以試試呀5、雪花飄動上面我們已經畫出100個雪花,可惜只能依靠刷新網頁才能看到變化效果,但是我們需要實現的是雪花不停的移動位置。首先我們需要借助setInterval函數不停的重畫雪花,這里間隔時間為50毫秒:setInterval(DrawSnow,50);同時每一朵雪花的坐標(X、Y)需要不停的改變(在一定幅度內),我們這里的雪花是從左上方飄落到右下方,所以每朵X、Y坐標值都在不停的增大,那我們用一個函數SnowFall()定義雪花飄過規則該函數代碼如下:JavaScript Code復制內容到剪貼板
functionSnowFall(){ for(vari=0;i snow;i++){ varp=arr[i]; p.y+=Math.random()*2+1; if(p.y hei){ p.y=0; } p.x+=Math.random()*2+1; if(p.x wid){ p.x=0; span >
然后將該函數放入DrawSnow()執行,注意:我們每隔50毫毛重畫雪花,必須擦除畫布,所以DrawSnow()函數體內必須在前面執行clearRect()函數,即:ctx.clearRect(0, 0, wid, hei);此時DrawSnow函數定義如下:JavaScript Code復制內容到剪貼板
functionDrawSnow(){ ctx.clearRect(0,0,wid,hei); ctx.fillStyle= white ; ctx.beginPath(); for(vari=0;i snow;i++){ varp=arr[i]; ctx.moveTo(p.x,p.y); ctx.arc(p.x,p.y,p.r,0,2*Math.PI,false); } ctx.fill(); SnowFall(); ctx.closePath(); }
最后執行setInterval(DrawSnow, 50);OK,經過我們上述步驟,小伙伴們是否已經對整個過程及技術實現很清晰了。完整代碼如下(大家可以直接復制到自己項目中執行,測試下效果):XML/HTML Code復制內容到剪貼板
title /title scriptsrc= js/jquery-1.8.3.min.js /script styletype= text/css *{ margin:0; padding:0; } #mycanvas{ background:black; } /style /head body canvasid= mycanvas 您的瀏覽器不支持canvas畫布 /canvas script //獲取mycanvas畫布 varcan=document.getElementById( mycanvas varctx=can.getContext( 2d //畫布寬度 varwid=window.innerWidth; //畫布高度 varhei=window.innerHeight; can.width=wid; can.height=hei; //雪花數目 varsnow=100; //雪花坐標、半徑 vararr=[];//保存各圓坐標及半徑 for(vari=0;i snow;i++){ arr.push({ x:Math.random()*wid, y:Math.random()*hei, r:Math.random()*10+1 }) } //畫雪花 functionDrawSnow(){ ctx.clearRect(0,0,wid,hei); ctx.fillStyle= white ; ctx.beginPath(); for(vari=0;i snow;i++){ varp=arr[i]; ctx.moveTo(p.x,p.y); ctx.arc(p.x,p.y,p.r,0,2*Math.PI,false); } ctx.fill(); SnowFall(); ctx.closePath(); } //雪花飄落 functionSnowFall(){ for(vari=0;i snow;i++){ varp=arr[i]; p.y+=Math.random()*2+1; if(p.y hei){ p.y=0; } p.x+=Math.random()*2+1; if(p.x wid){ p.x=0; } } } setInterval(DrawSnow,50); /script /body /html
好了,今天分享就到這里,希望對大家的學習有所幫助。
原文:http://www.cnblogs.com/tangyifeng/p/5253629.htmlhtml教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 藁城市| 綦江县| 抚宁县| 奉化市| 府谷县| 扶风县| 灵石县| 尖扎县| 安丘市| 全州县| 电白县| 叶城县| 南开区| 大厂| 鹤庆县| 辉县市| 台州市| 锡林浩特市| 香港| 同心县| 郑州市| 郯城县| 襄垣县| 儋州市| 微博| 河曲县| 赤峰市| 泽州县| 承德市| 万盛区| 乌什县| 高清| 安塞县| 西城区| 潢川县| 抚顺县| 漠河县| 鄢陵县| 益阳市| 罗城| 大石桥市|