Canvas实例之鼠标移动特效(彩色小球)

2023-11-17

实现鼠标移动跟随着绽放的彩色小球。完整代码在文档末尾

图示:
炫彩小球
思路

  1. 获取画布
	//获取画布
    var canvas = document.getElementById("mycanvas");
    //获取上下文
    var ctx = canvas.getContext("2d");
  1. 设置球的属性:圆心起始坐标xy、半径r、颜色color。
    function Ball(x, y, r){
      this.x = x;
      this.y = y;
      //半径
      this.r = r;
      //设置随机颜色
      this.color = getRandom();
    }
  1. 随机颜色的方法:颜色组合='#'+6位字符
    function getRandom(){
      var allType = [0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f"];
      var color = "#";
      for(var i = 0; i < 6; i++){
        var random = parseInt(Math.random() * allType.length);//随机数*数组长度,并取整,得到的数一定不会大于数组长度,故拿来当数组的随机下标,得到的就是数组的随机数
        color +=allType[random];//那随机下标取随机数,并组合成颜色
      }
      return color;
    }

  1. 设置鼠标监听事件:鼠标移动过程中创建小球
canvas.addEventListener("mousemove", function(event){
      //鼠标事件可拿到当前鼠标坐标,event.offsetX相对于画布的x轴坐标
      new Ball(event.offsetX, event.offsetY, 15);//球类的三大属性
    });
  1. 要实现一堆彩球效果,等于要创建多个小球,这时需要创建一个数组去存储和维护,什么时候存小球呢,每创建一次存一次就好了嘛。
var ballArr = [];
function Ball(x, y, r){
      this.x = x;
      this.y = y;
      //半径
      this.r = r;
      //设置随机颜色
      this.color = getRandom();
      //每创建一个小球就放进数组
      ballArr.push(this);//此时的this指向的是当前小球实例
    }
  1. 动画三部曲:清屏-更新-渲染
    清屏
ctx.clearRect(0, 0, canvas.width, canvas.height);

更新:更新位置(运动的效果)、更新形态(改变半径)

Ball.prototype.update = function(){
      //小球的运动
      this.x += this.dx;//dx、dy可以直接放进小球的属性里面,设置随机值
      this.y += this.dy;
      this.r -= 0.2;
    }

渲染:填充颜色和绘制

Ball.prototype.render = function(){
      ctx.beginPath();//设置起始路径
      ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);//画出一个圆
      ctx.fillStyle = this.color;//设置圆的颜色
      ctx.fill();//填充绘制圆
    }

动画过程:在定时器里面更新并渲染数组里的小球

setInterval(function(){
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      //更新渲染
      for(var i = 0; i < ballArr.length; i++){
        ballArr[i].update();
        ballArr[i].render();
      }
    },10)

完整的代码:

<body>
  <canvas id="mycanvas" width="800" height="500"></canvas>
  <script>
    //获取画布
    var canvas = document.getElementById("mycanvas");
    //获取上下文
    var ctx = canvas.getContext("2d");
    // 球类
    function Ball(x, y, r){
      this.x = x;
      this.y = y;
      //半径
      this.r = r;
      //设置随机颜色
      this.color = getRandom();
      //设置行进方向
      this.dx = parseInt(Math.random() * 10) - 5;//要让小球往四面八方,路径就需要有正有负
      this.dy = parseInt(Math.random() * 10) - 5;
      //每创建一个小球就放进数组
      ballArr.push(this);
    }
    //彩色=随机颜色
    function getRandom(){
      var allType = [0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f"];
      var color = "#";
      for(var i = 0; i < 6; i++){
        var random = parseInt(Math.random() * allType.length);
        color +=allType[random];
      }
      return color;
    }
    //canvas设置鼠标监听,鼠标移动过程中创建小球
    canvas.addEventListener("mousemove", function(event){
      //鼠标事件可拿到当前鼠标坐标
      new Ball(event.offsetX, event.offsetY, 15);
    });

    //更新
    Ball.prototype.update = function(){
      //小球的运动
      this.x += this.dx;
      this.y += this.dy;
      this.r -= 0.2;
      //如果小球的半径小于0了,从数组中删除
      if(this.r < 0){
        this.remove();
      }
    }
    Ball.prototype.remove = function(){
      for(var i = 0; i < ballArr.length; i++){
        if(ballArr[i] == this){//this指向当前小球
          ballArr.splice(i, 1);
        }
      }
    }
    //渲染小球
    Ball.prototype.render = function(){
      ctx.beginPath();//设置起始路径
      ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);//画出一个圆
      ctx.fillStyle = this.color;//设置圆的颜色
      ctx.fill();//填充绘制圆
    }
    //维护小球的数组
    var ballArr = [];
    //动画过程 = 定时器进行动画渲染和更新
    setInterval(function(){
      //清屏-更新-渲染
      //清屏
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      //更新渲染
      for(var i = 0; i < ballArr.length; i++){
        ballArr[i].update();
        if(ballArr[i]){
          ballArr[i].render();
        }
      }
    },10)
  </script>
