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实例之鼠标移动特效(彩色小球) 的相关文章

  • 在 JavaScript 函数中加载图像

    我有获取图像像素颜色的功能 function getImage imgsrc var img img src imgsrc var imageMap new Object img load function var canvas
  • WPF画布性能-children.add调用多次

    我在长画布上绘制了很多线条 想想条形图 并对其性能进行了相当好的调整 使用低级几何类并冻结它们等 这极大地提高了性能 但仍然需要几秒钟将几千个项目加载到画布中 我对应用程序进行了性能分析 看起来每次调用都花费了很大一部分时间canvas c
  • 将剪贴板图像粘贴到画布

    我有一个画布 我需要用户能够将图像粘贴到上面 我希望这是跨浏览器的 我只想使用 html javascript 我也愿意使用 Flash 对象 这在 Chrome 中工作得很好 尽管到目前为止我还没有弄清楚如何让它在 Firefox 中工作
  • 以编程方式更改 StackPanel 在 Canvas 上的位置

    我在画布上有堆栈面板 堆栈面板有
  • 如何清除画布元素中的多边形区域?

    我使用过clearRect函数 但没有看到多边形的等效函数 我天真地尝试过 ctx fillStyle transparent ctx beginPath ctx moveTo 0 0 ctx lineTo 100 50 ctx lineT
  • 特别更改画布上的笔画不透明度,但不更改颜色

    我有一个漂亮整洁的脚本 可以循环显示颜色 并且与 xxxxxx格式 但我想改变透明度 有没有办法做到这一点 我指的是ctx strokeStyle 这是当前的代码 canvas strokeStyle 16777215 s length i
  • 使用渐变获取颜色条中特定位置的颜色值

    我生成了一个带有 CSS3 样式的渐变颜色条 fiddle http jsfiddle net eDEWk 现在想要该颜色条中特定位置的颜色值 通过 x 和 y 坐标 据我所知 没有直接的方法可以做到这一点 我看到两个选择 在 JavaSc
  • DrawBitmapMesh 如何在 Android Canvas 中工作

    我想在矩形上绘制位图 我使用以下值 this meshWidth 1 this meshHeight 1 this verts new float 8 this points 0 x float this getWidth 4 this p
  • CreateJs Canvas 形状在 Windows Phone 上丢失坐标

    我正在制作一个 Createjs 和 html5 项目 在其中绘制一个形状 红色圆圈 当我单击圆圈时它会发出警报 它在所有台式机和 Android 手机上都能正常工作 除非我在 Windows Phone 中打开它 否则它在普通屏幕上工作正
  • Gridview,允许背景画布在视图之外绘制

    我正在开发一个 Android 应用程序 一个小型记事本应用程序 在我的应用程序中 我使用 Gridview 创建 2 X 大小的网格并在每个单元格中 我有一个 LinearLayout 调用 AbstractNote 它的任务是显示每个保
  • 带滚动条的 HTML 画布

    我正在宽度不等的画布上绘制图表 每个画布可以有自己的滚动条吗 我尝试将所有画布放在一个 div 中并指定最大宽度 但它不起作用 是否有可能所有画布在页面上的可见宽度均为 500 像素 并且每个画布都有其滚动条来查看画布的整个宽度 谢谢 指定
  • 如何使用 HTML5 Javascript Canvas 获取三个碰撞形状的交集并删除不碰撞的部分?

    我最近专门针对 KonvaJs 发布了类似的问题here https stackoverflow com questions 64603077 how can i get the intersection of three shapes c
  • 垂直翻转 Android Canvas

    有没有一种简单的方法可以在 Android 中翻转画布 我似乎找不到任何可以让我垂直翻转它的东西 这样 y 轴上的零就是手机屏幕的底部而不是顶部 如果解决方案不是特别快也没关系 因为我没有对画布进行任何计算密集的操作 提前致谢 Try ca
  • 在 Fabric.js 中进行裁剪的“toDataURL”函数中,Multiplier 属性无法正常工作

    我的原始尺寸canvas is 800X700 我在用clipTo要在画布的选定部分中工作 var rect new fabric Rect left 100 top 50 fill fff width 376 height 602 str
  • 将画布缩放到鼠标光标

    我正在编写一个 HTML5 项目 其中涉及使用滚轮放大和缩小图像 我想像谷歌地图一样缩放光标 但我完全不知道如何计算移动 我所拥有的 图像x和y 左上角 图像宽度和高度 光标 x 和 y 相对于画布中心 简而言之 你想要translate
  • 使用canvas.toDataURL时如何设置crossOrigin属性?

    因此 我尝试为我正在构建的 OpenLayers 3 应用程序创建打印地图函数 我知道他们example http openlayers org en v3 8 2 examples export map html但每当我尝试使用它时 我都
  • 将 PictureStream 转换为 HTML5 画布

    我正在从 net Web 服务检索图片流的字节数组 JSON 字节数组响应如下所示 137 80 78 372 617 more 我正在尝试转换这个字节数组并将其绘制到 HTML 画布中 如下所示 var context document
  • 使用 javascript 将 html 文本渲染为位图,无需服务器端代码

    我需要使用 javascript 代码来转换 html 中的文章 帖子 以便最终用户以位图的形式查看 有没有办法在没有服务器端代码的情况下做到这一点 example p testing text here p 您可以使用例如html2can
  • 在overlayImage中应用滤镜的方法在哪里?

    我想在overlayImage中应用一个过滤器 唯一的方法是在渲染后在整个画布上应用过滤器 对此没有内置支持 但很容易 破解 var overlayImageUrl load overlay image first fabric Image
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre

随机推荐

  • 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