canvas 里绘制的图形不是一个实体 DOM,所以要给每个绘制的图形添加事件操作比给 DOM 添加事件要复杂很多。

所以,我们需要使用一个 canvas 的 isPointInPath(x, y) 方法,来获取鼠标相对于浏览器的坐标,然后还需要计算出鼠标相对于 canvas 画布的坐标,最后通过 isPointInPath(x, y) 方法判断此坐标是否在绘制的元素上,进行相应的操作。

isPointInPath() 方法是针对的当前绘制的路径,而鼠标在执行操作的时候,我们会根据需要监听鼠标的事件,当鼠标事件符合我们要求的时候,就对画布进行重绘。在重绘的时候,每画一条路径就调用一次 isPointInPath(x, y) 方法,判断鼠标操作的点是不是在这个绘制的元素身上,如果在,就可以对当前绘制的这个元素进行自定义操作了。

以下是绘制两个图形,并监听 mousemove 事件,来判断鼠标是否在图形上的 demo:

<style type="text/css">
*{margin:0;padding:0;}
.canvas-box {position: relative;}
canvas {box-shadow: 0 0 10px rgba(0,0,0,0.2) }
</style> <div class="canvas-box">
<canvas id="cvs" width="500" height="400">不支持canvas</canvas>
</div> <script>
var cvs = document.getElementById('cvs');
var ctx = cvs.getContext('2d');
// 封装绘制的图形
function draw () {
ctx.fillStyle = '#000';
ctx.beginPath();
ctx.moveTo(100,100);
ctx.bezierCurveTo(110,110,199,278,300,379);
ctx.lineTo(400,100)
ctx.closePath();
}
function circle () {
ctx.fillStyle = '#000';
ctx.beginPath();
ctx.arc(100,200,50,0,Math.PI*2)
ctx.closePath();
}
// 初始化绘制图形
draw();
ctx.fill()
circle();
ctx.fill()
var fns = [draw,circle];
// 监听鼠标事件
cvs.onmousemove = function (e) {
// 得到鼠标的坐标
var x = e.pageX, y =e.pageY;
ctx.clearRect(0,0,400,300)
// 遍历绘制图形
for(var i = fns.length; i--;) {
fns[i]();
// 每绘制一个图形就判断一次当前鼠标的坐标是否在这个图形上,然后进行自定义操作
if(ctx.isPointInPath(x,y)) {
ctx.fillStyle = "#f00"
} else {
ctx.fillStyle = "#000"
}
ctx.fill()
}
}
</script>

最新文章

  1. WeakHashMap回收时机
  2. ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇
  3. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
  4. [BZOJ3670][UOJ#5][NOI2014]动物园
  5. 记录Cat类的个体数目
  6. Android Studio 常用快捷键以及设置
  7. Swift-2-基本操作符
  8. SQL Server 通配符 Wildcard character
  9. android开发 Fragment嵌套调用常见错误
  10. NetWorker常用术语
  11. HTML5小游戏UI美化版
  12. APP反编译第一课《如何找到核心代码》
  13. 浅谈Fastfds+nginx结合_单机
  14. 前端要革命?看我在js里写SQL
  15. [bzoj4866] [Ynoi2017]由乃的商场之旅
  16. Android Demo手机获取验证码
  17. tar解压指定文件
  18. ubuntu下定时任务的执行
  19. Tools - 一些代码阅读的方法
  20. iOS 网易彩票-5设置模块二

热门文章

  1. 笨办法11提问-raw_input
  2. word个人信息的一种处理方式
  3. flask项目结构(六)快速开发后台flask-admin
  4. react全家桶-服务端与客户端配置
  5. 单元测试模拟-moq
  6. 一个简单的JSP程序示例
  7. SharePoint Framework 企业向导(五)
  8. Spring学习六(事物管理)
  9. TensorFlow函数:tf.ones_like
  10. Day17作业及默写