rundreamer 发表于 2022-4-7 16:32

html页面粒子动画背景

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



<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<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;
                        dot.draw();
                }
        }
       
        //以上内容实现粒子静态绘制
        //粒子运动
        function moveCircle(){
                for(let i=0;i<attr.num;i++){
                        var dot=attr.array;
                        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;//两个圆
                                jCircle=attr.array;//两个园
                                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.x-mx),2))+(Math.pow((attr.array.y-my),2)))<=20){
                                        drawLine(attr.array.x,attr.array.y,mx,my);
                                }
                        }
                }
        loop();
        cerateCircle();//创建
        drawCircle();//绘制
        connectCircle();//连线
</script>
</html>

灵剑丹心 发表于 2022-4-7 22:44

肯定是那个前端教程对把,我看过的,康康我改造的<!DOCTYPE html>
<html>
        <head>
                <meta charset="UTF-8">
                <title>粒子连线特效</title>
                <style type="text/css">
                        *{
                                margin: 0;
                                padding: 0;
                        }
                        html,body{
                                width: 100%;
                                height: 100%;
                        }
                        #myCanvas{
                                display: block;
                                background: black;
                        }
                </style>
                <script type="text/javascript">
                        varw,//页面宽
                                        h,//页面高
                                        c,//canvas dom对象
                                        cxt,//2d绘图对象
                                        particles,//粒子对象实例数组
                                        n,//粒子个数
                                        handle,//事件处理程序句柄
