<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        html5實現下雪效果的方法

        來源:懂視網 責編:小采 時間:2020-11-27 15:28:26
        文檔

        html5實現下雪效果的方法

        html5實現下雪效果的方法:利用canvas,實現一個下雪的效果,我們先預覽下效果:我們先分析下這個效果:1,隨機產生雪花2,雪花的產生不是同時產生,而是有先后順序的3,雪花怎么表示4,怎么源源不斷的下雪5,雪花有大有小搞清楚上面幾個問題之后,這個效果基本上就實現了,首先,由于
        推薦度:
        導讀html5實現下雪效果的方法:利用canvas,實現一個下雪的效果,我們先預覽下效果:我們先分析下這個效果:1,隨機產生雪花2,雪花的產生不是同時產生,而是有先后順序的3,雪花怎么表示4,怎么源源不斷的下雪5,雪花有大有小搞清楚上面幾個問題之后,這個效果基本上就實現了,首先,由于

        利用canvas,實現一個下雪的效果,我們先預覽下效果:

        我們先分析下這個效果:

        1,隨機產生雪花

        2,雪花的產生不是同時產生,而是有先后順序的

        3,雪花怎么表示

        4,怎么源源不斷的下雪

        5,雪花有大有小

        搞清楚上面幾個問題之后,這個效果基本上就實現了,

        首先,由于這個是全屏效果,我采用動態創建canvas,把整個瀏覽器的寬與高賦值給canvas

        var Canvas = function (w, h) {
         this.width = w;
         this.height = h;
         }
         Canvas.prototype = {
         init: function () {
         var oC = document.createElement("canvas");
         oC.setAttribute('width', this.width);
         oC.setAttribute('height', this.height);
         oC.setAttribute('id', 'canvas');
         oC.style.backgroundColor = '#000';
         document.body.appendChild(oC);
         }
         }
         var curWinWidth = window.innerWidth,
         curWinHeight = window.innerHeight;
         var oCanvas = new Canvas(curWinWidth, curWinHeight);
         oCanvas.init();

        調用oCanvas對象的init方法之后,就會在body的最后面追加一個canvas,id為canvas,寬、高與瀏覽器的寬、高相同,背景為黑色,晚上下雪的效果

        接下來,有了舞臺,演員該上場了,怎么產生雪花呢?這里把下雪相關的操作,封裝成一個類,他的基本結構如下:

        var Snow = function(){}
        Snow.prototype = {
          init : function(){},
          draw : function( cxt ) {},
          update : function(){}
        }

        這個類一共有三個方法( init, draw, update ).

        init:初始化雪花的位置( x, y 坐標 )、速度、半徑( 雪花的大小,在這里我們把雪花用半徑不同的圓表示 )

        function random(min, max) {
         return Math.random() * (max - min) + min;
         }
         init: function () {
         this.x = random(0, width);
         this.y = 0;
         this.r = random(1, 5);
         this.vy = random(3, 5);
         }

        那么init 加上 這個random函數 就可以完成雪花的初始化

        1,雪花出來的時候,一般是在屏幕的最上方出現的,所以雪花的y坐標都是0, 其次,雪花的x坐標是隨機的,他的范圍是從屏幕的左邊到右邊,那么就是 0 ~ width. 這個width就是canvas的寬度,也就是瀏覽器的寬度

        2,雪花的半徑r, 設置為1 ~ 5之間的任意值

        3,雪花下降的速度設置為3 ~ 5之間的隨機速度,這里我做的下雪是垂直方向往下飄,你可以拓展,考慮風力影響( 這個時候肯定有水平方向的速度 )

        有了這些初始化的參數之后,我們完善draw方法,繪制雪花:

        draw: function (cxt) {
         cxt.beginPath();
         cxt.fillStyle = 'white';
         cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false);
         cxt.fill();
         cxt.closePath();
         this.update(cxt);
         },

        參數cxt就是canvas的上下文,這個函數很簡單,就是一個arc方法調用init中設置的值來畫圓(雪花),在該方法的最后調用了一個update方法,他是干嘛的?他是更新雪花在垂直方向的速度

        update: function (cxt) {
         if (this.y < height - this.r) {
         this.y += this.vy;
         } else {
         this.init();
         }
         }

        在update方法中,我們做了邊界判斷: 雪花往下飄落的時候,肯定會消失,消失之后怎么處理?沒有到達邊界怎么處理?

        canvas的高度減去雪花的半徑,這就是雪花要消失時候的邊界,所以this.y < height - this.r 如果這個條件成立,那么說明雪花一直在飄著,我們就要把雪花的y方向的位置更新,雪花看起來(‘正在下雪’),當一個雪花快要消失的時候,我們再把他移動到初始的位置,這樣看起來就是在圓圓不斷的下雪,而不需要重新繪制雪花(如果這樣做,肯定會影響性能,這個特效最后肯定會被卡死,這個小技巧很多類似的特效都會用到)。至此核心的流程已經搞定,接下來,我們就要大量的生成雪花了。

        var snow = [];
         for (var i = 0; i < 500; i++) {
         setTimeout(function () {
         var oSnow = new Snow();
         oSnow.init();
         snow.push(oSnow);
         }, 10 * i);
         }

        生成500個雪花,不是同時生成的,然后把這些雪花保存到數組snow中.

        然后,開啟定時器,讓雪花不斷的飄落吧,

        關于requestAnimationFrame的使用,可以參考我的這篇文章:[js高手之路] html5新增的定時器requestAnimationFrame實戰進度條

        (function move() {
         oGc.clearRect(0, 0, width, height);
         for (var i = 0; i < snow.length; i++) {
         snow[i].draw(oGc);
         }
         requestAnimationFrame(move);
         })();

        完整的demo代碼:

        <head>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <title>雪花效果 - by ghostwu</title>
         <!-- <script src="lib.js"></script> -->
         <style>
         * {
         margin: 0;
         padding: 0;
         }
        
         body {
         overflow: hidden;
         }
         </style>
        </head>
        
        <body>
         <script>
         window.onload = function () {
         var Canvas = function (w, h) {
         this.width = w;
         this.height = h;
         }
         Canvas.prototype = {
         init: function () {
         var oC = document.createElement("canvas");
         oC.setAttribute('width', this.width);
         oC.setAttribute('height', this.height);
         oC.setAttribute('id', 'canvas');
         oC.style.backgroundColor = '#000';
         document.body.appendChild(oC);
         }
         }
         var curWinWidth = window.innerWidth,
         curWinHeight = window.innerHeight;
         var oCanvas = new Canvas(curWinWidth, curWinHeight);
         oCanvas.init();
        
         var oC = document.querySelector('#canvas');
         var width = oC.width, height = oC.height, oGc = oC.getContext('2d');
        
         function random(min, max) {
         return Math.random() * (max - min) + min;
         }
         var Snow = function () {
        
         }
         Snow.prototype = {
         init: function () {
         this.x = random(0, width);
         this.y = 0;
         this.r = random(1, 5);
         this.vy = random(3, 5);
         },
         draw: function (cxt) {
         cxt.beginPath();
         cxt.fillStyle = 'white';
         cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false);
         cxt.fill();
         cxt.closePath();
         this.update(cxt);
         },
         update: function (cxt) {
         if (this.y < height - this.r) {
         this.y += this.vy;
         } else {
         this.init();
         }
         }
         }
        
         var snow = [];
         for (var i = 0; i < 500; i++) {
         setTimeout(function () {
         var oSnow = new Snow();
         oSnow.init();
         snow.push(oSnow);
         }, 10 * i);
         }
        
         (function move() {
         oGc.clearRect(0, 0, width, height);
         for (var i = 0; i < snow.length; i++) {
         snow[i].draw(oGc);
         }
         requestAnimationFrame(move);
         })();
         }
         </script>
        </body>

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        html5實現下雪效果的方法

        html5實現下雪效果的方法:利用canvas,實現一個下雪的效果,我們先預覽下效果:我們先分析下這個效果:1,隨機產生雪花2,雪花的產生不是同時產生,而是有先后順序的3,雪花怎么表示4,怎么源源不斷的下雪5,雪花有大有小搞清楚上面幾個問題之后,這個效果基本上就實現了,首先,由于
        推薦度:
        標簽: 方法 特效 下雪
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 成人爽A毛片免费看| 午夜一级免费视频| 国产免费黄色大片| 亚洲国产精品网站久久| 亚洲AV成人无码天堂| a级片免费在线观看| 亚洲色欲色欲www在线丝| 自拍偷自拍亚洲精品情侣| 国产AV无码专区亚洲Av| 亚洲人成免费电影| 久久久免费精品re6| 亚洲精品高清视频| 先锋影音资源片午夜在线观看视频免费播放 | 最近2019中文免费字幕| 亚洲国产精品日韩在线| 久久A级毛片免费观看| 女人张腿给男人桶视频免费版| 波多野结衣一区二区免费视频| 亚洲日本成本人观看| 最近免费中文字幕中文高清 | 秋霞人成在线观看免费视频| 在线亚洲精品自拍| 免费精品久久天干天干| 毛片高清视频在线看免费观看| 久久久久精品国产亚洲AV无码| 91免费精品国自产拍在线不卡| 亚洲综合一区国产精品| 国产免费午夜a无码v视频| 青娱乐在线视频免费观看| 国产午夜亚洲不卡| 亚洲日韩中文字幕一区| 国产精品无码一区二区三区免费| 91精品国产亚洲爽啪在线影院| 亚洲视频在线观看免费| 亚洲av成人一区二区三区| 免费无码又爽又高潮视频| 青青久久精品国产免费看| 18禁无遮挡无码网站免费| 亚洲av第一网站久章草| 浮力影院亚洲国产第一页| 69视频在线观看免费|