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

实现网站背景鼠标吸附线条动画可以使用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日

相关文章

  • JS中的变量作用域(console版)

    下面我将为你详细介绍“JS中的变量作用域(console版)”的攻略。 什么是变量作用域? 在JS中,变量的作用范围被称为变量作用域。简单来说,就是定义一个变量后,这个变量能够被访问的范围。JS中有全局作用域和局部作用域。全局作用域指的是在整个JS文件中都能够访问的变量,而局部作用域则指的是在函数中定义的变量,在函数外面是无法访问到的。 如何判断变量作用域?…

    JavaScript 2023年5月28日
    00
  • javascript判断变量是否有值的方法

    当我们使用JavaScript编程时,有时候需要判断一个变量是否具有值。在这种情况下,我们需要使用不同的方法来检查它是否具有值。下面就是“JavaScript判断变量是否有值的方法”的完整攻略。 方法一:typeof操作符 typeof操作符可以用来检测一个变量的类型。当变量值为undefined时,typeof会返回”undefined”。这意味着我们可以…

    JavaScript 2023年6月10日
    00
  • JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解

    JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解 概述 Zip.js 是一个基于 JavaScript 的 zip 压缩和解压缩工具包。它可以在 Web 浏览器中直接使用,也可以使用 Node.js 运行。Zip.js 支持多种常见的文件格式,包括 ZIP、GZIP 等。 安装 Zip.js 可以直接在页面中引用,也可以通过 np…

    JavaScript 2023年5月27日
    00
  • 使用three.js 绘制三维带箭头线的详细过程

    使用three.js绘制三维带箭头线的过程涉及到以下步骤: 1. 引入three.js和箭头模型 在HTML文件中引入three.js的库文件,并下载arrow模型作为箭头的模型: <!– 引入three.js的库文件 –> <script src="https://cdn.bootcdn.net/ajax/libs/thre…

    JavaScript 2023年5月28日
    00
  • JavaScript String 对象常用方法详解

    下面我来详细讲解一下 JavaScript String 对象常用方法。 一、JavaScript String 对象简介 JavaScript 中的 String 对象,用于处理文本(字符串)数据。它包含了许多实用的方法,可以完成字符串的拼接、截取、检索、替换等操作。 二、JavaScript String 对象常用方法详解 下面是 JavaScript …

    JavaScript 2023年5月27日
    00
  • javascript入门·动态的时钟,显示完整的一些方法,新年倒计时

    Javascript入门-动态的时钟 基本思路 实现动态时钟,需要获取当前的时间,根据时分秒分别计算对应的角度,并使用transform指令对时钟的指针进行旋转。 HTML文件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <…

    JavaScript 2023年5月27日
    00
  • vue升级之路之vue-router的使用教程

    在Vue.js开发项目中,Vue Router是一个不可或缺的库。它为我们提供了一种方便的方式来管理应用程序的的路由和控制页面的显示内容。本文将提供“Vue升级之路之Vue Router的使用教程”,供大家参考。 安装Vue Router 我们可以使用npm来安装Vue Router,使用以下命令: npm install vue-router 创建Vue …

    JavaScript 2023年6月11日
    00
  • JavaScript DOMContentLoaded事件案例详解

    让我们来详细讲解一下JavaScript DOMContentLoaded事件的完整攻略。 什么是DOMContentLoaded事件? DOMContentLoaded是Document对象的事件,当DOM树加载完成并且CSS和JavaScript文件都已经解析执行完毕之后,就会触发该事件。与load事件不同,DOMContentLoaded事件是在页面的…

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