实现会动的图形,向下播放多张静态的图片。一秒内要大于屏幕刷新的帧数(60) 也就是每隔1/60s执行一次函数在每次绘制的正方形上添加一个背景色为白色蒙板。
效果图

源代码
<!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>
							
                


















