canvas背景效果

本文转载于:猿2048网站canvas背景效果

canvas背景效果:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
</head>

<body>
<canvas id="canvas" width="800" height="800"></canvas>
</body>
<script>
    let canvas = document.getElementById('canvas');
    let ctx = canvas.getContext('2d');
    let w = canvas.width = canvas.offsetWidth;
    let h = canvas.height = canvas.offsetHeight;
    let circles = [];

    function rand(min, max) {
        return parseInt(Math.random() * (max - min + 1) + min);
    }

    class Circle {
        constructor() {
            this.r = rand(5, 15);
            let x = rand(0, canvas.width - this.r);
            let y = rand(0, canvas.height - this.r);
            this.x = x < this.r ? this.r : x;
            this.y = y < this.r ? this.r : y;

            let speed = rand(1, 3);
            this.speedX = rand(0, 4) > 2 ? speed : -speed;
            this.speedY = rand(0, 4) > 2 ? speed : -speed;
        }

        drawCircle(ctx) {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.r, 0, 360);
            ctx.closePath();
            ctx.fillStyle = 'rgba(204,204,204,0.3)';
            ctx.fill();
        }

        drawLine(ctx, _circle) {
            let dx = this.x - _circle.x;
            let dy = this.y - _circle.y;
            let d = Math.sqrt(dx * dx + dy * dy);
            if (d < 150) {
                ctx.beginPath();
                ctx.moveTo(this.x, this.y);
                ctx.lineTo(_circle.x, _circle.y);
                ctx.closePath();
                ctx.strokeStyle = 'rgba(204,204,204,0.3)';
                ctx.stroke();
            }
        }

        move(w, h) {
            this.x += this.speedX / 10;
            if (this.x > w || this.x < 0) {
                this.speedX *= -1;
            }

            this.y += this.speedY / 10;
            if (this.y > h || this.y < 0) {
                this.speedY *= -1;
            }
        }
    }

    class curCircle extends Circle {
        constructor() {
            super();
        }

        drawCircle(ctx) {
            ctx.beginPath();
            this.r = 5;
            ctx.arc(this.x, this.y, this.r, 0, 360);
            ctx.closePath();
            ctx.fillStyle = 'rgba(255,77,54,0.6)';
            ctx.fill();
        }
    }

    let circle = new curCircle();
    let draw = function () {
        ctx.clearRect(0, 0, w, h);
        for (let i = 0; i < circles.length; i++) {
            circles[i].drawCircle(ctx);
            for (j = i + 1; j < circles.length; j++) {
                circles[i].drawLine(ctx, circles[j]);
            }
            circles[i].move(w, h);
        }
        if (circle.x) {
            circle.drawCircle(ctx);
            for (let k = 1; k < circles.length; k++) {
                circle.drawLine(ctx, circles[k])
            }
        }
        requestAnimationFrame(draw);
    };

    let init = function (num) {
        for (let i = 0; i < num; i++) {
            circles.push(new Circle());
        }
        draw();
    };

    window.addEventListener('load', init(20));

    canvas.addEventListener('mousemove', function (e) {
        e = e || window.event;
        circle.x = e.offsetX;
        circle.y = e.offsetY;
    });

    canvas.addEventListener('mouseout', function (e) {
        circle.x = null;
        circle.y = null;
    });
</script>

</html>

 

转载于:https://my.oschina.net/u/4191619/blog/3103002

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值