Canvas實現雨滴效果


主要思路:

  1. 創建canvas元素;

    注意:

    canvas並不是所有部分都能繪制圖形,它像一個國畫卷軸一樣,可繪制部分只有宣紙部分。如果需要canvas畫布局域填充整個cnavas寬高,需要進行設置。

    canvas是行內元素。行內元素如果等於瀏覽器寬高的話,會使瀏覽器出現滾動條,因為行內元素有行高,設置為塊級元素即可。

    canvas有默認的寬高(300*150)

  2. 獲取canvas元素,並設置canvas寬高等於整個瀏覽器窗口寬高;

    • 獲取瀏覽器窗口的大下(寬高)

      window.innerWidth;

      window.innerHeight;

    • 當瀏覽器窗口寬高發生改變時,也需要重新設置canvas寬高;

      window.onresize = function(){};監聽瀏覽器窗口的變化,在瀏覽器窗口變化的時候,執行獲取瀏覽器窗口大小的方法,並給canvas進行重新賦值。

  3. 實現會動的圖形。

    • 向下播放多張靜態的圖片。一秒內要大於屏幕刷新的幀數(60) 也就是每隔1/60s執行一次函數

  4. 在每次繪制的正方形上添加一個背景色為白色蒙板。

<!DOCTYPE html>
<html lang="en">

<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>Canvas雨滴效果</title>
    <style>
        body {
            margin: 0;
        }

        .rain {
            display: block;
            background-color: #000;
        }
    </style>
</head>

<body>
    <canvas class="rain"></canvas>
    <script>
        // 1.獲取canvas並設置大小
        var canvas = document.querySelector('.rain');
        var ctxWidth, ctxHeight; // 定義畫布的寬高
        ~~function setResize() { // 根據瀏覽器窗口的改變,實時改變canvas畫布的寬高,和瀏覽器保持一致
            window.onresize = arguments.callee;
            ctxWidth = window.innerWidth;
            ctxHeight = window.innerHeight;
            canvas.width = ctxWidth;
            canvas.height = ctxHeight;
        }();
        var ctx = canvas.getContext('2d');

        // 2.繪制單個會動的雨滴,根據單個雨滴進行接下來的雨滴對象Rain處理
        /* var y = 10;
        setInterval(function () {
            // 添加雨滴蒙版,使用透明色,使雨滴向上看起來有逐漸透明的效果
            ctx.fillStyle = 'rgba(0,0,0,0.05)';
            ctx.fillRect(0, 0, ctxWidth, ctxHeight);
        
            //繪制雨滴小矩形
            ctx.fillStyle = 'blue';
            ctx.fillRect(10, y++, 4, 10);
        }, 1000 / 60); */

        function random(min, max) { // 生成從min到max之間的隨機數
            return Math.random() * (max - min) + min;
        }

        // 3.設置雨滴對象
        function Rain() { };
        Rain.prototype = {
            init: function () {
                this.x = random(0, ctxWidth);
                this.y = 0;
                this.vY = random(4, 5); // 雨滴在Y軸上運動的速度
                this.h = random(0.8 * ctxHeight, 0.9 * ctxHeight); // 雨滴停止的Y軸位置,整個畫布的80%-90%高度的地方
                this.r = 1; // 圓形半徑
                this.vR = 1; // 圓形半徑變化的速度
            },
            draw: function () {
                if (this.y <= this.h) {
                    //繪制雨滴小矩形
                    ctx.beginPath();
                    ctx.fillStyle = '#31f7f7';
                    ctx.fillRect(this.x, this.y, 4, 10);
                } else {
                    ctx.beginPath();
                    ctx.strokeStyle = '#31f7f7';
                    ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
                    ctx.stroke();
                }
            },
            move: function () {
                if (this.y <= this.h) {
                    this.y += this.vY;
                } else {
                    if (this.r <= 100) {
                        this.r += this.vR;
                    }
                    else {
                        this.init();
                    }
                }
                this.draw();
            }

        }

        // 創建多個雨滴的函數,將雨滴push進入arrRains中
        var arrRains = [];

        function createRain(num) {
            // 每200ms生成一滴雨滴
            for (var i = 0; i <= num; i++) {
                setTimeout(function () {
                    var rain = new Rain();
                    rain.init();
                    rain.draw();
                    arrRains.push(rain);
                }, 200 * i);
            }
        }

        createRain(50);

        setInterval(function () {
            // 添加雨滴蒙版,使用透明色,使雨滴向上看起來有逐漸透明的效果
            ctx.fillStyle = 'rgba(0,0,0,0.05)';
            ctx.fillRect(0, 0, ctxWidth, ctxHeight);
            for (item of arrRains) {
                item.move();
            }
        }, 1000 / 60); // 每1/60秒執行一次函數
    </script>
</body>

</html>

效果圖,截了一張靜態的圖片,實際效果是動態的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM