用canvas实现随机动态雪花

在这里插入图片描述


```php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    body{
        margin: 0;
        padding: 0;
    }
    canvas{
        background: #000;
    }
</style>
<body>
    <canvas id = "snow">

    </canvas>
    <script>
        var canvas = document.getElementById('snow');
        var context = canvas.getContext('2d');
        // 获得可视区的宽高
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        function snow(){
            context.save();
            // 开启路径
            context.beginPath();
            // 移动画布,确定雪花终点为中心点
            context.translate(100,100);
            //起点
            context.moveTo(-20,0);
            // 终点
            context.lineTo(20,0);
            // 线变成白色
            context.strokeStyle = '#fff';
            // 线变粗
            context.lineWidth = 10;
            // 线变圆头
            context.lineCap = 'round';
            context.stroke();
            // 角度转弧度
            var disX = Math.sin(30*Math.PI/180)*20;
            var disY = Math.sin(60*Math.PI/180)*20;
            // 画第二条线,左下到右上的线
            context.moveTo(-disX,disY);
            context.lineTo(disX,-disY);
            // 画第三条线
            context.moveTo(-disX,-disY);
            context.lineTo(disX,disY);
            context.stroke();
            context.restore();
        }
        // snow();
        //生成雪花的构造函数
        function Snow(x,y,scale,rotate,speedX,speedY,speedR){
                     this.x = x;
                     this.y = y;
                     this.scale = scale;
                     this.rotate = rotate;
                     this.speedX = speedX;
                     this.speedY = speedY;
                     this.speedR = speedR;
                    //  渲染雪花
                    this.render = function(){
                        context.save();
                        context.beginPath();
                        context.translate(this.x,this.y);
                        context.scale(this.scale,this.scale);
                        context.rotate(this.rotate*Math.PI/180);
                        context.moveTo(-20,0);
                        context.lineTo(20,0);
                        context.strokeStyle = '#fff';
                        context.lineWidth = 10;
                        context.lineCap = 'round';
                        context.stroke();
                        var disX = Math.sin(30*Math.PI/180)*20;
                        var disY = Math.sin(60*Math.PI/180)*20;
                        context.moveTo(-disX,disY);
                        context.lineTo(disX,-disY);
                        context.moveTo(-disX,-disY);
                        context.lineTo(disX,disY);
                        context.stroke();
                        context.restore();

                    }

        }
        // var snow = new Snow(50,50,1,10,10,10,10);
        // snow.render();
        // 存储所有生成的雪花
        var snowArray = [];
        // 生成雪花
            function init(){
                var len = 100;
                for(var i = 0;i<len;i++){
                    var x = Math.random()*canvas.width;
                    var scale = Math.random()+0.5;
                    var rotate = Math.random()*60;
                    var speedX = Math.random()+1
                    var speedY = Math.random()+5;
                    var speedR = Math.random()*4+2;
                    // var snow = new Snow(x,0,scale,rotate,speedX,speedY,speedR);
                    // snow.render();
                    (function(x,y,scale,rotate,speedX,speedY,speedR){
                        setTimeout(function(){
                        var snow = new Snow(x,0,scale,rotate,speedX,speedY,speedR);
                        snow.render();
                        snowArray.push(snow);
                    },Math.random()*8000);     
                    })(x,0,scale,rotate,speedX,speedY,speedR);
            }snowing();
        }init();
            // 动起来
            function snowing(){
                setInterval(function(){
                    //先清除
                    context.clearRect(0,0,canvas.width,canvas.height);
                    for(var i = 0;i < snowArray.length;i++){
                        snowArray[i].x = (snowArray[i].x+snowArray[i].speedX)%canvas.width;
                        snowArray[i].y = (snowArray[i].y+snowArray[i].speedY)%canvas.height;
                        snowArray[i].rotate = (snowArray[i].rotate+snowArray[i].speedR)%60;
                        snowArray[i].render();
                    }
                },30);
            }
        
        /**
         * sin60 = 对边/斜边 =>   对边 = sin60*斜边   =>   y=sin60*半径(r);
         */
    </script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
的效果,应该怎么做呢? 你可以使用 JavaScript 来实现动态雪花效果。 我们可以创建一个雪花函数,在函数中使用 HTML 的 canvas 元素来绘制雪花。 然后,我们可以在每一帧中使用 requestAnimationFrame() 方法来更新和绘制雪花,从而实现动态效果。 以下是示例代码: ```html <canvas id="myCanvas"></canvas> <script> function drawSnow() { // 获取画布元素 var canvas = document.getElementById('myCanvas'); // 获取画布上下文 var ctx = canvas.getContext('2d'); // 设置画布宽高 canvas.width = window.innerWidth; canvas.height = window.innerHeight; var snowflakes = []; function random(min, max) { return Math.round(Math.random() * (max - min) + min); } for (var i = 0; i < 100; i++) { snowflakes.push({ x: random(0, canvas.width), y: random(0, canvas.height), radius: random(1, 4), speed: random(1, 3), opacity: random(0.5, 1), angle: random(0, 360) }); } function update() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i < snowflakes.length; i++) { // 计算雪花下落位置 snowflakes[i].y += snowflakes[i].speed; snowflakes[i].x += Math.sin(snowflakes[i].angle * Math.PI / 180) * snowflakes[i].speed; // 重置雪花位置 if (snowflakes[i].y > canvas.height) { snowflakes[i].y = 0; } // 绘制雪花 ctx.beginPath(); ctx.arc(snowflakes[i].x, snowflakes[i].y, snowflakes[i].radius, 0, Math.PI * 2, false); ctx.fillStyle = 'rgba(255, 255, 255, ' + snowflakes[i].opacity + ')'; ctx.fill(); ctx.closePath(); } // 继续更新 requestAnimationFrame(update); } // 开始更新动画 update(); } drawSnow(); </script> ``` 这段代码将在画布绘制 100 个随机大小、速度和位置的雪花。 然后,通过 update() 函数和 requestAnimationFrame() 方法,完成雪花的动画更新和绘制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值