//                                        distance,//任意两个粒子允许连线的最大距离
                                        mouse,//代表鼠标位置的粒子对象
                        onload=function(){
                                c=document.getElementById("myCanvas");
                                cxt=c.getContext("2d");//获取h5内建的2d绘图对象
                                function init(){
                                        w=c.width=window.innerWidth;
                                        h=c.height=window.innerHeight;//顺便保存页面宽高
                                        n=Math.floor(w*h/10000);//粒子的数量由浏览器窗口大小决定
                                        particles=[];//初始化:清空
                                        mouse=new Particle();
                                        mouse.r=0;
                                        particles.push(mouse);//代表鼠标的粒子放在数组首位
                                        for(var i=0;i<n;i++){
                                                particles.push(new Particle());//创建Particle对象实例并保存在数组中
                                        }
                                        cancelAnimationFrame(handle);//这里不取消,每次窗口大小改变粒子运动就会加快
                                        randomMove();
                                }
                                init();
                                function randomMove(){
                                        drawParticle();
                                        handle=requestAnimationFrame(randomMove);
                                }
//                                addEventListener("resize",init);
                                onresize=init;
                               
                                c.onmousemove=function(e){//为代表鼠标的粒子更新坐标
                                        mouse.x=e.pageX || e.clientX;
                                        mouse.y=e.pageY || e.clientY;
//                                        console.log(particles==mouse)
//                                        console.log("当前粒子个数"+particles.length)
                                }
                                c.onclick=function(e){//点击添加一个粒子
                                        var particle=new Particle();
                                        particle.x=e.pageX || e.clientX;
                                        particle.y=e.pageY || e.clientY;
                                        particles.push(particle);
                                        console.log("当前粒子个数"+particles.length)
                                }
                                function drawParticle(){
                                        cxt.clearRect(0,0,w,h);
                                        for(var i=0,l=particles.length;i<l;i++){
                                                particles.draw();//注释此句将只能看到线条
                                                for(var j=0;j<l;j++){
                                                        if(i!=j)//不算自己跟自己的距离
                                                                isDrawLine(particles,particles);
                                                }
                                                if(particles!=mouse)//代表鼠标位置的粒子不自动运动
                                                        particles.move();
                                        }
                                };
                                function isDrawLine(x,y){//距离小于distance的粒子连线
                                        var distance= x===mouse || y===mouse ? 200 : Math.min(x.distance,y.distance);
                                        //鼠标所在的粒子连接距离可以设远一点
                                        //连线距离要满足两个粒子中要求最短的
                                        if(Math.sqrt(Math.pow((x.x-y.x),2)+Math.pow((x.y-y.y),2))<distance){
                                                cxt.beginPath();
                                                cxt.strokeStyle=mixRGBColor(x.color,y.color);//没事干,连线的颜色取两个粒子的颜色中间值
                                                cxt.moveTo(x.x,x.y);//从起点开始
                                                cxt.lineTo(y.x,y.y);
                                                cxt.stroke();
                                        }
                                }//isDrawLine结束
                               
                                function mixRGBColor(x,y){//俩粒子连线的颜色为它们颜色的中间值
                                        var c1=x.split(","),
                                                  c2=y.split(","),
                                                  r=Math.round((parseInt(c1.match(/\d+/))+parseInt(c2.match(/\d+/)))/2),
                                                  g=Math.round((parseInt(c1.match(/\d+/))+parseInt(c2.match(/\d+/)))/2),
                                                  b=Math.round((parseInt(c1.match(/\d+/))+parseInt(c2.match(/\d+/)))/2);
                                                return `rgb(${r},${g},${b})`//es6新特性字符串拼凑${变量}
                                }

                        }
                        function Particle(){//构造粒子对象
                                this.r=randomRange(3,6);//半径
                                this.x=randomRange(this.r,w-this.r);
                                this.y=randomRange(this.r,h-this.r);//生成随机不可越界粒子圆心坐标
                                this.moveX=randomSpeed();
                                this.moveY=randomSpeed();
                                this.color=randomColor();
                                this.distance=randomRange(50,100);//每个粒子有自己的随机连接距离
                               
                        }
                        Particle.prototype.draw = function(){
                                cxt.beginPath();//不开始路径有彩蛋
                                cxt.arc(this.x,this.y,this.r,0,Math.PI*2);
//                                cxt.closePath();//不结束路径有彩蛋
                                cxt.fillStyle=this.color;
                                cxt.fill();
                        }
                        Particle.prototype.move = function(){
                                if(this.x<this.r || this.x>w-this.r){
                                        this.moveX=-this.moveX;//取反反弹
                                }else if(this.y<this.r || this.y>h-this.r){
                                        this.moveY=-this.moveY;
                                }
                                this.x+=this.moveX;
                                this.y+=this.moveY;

//                                this.moveX=randomSpeed();
//                                this.moveY=randomSpeed();//加上这两行粒子就会原地抖动,因为每次都随机了位移不是-1就是1
                        }
                        function randomColor(){
                                var r=randomRange(0,255);
                                var g=randomRange(0,255);
                                var b=randomRange(0,255);
//                                return "rgb("+r+","+g+","+b+")"
                                return `rgb(${r},${g},${b})`
                        }
                        function randomRange(Min,Max){//Min<=返回值<=Max,随机范围内的整数
                        var Range = Max - Min;
                        var Rand = Math.random();
                        return Min + Math.round(Rand * Range); //四舍五入
                        }
                        function randomSpeed(){
                                return Math.random()<0.5 ? -1 : 1//返回-1或1
//                                return (Math.random()<0.5 ? -1 : 1)*randomRange(1,3)//返回-3到3不包括0,当做粒子坐标更新的增量
                        }

                        if (!Date.now)
                          Date.now = function() { return new Date().getTime(); };
                        (function() {
                          'use strict';
                          
                          var vendors = ['webkit', 'moz'];
                          for (var i = 0,l=vendors.length; i<l && !window.requestAnimationFrame; ++i) {
                                var vp = vendors;
                                window.requestAnimationFrame = window;
                                window.cancelAnimationFrame = (window
                                                                                                                   || window);
                          }
                          if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
                                || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
                                var lastTime = 0;
                                window.requestAnimationFrame = function(callback) {
                                    var now = Date.now();
                                    var nextTime = Math.max(lastTime + 16, now);
                                    return setTimeout(function() { callback(lastTime = nextTime); },
                                                      nextTime - now);
                                };
                                window.cancelAnimationFrame = clearTimeout;
                          }
                        }());
                </script>
        </head>
        <body>
                <canvas id="myCanvas">您的浏览器不支持canvas</canvas>
        </body>
</html>

mouyjy 发表于 2022-4-7 16:44

JunInJapen 发表于 2022-4-7 16:39
没有附件吗

新建一个文本文档,把代码粘贴进去,改文件拓展名html就行了

JunInJapen 发表于 2022-4-7 16:39

没有附件吗

mouyjy 发表于 2022-4-7 16:45

背景颜色是透明的我觉得不错,代码改成transparent

puz_zle 发表于 2022-4-7 16:57

我想了想 这适配了很久的浏览器版本啊

rundreamer 发表于 2022-4-7 16:58

JunInJapen 发表于 2022-4-7 16:39
没有附件吗

代码复制就行了,已经是全部代码了

rundreamer 发表于 2022-4-7 16:59

mouyjy 发表于 2022-4-7 16:45
背景颜色是透明的我觉得不错,代码改成transparent

可以,可以
希望大家多自己玩玩

yxn4065 发表于 2022-4-7 17:13

可以的老哥,我刚试了挺不错

mokson 发表于 2022-4-7 17:27

小鹏鹏 发表于 2022-4-7 18:19

num:30000,//粒子个数效果意想不到
页: [1] 2 3
查看完整版本: html页面粒子动画背景