获取canvas中鼠标的坐标,并绘制图片

2019-04-15 11:22:35

难点在于,cavas可能放大,然后画图的坐标就会改变了,必须也要跟着放大缩小。


// 监听点击事件

canvas.addEventListener("click", function(event) {

    getMousePos(canvas, event);

});


function getMousePos(canvas, event) {

    //1

    var rect = canvas.getBoundingClientRect();

    //2

    var x = (event.clientX - rect.left) * (canvas.width / rect.width);

    var y = (event.clientY - rect.top)* (canvas.height / rect.height);

    console.log("x:"+x+",y:"+y);

}



解析

getBoundingClientRect()

这个方法返回的对象有六个属性,如下表:


属性 描述

top 元素上边界距窗口最上边的距离

left 元素左边界距窗口最左边的距离

bottom 元素下边界距窗口最上边的距离

right 元素右边界距窗口最左边的距离

width 元素的宽度

height 元素的高度

rect.left * (canvas.width / rect.width)

之所以要乘一个(canvas.width / rect.width),是为了保证画布的像素值和显示在页面上的尺寸不一致的情况下,也能够正确获取到鼠标相对于canvas中的坐标。


画布的像素值和显示在页面上的尺寸不一致的情况


<canvas id="canvasId" width="100" height="100" style="width: 500px;height: 500px;"></canvas>


  • 2018-03-09 11:45:11

    SQL SELECT DISTINCT 语句

    如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:

  • 2018-03-13 22:42:44

    TraceView报错:unable to open trace file

    程序效率有些问题,想起用TraceView来分析一下,可是一直报标题中的错误,无法创建出我所需要的aa.trace文件,分析也就无从做起。

  • 2018-03-14 17:41:44

    MySQL的if,case语句使用总结

    Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: