找回密码
  注册[Register]
查看: 290|回复: 6

[web] HTML+CSS实现页面粒子动画背景效果

[复制链接]
发表于 2022-4-7 20:37 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。




[HTML] 纯文本查看 复制代码
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus&#174;">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>粒子</title>
  <style>
    html,body,canvas{margin: 0px;padding: 0px;}
    html,body{
        width: 100%;
        height: 100%;
        overflow: hidden;
    }
  </style>
 </head>
 <body>
  <canvas id="canvas" style="width: 100%;height: 100%;background: #000;"></canvas>
 </body>
 <script>
    window.requestAnimationFrame=(function(){
        return window.requestAnimationFrame||
        window.webkitRequestAnimationFrame||
        window.mozRequestAnimationFrame||
        function (callback){
            window.setTimeout(callback,1000/60);
        };
    })();//兼容setTimeout
     
    var can=document.getElementById("canvas");
    var cxt=can.getContext("2d");//画布为2D
    //画布大小
    can.width=window.innerWidth;
    can.height=window.innerHeight;
    //圆形粒子统计
    var attr={
        num:300,//粒子个数
        array:[]//保存N个粒子对象
    }
    //创建粒子存入数组
    function cerateCircle(){
        for(let i=0;i<attr.num;i++){
            attr.array.push(new Circle());
        }
    }
    //绘制一个圆,确定位置大小,速度
    function Circle(){
        this.x=Math.floor(Math.random()*can.width);
        this.y=Math.floor(Math.random()*can.height);
        this.r=Math.floor(Math.random()*5)<3?3:Math.floor(Math.random()*5);
        this.vx=-0.5+Math.random();
        this.vy=-0.5+Math.random();
        this.color=createColor();
    }
    //绑定绘制粒子函数方法
    Circle.prototype.draw=function(){
        cxt.beginPath();
        cxt.fillStyle=this.color;
        cxt.arc(this.x,this.y,this.r,0,Math.PI*2);
        cxt.fill();
        cxt.closePath();
    }
    //颜色生成函数
    function createColor(){
        let r=Math.floor(Math.random()*255);
        let g=Math.floor(Math.random()*255);
        let b=Math.floor(Math.random()*255);
        return "rgb(" + r + "," + g + "," + b + ")";
    }
    //页面开始绘制
    function drawCircle(){
        for(let i=0;i<attr.num;i++){
            var dot=attr.array[i];
            dot.draw();
        }
    }
     
    //以上内容实现粒子静态绘制
    //粒子运动
    function moveCircle(){
        for(let i=0;i<attr.num;i++){
            var dot=attr.array[i];
            if(dot.y<0||dot.y>can.height){
                dot.vx=dot.vx
                dot.vy=-dot.vy
            }else if(dot.x<0||dot.x>can.width){
                dot.vx=-dot.vx;
                dot.vy=dot.vy;
            }
            dot.x+=dot.vx;
            dot.y+=dot.vy;
        }
    }
    //粒子之间连线
    function connectCircle(){
        for(let i=0;i<attr.num;i++){
            for(let j=0;j<attr.num;j++){
                iCircle=attr.array[i];//两个圆
                jCircle=attr.array[j];//两个园
                if(Math.sqrt((Math.pow((iCircle.x-jCircle.x),2))+(Math.pow((iCircle.y-jCircle.y),2)))<=20){
                    drawLine(iCircle.x,iCircle.y,jCircle.x,jCircle.y);
                }
            }
        }
    }
    //画线函数
    function drawLine(x1,y1,x2,y2){
        cxt.beginPath();
        cxt.moveTo(x1,y1);
        cxt.lineTo(x2,y2);
        cxt.strokeStyle=createColor();
        cxt.stroke();
        cxt.closePath();
    }
    //动起来,递归
    function loop(){
        requestAnimationFrame(loop);//递归
        cxt.clearRect(0,0,can.width,can.height);
        cerateCircle();//创建
        drawCircle();//绘制
        connectCircle();//连线
        moveCircle();//移动
        drawMouse();//鼠标连线
         
    }
    //鼠标添加事件,连线
    can.addEventListener('mousemove',function(e){
        e=e||event;
        mx=e.pageX-can.offsetLeft;
        my=e.pageY-can.offsetTop;
    });
    function drawMouse(){
            for(let i=0;i<attr.num;i++)
            {
                if (Math.sqrt((Math.pow((attr.array[i].x-mx),2))+(Math.pow((attr.array[i].y-my),2)))<=20){
                    drawLine(attr.array[i].x,attr.array[i].y,mx,my);
                }
            }
        }
    loop();
    cerateCircle();//创建
    drawCircle();//绘制
    connectCircle();//连线
 </script>
</html>

免费评分

参与人数 1热心值 +2 收起 理由
Sotouch + 2 [大牛论坛DNLT.CC]-评分=感恩!简单却充满爱!感谢您的作品!

查看全部评分

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2022-4-7 20:37 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-4-7 21:01 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-4-7 21:05 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

头像被屏蔽
发表于 2022-4-7 21:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-4-7 23:05 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2022-4-8 12:52 | 显示全部楼层
水波纹动态可以吗
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-5-5 19:59 , Processed in 0.039844 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表