</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Canvas实例之鼠标移动特效(彩色小球) 的相关文章

  • HTML5 Canvas 实时绘图

    问题 我怎样才能使putImageData 随着图像各个部分的计算 实时更新画布 我正在开发一个 JavaScript TypeScript 应用程序来在 HTML5 上绘制 Mandelbrot 集
  • 在 Android 上使用透明绘画进行绘图

    当我使用Paint with Color TRANSPARENT在 Android 中的普通 2D 画布上 我没有得到任何结果 我的目的是删除画布上的一些内容 我的意思是我想要处理的内容不会消失 这是我的代码Paint mPointFill
  • Firefox:image.onload 中的 canvas.toDataURL 但返回透明图像

    我知道图像必须完整 在画布上使用 toDataURL 函数之前其加载已完成 将代码放在 image onload 函数中可确保这一点 还尝试了 canvas getContext 中的 preserveDrawingBuffer true
  • 将画布设置为背景 - Javascript [重复]

    这个问题在这里已经有答案了 我试图弄清楚如何将我创建的画布转换为 HTML 正文的背景图像 谢谢
  • HTML5 画布元素上的子像素抗锯齿文本

    我对画布元素抗锯齿文本的方式有点困惑 希望你们都能提供帮助 在下面的屏幕截图中 顶部的 Quick Brown Fox 是一个 H1 元素 底部的元素是一个画布元素 上面渲染有文本 在底部 您可以看到两个 F 并排放置并放大 请注意 H1
  • 从数组 THREE.js 创建纹理

    我正在研究地形生成器 但我不知道如何处理颜色 我希望能够生成一张占据整个 PlaneGeometry 的图像 我的问题是如何根据我的高度图创建一个覆盖整个 PlaneGeometry 没有环绕 的单个图像 我可以想到一种方法 但我不确定它是
  • HTML5 Canvas:绘制完成时获取事件

    我正在将图像绘制到画布元素 然后我就有了依赖于这个过程来完成的代码 我的代码如下所示 var myContext myCanvasElement getContext 2d myImg new Image myImg onload func
  • 在 Chrome 中拖动时更改 HTML5 Canvas 上的光标

    我正在研究如何在拖动鼠标时更改 HTML5 画布上的光标 遇到了这个 拖动鼠标时更改 HTML5 Canvas 上的光标 https stackoverflow com questions 4945874 change cursor ove
  • 在 JavaFX 中使用 MouseEvent 和 MouseClicked 选择并移动 Canvas 图像

    我有一个应用程序的示例 用于绘制图片GraphicsContext并如下图所示工作 问题是select and move只有blue circle水平地与Canvas MouseEvent and MouseClicked public c
  • HTML5画布中绘制图像对象的限制区域

    我想限制画布上可以绘制图像的区域 我正在使用 Fabric js 我尝试了以下链接 但它对我不起作用 在 Fabric js 中设置对象拖动限制 https stackoverflow com questions 19979644 set
  • 将内部图像替换为外部图像

    用户单击 蒙版 并上传图像 其显示的同一张图片两次 also Edit文本正在图像上显示 一旦用户单击 编辑文本 我们就会显示pop up box 在那里我们可以看到Zoomin Zoomout按钮正在显示 Issue 一旦我们点击这些按钮
  • Firefox:drawImage(视频)失败并显示 NS_ERROR_NOT_AVAILABLE:组件不可用

    尝试打电话drawImage with a video其来源是网络摄像头源似乎在 Firefox 中失败了NS ERROR NOT AVAILABLE Component is not available 我尝试等待视频标签触发的每个事件
  • 如何编辑 Chrome MediaRecorder 捕获的 .webm Blob

    在 Chrome 中 我在用着媒体记录器 https developer mozilla org en US docs Web API MediaStream Recording API and canvas captureStream h
  • 是否可以在浏览器中使用 javascript 对用户系统进行基准测试

    随着 Html5 开始普及 我们看到更多关于视频或画布元素等的实验 当使用画布进行实验时 例如用粒子制作烟花 1000 个粒子可能在现代机器上运行良好 但在 3 年机器上可能会运行得很慢 无论如何 是否可以对用户系统进行基准测试以动态更改画
  • 如何将 iframe 转换为画布?

    我正在尝试将所有内容作为图像保存到另一个页面中 我已经探索了执行此操作的方法 因此我认为我需要首先将该页面转换为画布 因此 我尝试使用要先将其保存为 iframe 的链接 然后将 iframe 转换为画布 但它不起作用 document r
  • 使用 css 和 javascript 在 div 背景中创建透明窗口

    我正在尝试在网页中实现效果 网页必须完全被带有透明窗口的背景覆盖 该窗口基本上会突出显示页面的某些页面以吸引用户的注意力 窗口的大小事先是未知的 效果必须在前端实现 所以我可以自由地使用html css和js 我不知道如何仅使用 css 来
  • 使 JavaScript 画布矩形可点击

    我正在创建一个简单的计算器 Here http startupsandfinance com online calculator html这是 我几乎完成了基本设计 但我对如何使按钮可点击感到困惑 一个技巧可能是为每个按钮创建一个 div
  • 在 SVG 中使用变换模拟枢轴旋转

    我在 SVG 中有一个矩形 需要从特定点绕轴旋转 我能想到的最好方法是变换到枢轴的 xy 旋转角度 然后再次变换 问题是第二个变换的 xy 我认为它会在某种程度上采用 cos 和 sin 只是不确定在哪里或为什么 会旋转 90度到 也许我以
  • 从 url 加载图像并绘制到 HTML5 Canvas

    我在从 javascript 中的 url 加载图像时遇到问题 下面的代码可以工作 但我不想从 html 加载图像 我想使用纯 JavaScript 从 url 加载图像 var c document getElementById myCa
  • 尝试使用掩码裁剪位图会抛出 IllegalArgumentException:

    我正在使用以下代码 public void cropSelection Bitmap bitmap annotationBitmap copy annotationBitmap getConfig true Canvas canvas ne

