js+canvas实现网站背景鼠标吸附线条动画

yizhihongxing

实现网站背景鼠标吸附线条动画可以使用js+canvas技术实现,具体过程如下:

设计思路

  1. 使用canvas创建一个全屏的画布。
  2. 监听鼠标移动事件,实时获取鼠标的坐标位置。
  3. 创建一个数组存储所有的点,每个点有一定的速度,通过一个定时器不断的移动这些点,形成连续的轨迹。
  4. 每一个点的位置在不停地变动,需要实时计算每个点与鼠标的距离,并在一定范围内绘制一条线条连接两个点。
  5. 使用一个定时器不断地调用绘制函数,实现动画效果。

实现步骤

1. 创建画布

首先我们需要在html文件中创建一个canvas元素,用来绘制背景动画。

<canvas id="bg-canvas"></canvas>

接着,我们在JS文件中获取该canvas元素,设置画布宽度和高度,并获取画布上下文。

const canvas = document.getElementById('bg-canvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

2. 监听鼠标事件

我们需要在canvas上监听鼠标移动事件,实时获取鼠标的坐标位置。

let mouse = {
  x: 0,
  y: 0
};

function onMove(e) {
  mouse.x = e.clientX;
  mouse.y = e.clientY;
}
canvas.addEventListener('mousemove', onMove);

3. 创建点动画效果

我们可以随机生成若干个点,并将这些点存储在一个数组中。

const POINTS_NUM = 150;
const points = [];
const SPEED = 0.2;

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
    this.speed = SPEED;
    this.radius = 1;
    this.color = '#fff';
  }

  draw() {
    ctx.beginPath();
    ctx.fillStyle = this.color;
    ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
    ctx.fill();
  }

  move() {
    this.x += this.speed * (Math.random() - 0.5);
    this.y += this.speed * (Math.random() - 0.5);

    if (this.x < 0 || this.x > canvas.width) {
      this.x = Math.random() * canvas.width;
      this.y = Math.random() * canvas.height;
    }

    if (this.y < 0 || this.y > canvas.height) {
      this.x = Math.random() * canvas.width;
      this.y = Math.random() * canvas.height;
    }
  }
}

for (let i = 0; i < POINTS_NUM; i++) {
  points.push(new Point(Math.random() * canvas.width, Math.random() * canvas.height));
}

在每一个帧中,我们需要先清空画布,然后绘制每个点。为了实现连线的效果,还需要计算每个点与鼠标的距离,当两个点的距离小于一定的阈值时,就使用线条连接这两个点。

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  for (let i = 0; i < points.length; i++) {
    points[i].move();
    points[i].draw();
    for (let j = i + 1; j < points.length; j++) {
      let dx = points[i].x - points[j].x;
      let dy = points[i].y - points[j].y;
      let distance = Math.sqrt(dx * dx + dy * dy);
      if (distance < 100) {
        ctx.beginPath();
        ctx.strokeStyle = `rgba(255, 255, 255, ${(100 - distance) / 100})`;
        ctx.moveTo(points[i].x, points[i].y);
        ctx.lineTo(points[j].x, points[j].y);
        ctx.stroke();
      }
    }

    let dx = points[i].x - mouse.x;
    let dy = points[i].y - mouse.y;
    let distance = Math.sqrt(dx * dx + dy * dy);
    if (distance < 50) {
      ctx.beginPath();
      ctx.strokeStyle = `rgba(255, 255, 255, ${(50 - distance) / 50})`;
      ctx.moveTo(points[i].x, points[i].y);
      ctx.lineTo(mouse.x, mouse.y);
      ctx.stroke();
    }
  }
  requestAnimationFrame(draw);
}
draw();

在以上的代码中,我们使用了ES6中的class关键字来定义了一个Point类,该类包含了每个点的坐标、速度、半径、颜色等属性,以及在画布上绘制该点的方法draw()和让该点移动的方法move()。同时,我们还使用了递归方式的requestAnimationFrame函数来绘制整个动画。当然,也可以使用setInterval定时器来实现。

示例1

上述代码是实现网站背景中鼠标吸附线条动画的一种思路,下面还有一个基于同样的思路的示例:

【DEMO】

在这个示例中,我们随机生成了200个点,每个点会不断地移动,并绘制在canvas上。当鼠标与某个点的距离小于一定阈值时,我们就在两个点之间绘制一条线条,而鼠标则处于线条终点的位置。通过这样的方式,我们可以在鼠标和点之间形成一道道连续的光芒,从而实现一个炫酷的背景效果。

