canvas实现鼠标跟随火焰(js)

本文介绍了一个使用HTML5 canvas和JavaScript实现的动态火焰效果,火焰会跟随鼠标的移动而变化,通过创建多个粒子并不断更新其位置和透明度,形成燃烧的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果展示:

源码展示:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>canvas实现鼠标跟随火焰(js)</title>

    <style>
        #myCanvas {
            position:absolute;
            left:0px;
            top:0px;
        }
    </style>
</head>
<body>
<canvas id="myCanvas">
    更新浏览器
</canvas>

<script>
    function aa() {
        var canvas = document.getElementById("myCanvas");
        var ctx = canvas.getContext("2d");

        var W = window.innerWidth,
            H = window.innerHeight;
        canvas.width = W;
        canvas.height = H;

        var particles = [];
        var mouse = {};


        var particle_count = 50;
        for (var i = 0; i < particle_count; i++) {
            particles.push(new particle());
        }


        canvas.addEventListener('mousemove', track_mouse, false);

        function track_mouse(e) {

            mouse.x = e.pageX;
            mouse.y = e.pageY;
        }

        function particle() {
            this.speed = {
                x: -2.5 + Math.random() * 5,
                y: -15 + Math.random() * 10
            };

            if (mouse.x && mouse.y) {
                this.location = {
                    x: mouse.x,
                    y: mouse.y
                };
            } else {
                this.location = {
                    x: W / 2,
                    y: H / 2
                };
            }
            //radius range = 10-30
            this.radius = 10 + Math.random() * 20;
            //life range = 20-30
            this.life = 20 + Math.random() * 10;
            this.remaining_life = this.life;
            //colors
            this.r = Math.round(Math.random() * 255);
            this.g = Math.round(Math.random() * 255);
            this.b = Math.round(Math.random() * 255);
        }

        function draw() {
            ctx.globalCompositeOperation = "source-over";
            ctx.fillStyle = "black";
            ctx.fillRect(0, 0, W, H);
            ctx.globalCompositeOperation = "lighter";

            for (var i = 0; i < particles.length; i++) {
                var p = particles[i];
                ctx.beginPath();
             
                p.opacity = Math.round(p.remaining_life / p.life * 100) / 100
       
                var gradient = ctx.createRadialGradient(p.location.x, p.location.y, 0, p.location.x, p.location.y, p.radius);
                gradient.addColorStop(0, "rgba(" + p.r + ", " + p.g + ", " + p.b + ", " + p.opacity + ")");
                gradient.addColorStop(0.5, "rgba(" + p.r + ", " + p.g + ", " + p.b + ", " + p.opacity + ")");
                gradient.addColorStop(1, "rgba(" + p.r + ", " + p.g + ", " + p.b + ", 0)");
                ctx.fillStyle = gradient;
                ctx.arc(p.location.x, p.location.y, p.radius, Math.PI * 2, false);
                ctx.fill();

  
                p.remaining_life--;
                p.radius--;
                p.location.x += p.speed.x;
                p.location.y += p.speed.y;
                
                if (p.remaining_life < 0 || p.radius < 0) {
                    particles[i] = new particle();

                }
            }
        }

        setInterval(draw, 30);
    }
    aa();
</script>

</body>
</html>

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值