运行截图如下:

点击某个圆后:

代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><canvas id="canvas" style="border: 1px solid #aaa; display: block; margin: 50px auto;">当前浏览器不支持canvas
</canvas><script>let balls = [];let canvas = document.getElementById("canvas");let context = canvas.getContext("2d");window.onload = function(){canvas.width = 800;canvas.height = 800;for(let i = 0; i < 10; i++){let ball = {x: Math.random() * canvas.width,y: Math.random() * canvas.height,r: Math.random() * 50 + 20};balls[i] = ball;}draw();canvas.addEventListener("mouseup", detect);}function draw(){for(let i = 0; i < balls.length; i++){context.beginPath();context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);context.fillStyle = "#058";context.fill();}}function detect(event){let x = event.clientX - canvas.getBoundingClientRect().left;let y = event.clientY - canvas.getBoundingClientRect().top;console.log("x:" + x + "  y:" + y);for(let i = 0; i < balls.length; i++){context.beginPath();context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);if(context.isPointInPath(x, y)){context.fillStyle = "red";context.fill();}}}</script></body>
</html>

这里简单说下逻辑,通过canvas.addEventListener监听鼠标弹起的事件,然后通过

let x = event.clientX - canvas.getBoundingClientRect().left;
let y = event.clientY - canvas.getBoundingClientRect().top;

获取当前再canvas中的点的坐标,每次鼠标弹起的时候就进行重绘。

if(context.isPointInPath(x, y)){context.fillStyle = "red";context.fill();
}

isPointInPath()方法当点位于当前路径中,则返回true,否则返回false

下面给出另外一种方法:

function mouseoverFunction(event){let mouseX = event.offsetX;let mouseY = event.offsetY;for(let i = 0; i < XXXXXXXObjects.length; i++){if((XXXXXXXObjects[i].x <= mouseX && (XXXXXXXObjects[i].x + XXXXXXXObjects[i].width) >= mouseX) &&(XXXXXXXObjects[i].y <= mouseY && (XXXXXXXObjects[i].y + XXXXXXXObjects[i].height) >= mouseY)){XXXXXXXObjects[i].onClicked();}}
}

通过这种方式也可以获取x,y在canvas中的坐标,并且判断数组里面的图形,x,y是否在点击的坐标中,如果是就调用onClicked函数。

canvas笔记-canvas中用户与图形交互相关推荐

  1. canvas笔记-canvas适应浏览器(填充整个页面)

    这里有2个地方要设置: 1.html中的style. 2.在js中获取父类的width或height. 如下,第一个问题: index.html <!DOCTYPE html> <h ...

  2. canvas笔记-canvas加载图片及放缩及加水印(两canvas同时使用)

    首先是图片放缩 程序运行截图如下: 拉动滑动条: 源码如下: <!DOCTYPE html> <html lang="en"> <head>&l ...

  3. canvas笔记-canvas基本用法

    这里有几个要注意的地方: 通过下面这两种方式设置画布的高度和宽度 及 通过下面这两种方式对不支持canvas浏览器进行提示: 及 最后一点,在canvas画图和Qt上用QPainter一模一样,都是基 ...

  4. canvas笔记-在canvas中使用其他HTML元素

    这里使用的原理是使用css把div中关于html的元素通过布局位置,以及透明相关的设置,将其设置到canvas上,这样看起来就是在canvas绘制的按钮.然后使用JavaScript获取按钮的数据或者 ...

  5. canvas笔记-图形变换(位移translate、缩放scale、变换矩阵transform)

    这里首先演示下位移,这里使用的函数是translate(x, y)这个函数是叠加的,也就是说,当translate(100, 100),后再次调用translate(200, 200),那么最后圆点的 ...

  6. Demo_使用canvas在Vue中绘制蚂蚁线(Ps中选择图形时出现的可动的虚线)

    1. 需求效果 需要一个蚂蚁线,周围边框可动,效果如下: 2. 实现代码 <template><div><canvas id="canvas" wid ...

  7. 【HTML5】在canvas上绘制简单的2D图形 (+太极图)

    canvas(画布) canvas 元素是H5中新增的一个重要元素,专门用来绘制图形.在页面中放置一个canvas元素,就相当于在页面上放置一块画布,可以利用 canvas api 在其中进行图形的描 ...

  8. Canvas学习笔记 Canvas的基础知识点

    文章目录 前言 一.导航 初始化 属性与方法 小demo 二.绘制功能 2.1.绘制矩形 2.1.1.非面向思想实现动画 2.1.2.面向对象思维实现动画 2.2.绘制路径 2.3.绘制圆弧(动态圆形 ...

  9. html5怎么画坐标图,新手如何5分钟学会用canvas在HTML5上画简单图形

    HTML5中的另外一个新元素是标签.须要使用JavaScript来操做和绘制画布. canvas元素为脚本提供了一个依赖于分辨率的位图画布,它能够用于呈现图形.游戏图形或其余可视图像. 当一个更合适的 ...

最新文章

  1. 机器人操作系统来到Windows
  2. Spring Integration学习资料
  3. pip 指定 安装源
  4. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升|ICLR 2021
  5. 全国计算机等级考试题库二级C操作题100套(第89套)
  6. 第七节:实战前必须掌握的10个指令(上)
  7. 如何在Oracle数据库内格式化SQL或PL/SQL ?
  8. Kotlin定义静态变量、静态方法
  9. linux zfs raid,ZFS-自我恢复RAID
  10. 用户名、密码都有值激活提交按钮
  11. 交叉编译opencv:undefined reference to `png_riffle_palette_neon
  12. DSP28335定时器简易秒表设计
  13. 计算机开平方的三种算法
  14. 史上最全各种简历模板,自荐信模板和面试技巧
  15. vue报错:Not Found - GET https://registry.npmjs.org/- Not found
  16. 工厂厂里的SIS系统
  17. 类似 毕克BYK354流平剂 荟研 溶剂型体系 润湿流平
  18. 手机html5活体检测,手把手教你做实时活体检测系统
  19. 当SWOOLE遇上PROTOCOL
  20. 区块链运作机制_什么是区块链及其运作方式?

热门文章

  1. mysql 日期操作 增减天数、时间转换、时间戳(转换)
  2. 巧妙喝水打败多种疾病(节选)
  3. IE被哪个T吗D修改了,卧槽!
  4. 2013年,6月20日,今天非常无聊啊。
  5. WZ132源代码行侠仗义
  6. 好的飞鸽传书2007未必是“语言律师”
  7. 美国凤凰号探测器从火星土壤中提取到水
  8. 太残忍!麦当劳用毒气室杀鸡
  9. 经典面试题(45):以下代码将输出的结果是什么?
  10. MySQL按字符串hash分区_MySQL学习笔记(14):分区