示例2

下面还有一个来源于Codepen的示例,同样基于了类似的思路,通过鼠标与点之间绘制带有烟花效果的线条,实现了一个更具创意和艺术感的动态背景效果。

【DEMO】

这个示例使用了很多css动画和样式效果,能够让用户更加直观地感受到线条烟花的变化和流动。同时,代码也相对来说更加复杂,需要更多的JS技巧和经验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js+canvas实现网站背景鼠标吸附线条动画 - Python技术站

(2)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 使用jsonp完美解决跨域问题

    使用 JSONP (JSON with Padding) 是一种解决跨域问题的常见方式。下面是使用 JSONP 完美解决跨域问题的攻略。 什么是JSONP(跨域协议) JSONP 是利用script标签跨域的一个技巧。简单地说,就是通过动态创建 script 标签,向其他域请求数据,该域返回数据时会调用一个 callback 函数,一般在前端代码中定义。 使…

    JavaScript 2023年5月27日
    00
  • 纯javascript代码实现计算器功能(三种方法)

    当我们想在网页中添加一个计算器功能的时候,可以使用Javascript来实现。以下是三种使用Javascript实现计算器功能的方法: 方法一:利用eval()函数计算表达式 在HTML文档中添加以下代码: <div id="container"> <input type="text" id=&quo…

    JavaScript 2023年5月27日
    00
  • CCPry JS类库 代码

    CCPry JS类库 代码攻略 什么是CCPry JS类库? CCPry JS类库是一款基于原生JavaScript的类库,提供了常用的工具函数和简化DOM操作的方法,方便开发人员快速完成常见的任务。 如何引入CCPry JS类库? 在HTML页面的标签中添加以下代码即可引入CCPry JS类库: <script src="ccpry.js&…

    JavaScript 2023年6月11日
    00
  • Js中parentNode,parentElement,childNodes,children之间的区别

    Js中parentNode,parentElement,childNodes,children之间的区别 在JavaScript中,我们经常需要访问DOM节点。parentNode、parentElement、childNodes以及children都是常用的访问DOM节点的属性或方法,它们之间有着不同的特点和用法。本文将结合示例来详细讲解这四个属性或方法的…

    JavaScript 2023年6月10日
    00
  • onkeypress字符按键兼容所有浏览器使用介绍

    下面是关于“onkeypress字符按键兼容所有浏览器使用介绍”的完整攻略。 什么是 onkeypress 事件 onkeypress 事件在用户按下并松开任意字符键时触发。该事件只能在可编辑区域或文本框中触发。 如何确保 onkeypress 兼容所有浏览器 不同的浏览器实现 onkeypress 事件的方式有所不同,为了确保事件的兼容性,我们可以使用如下…

    JavaScript 2023年6月11日
    00
  • springboot集成shiro遭遇自定义filter异常的解决

    下面我来详细讲解“springboot集成shiro遭遇自定义filter异常的解决”的完整攻略。 背景介绍 在Spring Boot应用中使用Shiro框架实现权限控制时,我们经常需要自定义过滤器(Filter)来实现一些业务需求,例如鉴权、登录、日志记录等。但有时候我们会发现,自定义的过滤器可能会导致Shiro框架出现异常,这个时候我们该怎么办呢? 下面…

    JavaScript 2023年6月11日
    00
  • 分享19个JavaScript 有用的简写写法

    下面为您详细讲解“分享19个JavaScript 有用的简写写法”的完整攻略。 前言 JavaScript 是目前应用广泛的编程语言之一,对于初学者来说,熟练使用一些简写写法可以提高编码效率,降低调试成本。本文将分享19个 JavaScript 有用的简写写法,方便开发者们在使用 JavaScript 过程中更加高效、便捷地完成编码工作。 内容 1. Ter…

    JavaScript 2023年5月19日
    00
  • Java在web页面上的编码解码处理及中文URL乱码解决

    Java在web页面上的编码解码处理及中文URL乱码解决攻略 1. 问题背景 在使用Java开发Web项目时,经常需要处理中文编码相关的问题,特别是在URL处理中,经常会出现中文乱码问题。这里提供一份详细的攻略,帮助开发者解决这些问题。 2. 编码解码处理 2.1. URL编码解码 在使用GET方法传递参数时,需要对参数进行URL编码处理,以便被服务器正确识…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部