随机推荐

  • CSS媒体查询@media and screen指令在部分(360、奇安信等)浏览器不生效的解决方案

    一 介绍出现问题的写法 media screen and width lt 1024px flex other display none 可以看到 乍一看没什么问题 而且在chrome edge等浏览器也生效 但是在360浏览器等其它浏览器
  • Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839复现)

    内容目录 Weblogic反序列化漏洞 CVE 2018 2628 CVE 2023 21839 weblogic中间件 CVE 2018 2628 漏洞描述 影响版本 漏洞复现 修复方案 CVE 2023 21839 漏洞描述 影响版本
  • 【SQL】1 SQL 教程

    本系列教程均来自菜鸟教程 SQL 教程 SQL 是用于访问和处理数据库的标准的计算机语言 在本教程中 您将学到如何使用 SQL 访问和处理数据系统中的数据 这类数据库包括 MySQL SQL Server Access Oracle Syb
  • dolphinschedule使用shell任务结束状态研究

    背景 配置的dolphin任务 使用的是shell shell里包含了spark submit 如下截图 dolphin shell 介绍完毕 开始说明现象 有天有人调整了集群的cdp配置 executor cores max 1 我之前这
  • 我的世界java村民繁殖条件,我的世界村民无限繁殖教程 教你村民怎么生孩子

    我的世界村民无限繁殖教程 教你村民怎么生孩子 那在我的世界中想要绿宝石就要有很多的村民才可以 那下面就给大家分享一下村民怎么无限繁殖吧 还有教你村民怎么生孩子哦 游戏园我的世界官方群 325049520或256070479欢迎各路喜爱我的世
  • 初学容器:Docker

    1 环境初始化 1 1 安装git vim curl等常用工具 sudo apt update sudo apt install y git vim curl jq 1 2 ubuntu是不支持远程连接的 需要安装ssh服务 sudo ap
  • 剑指Offer【37】数字在排序数组中出现的次数(JavaScript版本)

    题目描述 统计一个数字在排序数组中出现的次数 function GetNumberOfK data k write code here var start data indexOf k count 0 i start while i lt
  • uni-app原生子窗体(app端)

    在uni app中video是原生组件 层级最高 全屏后普通前端组件无法覆盖 如果想要在视频自行绘制界面 1 app端vue页面可以用 cover view cover image 但是cover view cover image中不支持嵌
  • OPENCV C++ 找到最大内接矩形(正方形)

    OPENCV C 找到最大内接矩形 正方形 这源代码本来是检测最大内接圆形的 本人想要矩形 所以变成了正方形 谨慎使用 不是严格意义上的最大内接矩形 cv Mat map one label cv imread src png cv2 IM
  • 程序员,不止干到35岁

    程序员 不止干到35岁 在中国 程序员不能超过35岁 似乎已经是不争的事实 软件开发工作就是青春饭 顶多靠毕业这十年的时间 超过这个年龄 要不成功跃身成为管理者 要不转行进入其他领域 好像再没有更好的选择 即使偶有继续坚持作开发的 也被看成
  • Mybatis简单的增删改查和mybatis配置文件的详解

    MyBatis 1 什么是Mybatis MyBatis是一款优秀的持久层框架 MyBatis避免了几乎所有的JADBC代码和手动设置参数以及获取结果集 MyBatis可以使用简单的XML或注解来配置和映射原生类型 接口和Java的POJO
  • 使用Jest测试接口时间

    引言 在开发和测试过程中 我们经常需要对接口的性能进行评估和优化 一个重要的指标是接口的执行时间 本文将介绍如何使用Jest来测试接口的执行时间 并提供示例代码 Jest简介 Jest 是一个流行的JavaScript测试框架 广泛应用于前
  • 整理了60个 Python 实战例子,拿来即用

    大家好 最近有一些朋友问我有没有一些 Python 实战小案例 今天我整理排版了一遍 给大家分享一下 喜欢记得点赞 收藏 关注 整理了60个Python小例子 拿来即用 一 数字 1 求绝对值 绝对值或复数的模 公众号 快学Python I
  • python与pyqt5把列表中的数据写入到一个新的excel表中,并选择保存路径

    您可以使用 Python 的 openpyxl 库来实现这个功能 首先 您需要通过在命令行中运行 pip install openpyxl 来安装 openpyxl 库 然后 您可以使用以下代码来将列表中的数据写入新的 Excel 表中 f
  • mysql中drop语法错误,mysql 中drop 库的问题

    最近drop database pai 报错 ERROR 1010 HY000 Error dropping database can t rmdir pai errno 39 我就想把库文件直接删除试试 于是 rm rf usr loca
  • 区块链的基本概念

    区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 所谓共识机制是区块链系统中实现不同节点之间建立信任 获取权益的数学算法 区块链技术的内涵可概括为 在缺少可信任的中央节点和可信任的通道的情况下 分布在网络中的
  • All O`one Data Structure

    学习地址 双向链表 key为count数 value为存入的字符串 增加一个字符串 先判断其Node位置 再在双向链表中插入 删除也是 最大最小的字符串数在双向链表的表尾和表头 记录学习一下 class AllOne Node root M
  • STM32的介绍及MDK

    文章目录 STM32介绍 单片机 STM32命名 armV7的三个系列 STM32系统结构 CMSIS标准 STM32F4方包绍官方库包 STM32F103 STM32F103资源 STM32F103总线架构 STM32F103引脚 STM
  • 基于keras的图像分类CNN模型的搭建以及可视化(附详细代码)

    基于keras的图像分类CNN模型的搭建以及可视化 本文借助keras实现了热图像的分类模型的搭建 以及可视化的工作 本文主要由以下内容组成 Keras模型介绍 CNN模型搭建 模型可视化 Keras模型介绍 简介 Keras 是 Goog
  • Canvas实例之鼠标移动特效(彩色小球)

    实现鼠标移动跟随着绽放的彩色小球 完整代码在文档末尾 图示 思路 获取画布 获取画布 var canvas document getElementById mycanvas 获取上下文 var ctx canvas getContext 2