JS实现线条动态背景

[Top] JS实现线条动态背景

线条随机运动,鼠标移动过程中,有吸附性,话不多说,直接上代码吧!

!function () {
        let num = 100;
        //设置所画线的颜色
        let colorLine = "138,43,226"
        //创建画布
        let canvas = document.createElement('canvas');
        //将创建的画布添加至body标签当中
        document.getElementsByTagName('div')[0].appendChild(canvas)
        let ctx = canvas.getContext('2d');
        //获取当前页面的宽高,并同时设置给予画布
        let myWidth = canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
        let myHeight = canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
        let newCircleArray,allCircle = []

        //获取动画帧,用于更新动画
        let ani = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
            function (n) {
                window.setTimeout(n, 1e3 / 45)
            };
        //首先创建两百个点,随机分布在屏幕当中
        for (let i = 0; i < num; i++) {
            let x = Math.random() * myWidth;
            let y = Math.random() * myHeight;
            //便宜量
            let offX = Math.random() * 2 - 1;
            let offY = Math.random() * 2 - 1;
            //将所画圆的坐标存储在数组当中
            allCircle.push({x: x, y: y, offX: offX * .5, offY: offY * .5, maxLen: 8e3})
            drawCircle(x, y, .5)
        }

        //画圆函数
        function drawCircle(x, y, r, startAngel = 0, endAngel = Math.PI * 2) {
            ctx.save()
            ctx.beginPath();
            ctx.arc(x, y, r, startAngel, endAngel);
            ctx.fillStyle = "red"
            ctx.fill()
            ctx.restore()
        }

        function moveCircle() {
            ctx.clearRect(0, 0, myWidth, myHeight)
            allCircle.forEach((value, index) => {
                //偏移量取-1到1,存储在数组当中直接使用
                value.x += value.offX
                value.y += value.offY
                //在进行位移后,如果坐标超出了屏幕,需要对便宜量进行取反
                value.offX *= value.x > myWidth || value.x < 0 ? -1 : 1;
                value.offY *= value.y > myHeight || value.y < 0 ? -1 : 1;
                drawCircle(value.x, value.y, .5)
            })
            drawLine()
            ani(moveCircle)
        }
        let mouse={x:null,y:null,maxLen: 6e3};
        //将鼠标坐标添加进所有圆点数组当中
        newCircleArray= allCircle.concat([mouse]);
        console.log(newCircleArray);
        //给鼠标添加移动事件
        document.onmousemove = function (e) {
            mouse.x = e.clientX;
            mouse.y = e.clientY;
        }
        document.onmouseout = function (){
            mouse.x = null;
            mouse.y = null
        }
        //进行画线
        function drawLine() {
            allCircle.forEach(function (value, index) {
                //对所有圆点进行遍历,如果有满足条件的则进行连线
                //1、判断两点的距离是否满足设定值

                //value值和剩余的圆点数据进行匹配
                for (let i = index + 1; i < newCircleArray.length; i++) {
                    if(newCircleArray[i].x!=null && newCircleArray[i].y!=null){
                        let xWidth,yHeight;
                        xWidth = (newCircleArray[i].x - value.x) * (newCircleArray[i].x - value.x);
                        yHeight = (newCircleArray[i].y - value.y) * (newCircleArray[i].y - value.y);
                        //斜边的平方
                        let zLen = xWidth + yHeight;
                        //向连线方向进行偏移
                        if (zLen < value.maxLen) {
                            if(newCircleArray[i] === mouse && mouse.x!=null && zLen>mouse.maxLen){
                                //如果连线的是鼠标这个点,那么在达到最大长度时,需要修改偏移量,进行反向偏移一段距离,看起来会有跟随效果
                                //可自行调整相乘的小数值,越大吸附能力越强,同时抖动也越厉害
                                value.x +=(newCircleArray[i].x- value.x)*.01
                                value.y +=(newCircleArray[i].y-value.y)*.01
                            }
                            //计算透明度
                            let opacity = 1 - zLen / value.maxLen
                            ctx.save()
                            //满足条件,开始连线
                            ctx.beginPath();
                            //设置画笔起始点
                            ctx.moveTo(value.x, value.y);
                            //设置画笔终点
                            ctx.lineTo(newCircleArray[i].x, newCircleArray[i].y);
                            //1、单一颜色写法
                            // ctx.strokeStyle = "rgba("+colorLine+","+opacity+")";
                            //2、渐变线条写法
                            let grd = ctx.createLinearGradient(value.x, value.y, newCircleArray[i].x, newCircleArray[i].y)
                            grd.addColorStop(1 / 7, "rgba(255,0,0,"+opacity+")");
                            grd.addColorStop(2 / 7, "rgba(255,165,0,"+opacity+")");
                            grd.addColorStop(3 / 7, "rgba(255,255,0,"+opacity+")");
                            grd.addColorStop(4 / 7, "rgba(0,255,0,"+opacity+")");
                            grd.addColorStop(5 / 7, "rgba(0,255,255,"+opacity+")");
                            grd.addColorStop(6 / 7, "rgba(0,0,255,"+opacity+")");
                            grd.addColorStop(1, "rgba(139,0,255,"+opacity+")");
                            ctx.strokeStyle = grd
                            ctx.stroke();
                            ctx.restore();
                        }
                    }

                }
            })
        }
        //让圆动起来
        moveCircle()
    }();

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
您可以尝试使用CSS3的动画效果来实现该功能,具体步骤如下: 1. 创建一个容器,设置其宽度和高度,并将其作为页面的背景。 2. 使用伪元素 `::before` 和 `::after`,分别创建两条垂直线条,并将它们定位到容器的左右两侧。 3. 给这两条线条添加CSS3的动画效果,使它们在容器内部来回移动。 4. 使用JavaScript来监听鼠标移动事件,获取鼠标的坐标,并将其传递给线条的样式属性,使线条汇聚于鼠标位置。 以下是一个简单的示例代码: HTML代码: ```html <div class="container"></div> ``` CSS代码: ```css .container { width: 100%; height: 100%; position: fixed; top: 0; left: 0; z-index: -1; } .container::before, .container::after { content: ''; position: absolute; width: 2px; height: 100%; top: 0; bottom: 0; margin: auto; background-color: #fff; animation: animate 2s linear infinite; } .container::before { left: 0; } .container::after { right: 0; } @keyframes animate { 0% { transform: translateY(-50px); } 50% { transform: translateY(50px); } 100% { transform: translateY(-50px); } } ``` JavaScript代码: ```js const container = document.querySelector('.container'); const beforeLine = document.querySelector('.container::before'); const afterLine = document.querySelector('.container::after'); container.addEventListener('mousemove', e => { const x = e.clientX; const y = e.clientY; beforeLine.style.transform = `translateY(${y}px)`; afterLine.style.transform = `translateY(${y}px)`; }); ``` 这样,您就可以实现一个简单的动态线条背景鼠标特效了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值