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将long日期格式转换为标准日期格式实现思路

    将long日期格式转换为标准日期格式,可以按照以下步骤进行操作: 获取long日期值 首先,我们需要获取包含long日期值的变量,可以是从数据库中查询到的时间戳,或者是前端传递过来的时间戳等。 示例1:获取当前时间戳 var timestamp = Date.now(); 示例2:获取后端传递过来的时间戳 var timestamp = response.d…

    JavaScript 2023年6月10日
    00
  • JavaScript判断表单中多选框checkbox选中个数的方法

    当我们需要检查表单中多选框checkbox的选中个数时,我们可以使用JavaScript编写代码来完成此任务。以下是一些检查多选框选中个数的方法: 方法一:使用原生JavaScript 获取多选框节点列表 我们需要先通过document.getElementsByName()方法获取包含多选框元素的节点列表。以下代码展示了如何获取名称为“items”的多选框…

    JavaScript 2023年6月10日
    00
  • JSONP解决JS跨域问题的实现

    让我们来详细讲解一下如何使用JSONP来解决JS跨域问题。 什么是JSONP JSONP是一种跨域方式,全称为JSON with Padding。它通过动态创建script标签的方式,将请求的数据包装在函数中返回,并执行这个函数,从而实现跨域请求数据的目的。 JSONP的原理很简单,就是利用script标签的src属性可以跨域请求资源,而服务端返回的是一个具…

    JavaScript 2023年5月27日
    00
  • 微信JSSDK调用微信扫一扫功能的方法

    针对您提供的话题,我来详细讲解一下微信JSSDK调用微信扫一扫功能的方法的完整攻略。 一、前置准备 要完成微信JSSDK调用微信扫一扫功能,需要提前完成以下几个步骤: 申请微信公众号。在微信公众平台上申请并审核通过公众号。 拥有有效的微信公众号开发者身份。在微信公众平台上注册并审核通过开发者账号,并进行开发者认证。 获得合法的微信JS-SDK权限。即在微信公…

    JavaScript 2023年6月10日
    00
  • 深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例

    深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例 在JavaScript中,编码与解码字符串是非常常见的操作。对于URL、HTML等特殊字符的处理,我们通常会使用escape()、encodeURI()、encodeURIComponent()这几个函数,它们虽然都是编码函数,但是处理的范围和方式各不相同…

    JavaScript 2023年5月19日
    00
  • ASP.NET回车提交事件浅析

    ASP.NET回车提交事件浅析 ASP.NET回车提交事件是指在文本框输入内容时,按下回车键将输入的内容提交到后台服务器进行处理的事件。在ASP.NET开发中,回车提交事件是非常常见且有用的事件之一,其能够方便用户快速地提交数据,提高用户体验。本文将针对ASP.NET回车提交事件的实现方式进行浅析,并提供相应的实例说明。 实现方式 实现ASP.NET回车提交…

    JavaScript 2023年6月10日
    00
  • javascript的基础知识(随缘更新)

    1.声明与变量 let声明的变量可以多次赋值 let 变量名 = 值; const修饰叫常量,只能赋值一次,但是引用的值可以改变 var声明的变量可以多次赋值 结论:能用let不用var ,因为作用域的问题 2.基本类型和对象类型 undefined 和 null undefined 指 未定义的对象或者属性时 ,或声明了变量没有赋初始值时 null 指不引…

    JavaScript 2023年4月18日
    00
  • JavaScript实现公历转农历功能示例

    为了实现将公历转为农历的功能,我们可以使用 JavaScript 。下面是一些实现方法: 获取农历年份其中天干地支年份和生肖的方法 根据中国传统农历的节气来把年份换算成对应的天干地支年份和生肖。下面是一种计算天干地支的方法: // 获取生肖年份的方法 function zodiacYear(solarYear) { var animals = [ &quot…

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