首页CSSCanvas实现简单页面动画

Canvas实现简单页面动画

分类CSS时间2024-06-13 14:31:44发布RustStream浏览137
摘要:实现效果 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"></head></html><!--autointro-->...

实现效果

null

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>cavans</title>
</head>
<body>
    <canvas id="canvas" style="background: #222;"></canvas>
</body>

<script>
    let cvs = document.getElementById('canvas')
    // 检查浏览器是否支持canvas
    if (canvas.getContext) {
    // canvas相关的操作基本都在ctx上面进行
    const ctx = canvas.getContext('2d')
    }
    // 初始化Canvas
    init()

    class Point{
        constructor(){
            this.r = 2
            this.x = getRandom(0, cvs.width);
            this.y = getRandom(0, cvs.height);
            this.xSpeed = getRandom(-20,20);
            this.ySpeed = getRandom(-20,20);
            this.lastTime = null;
        }

        draw(){
            if(this.lastTime){
                let timeDiff = (Date.now() - this.lastTime) / 1000;
                let xDis = timeDiff * this.xSpeed;
                let yDis = timeDiff * this.ySpeed;
                let x = this.x + xDis,y = this.y + yDis;
                if(x >= cvs.width - this.r/2){
                    x = cvs.width - this.r/2
                    this.xSpeed = -this.xSpeed
                }else if(x<0){
                    this.xSpeed = -this.xSpeed
                }
                if(y >= cvs.height - this.r/2){
                    y = cvs.height - this.r/2
                    this.ySpeed = -this.ySpeed
                }else if(y<0){
                    this.ySpeed = -this.ySpeed
                }
                this.x = x
                this.y = y
            }
            ctx.beginPath()
            ctx.arc(this.x,this.y, this.r, 0, Math.PI *2)
            ctx.closePath()
            ctx.fillStyle = '#fff'
            ctx.fill()
            this.lastTime = Date.now()
        }
    }

    class pointGroup{
        constructor(maxnum = 50, maxLen = 170){
            this.points = new Array(maxnum).fill(0).map(() => new Point())
            this.maxLen = maxLen      
        }

        draw(){
            requestAnimationFrame(() => {
                this.draw()
            })
            ctx.clearRect(0, 0, cvs.width, cvs.height)
            for (let i = 0; i < this.points.length; i++) {
                const p1 = this.points[i]
                p1.draw()
                for (let j = 0; j < this.points.length; j++) {
                    const p2 = this.points[j]
                    p2.draw()
                    const dis = Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2) // 两点之间的距离
                    if(dis > this.maxLen){
                        continue;
                    }
                    ctx.beginPath()
                    ctx.moveTo(p1.x,p1.y)
                    ctx.lineTo(p2.x,p2.y)
                    ctx.closePath()
                    ctx.strokeStyle = `rgba(200,200,200, ${1-dis/this.maxLen})`
                    ctx.stroke()
                }
            }
        }
    }


    const p = new pointGroup()
    p.draw()

    function init(){
        cvs.width = document.documentElement.clientWidth;
        cvs.height = document.documentElement.clientHeight;
    }
    // 产生随机数
    function getRandom(min, max){
        return Math.floor(Math.random() * (max + 1 - min) + min)
    }
</script>
</html>

本文链接:https://blog.smallhao.fun/?id=9 转载需授权!

分享到:

Chen’Blog版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

JavaScript
Vite+Vue3 + Echarts 封装 JS生成随机数

游客 回复需填写必要信息
召唤伊斯特瓦尔