文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用canvas怎么实现一个粒子动画背景

2023-06-09 21:44

关注

使用canvas怎么实现一个粒子动画背景?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创建canvas

首先需要在需要展示粒子背景的父元素中创建一个canvas标签, 指定widthheight, 在我们生成随机点坐标的时候需要用widthheight来做参照。widthheight等于父元素的宽和高。

// 假如父元素是bodyconst ele = document.body;const canvas = document.createElement('canvas');canvas.width = ele.clientWidth;canvas.height = ele.clientHeight;// 将canvas标签插入ele.appendChild(canvas);

随机生成一定数量的点坐标信息

widthheight做参照随机生成一定数量的点坐标信息,包含x, y, rateX(点在X轴的移动速率), rateY(点在Y轴移动的速率), rateXrateY决定了点的运动轨迹。

const points = [];// 随机生成点的坐标,需指定radius的最大值function getPoint(radius) {  const x = Math.ceil(Math.random() * this.width), // 粒子的x坐标    y = Math.ceil(Math.random() * this.height), // 粒子的y坐标    r = +(Math.random() * this.radius).toFixed(4), // 粒子的半径    rateX = +(Math.random() * 2 - 1).toFixed(4), // 粒子在x方向运动的速率    rateY = +(Math.random() * 2 - 1).toFixed(4); // 粒子在y方向运动的速率  return { x, y, r, rateX, rateY };}// 随机生成100个点的坐标信息for (let i = 0; i < 100; i++) {  points.push(this.getPoint());}

将生成的点数组画到canvas上

function drawPoints() {  points.forEach((item, i) => {    ctx.beginPath();    ctx.arc(item.x, item.y, item.r, 0, Math.PI*2, false);    ctx.fillStyle = '#fff';    ctx.fill();    // 根据rateX和rateY移动点的坐标    if(item.x > 0 && item.x < width && item.y > 0 && item.y < height) {      item.x += item.rateX * rate;      item.y += item.rateY * rate;    } else {      // 如果粒子运动超出了边界,将这个粒子去除,同时重新生成一个新点。      points.splice(i, 1);      points.push(getPoint(radius));    }  });}

画线

遍历点数组,两两比较点坐标,如果两点之间距离小于某个值,在两个点之间画一条直线,lineWidth随两点之间距离改变,距离越大,线越细。

// 计算两点之间的距离function dis(x1, y1, x2, y2) {  var disX = Math.abs(x1 - x2),    disY = Math.abs(y1 - y2);  return Math.sqrt(disX * disX + disY * disY);}function drawLines() {  const len = points.length;  //对圆心坐标进行两两判断  for(let i = 0; i < len; i++) {    for(let j = len - 1; j >= 0; j--) {      const x1 = points[i].x,        y1 = points[i].y,        x2 = points[j].x,        y2 = points[j].y,        disPoint = dis(x1, y1, x2, y2);      // 如果两点之间距离小于150,画线      if(disPoint <= 150) {        ctx.beginPath();        ctx.moveTo(x1, y1);        ctx.lineTo(x2, y2);        ctx.strokeStyle = '#fff';        //两点之间距离越大,线越细,反之亦然        ctx.lineWidth = 1 - disPoint / distance;        ctx.stroke();      }    }  }}

动画

使用requestAnimationFrame循环调用draw方法(draw方法里包含画点和画线),同时在draw的时候根据rateXrateY来改动点的位置。

// 调用draw函数开启动画(function draw() {  ctx.clearRect(0, 0, width, height);  drawPoints();  // 如果不需要画线,取消下面这行代码即可。  drawLines();  window.requestAnimationFrame(draw);}());

看完上述内容,你们掌握使用canvas怎么实现一个粒子动画背景的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