获取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>


  • 2017-07-17 14:48:15

    通过node.js保存emoji到mysql

    但是emoji通过utf-8编码后,每个字符占4个字节,属于宽字符。而老版本的mysql只支持一个字符占3个字节,所以老版本的mysql是无法存储emoji的。新版本的mysql增加了字符集utf8mb4,可以支持单字符最多占4个字节。utf8mb4是utf8的超集,可以无需修改地支持原来的utf8字符 要让mysql存储emoji,需要满足2个条件:

  • 2017-07-17 14:48:20

    通过node.js保存emoji到mysql

    但是emoji通过utf-8编码后,每个字符占4个字节,属于宽字符。而老版本的mysql只支持一个字符占3个字节,所以老版本的mysql是无法存储emoji的。新版本的mysql增加了字符集utf8mb4,可以支持单字符最多占4个字节。utf8mb4是utf8的超集,可以无需修改地支持原来的utf8字符 要让mysql存储emoji,需要满足2个条件:

  • 2017-07-17 17:05:03

    大白话讲解Promise(一)

    去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范。作为ES6中最重要的特性之一,我们有必要掌握并理解透彻。本文将由浅到深,讲解Promise的基本概念与使用方法。

  • 2017-07-19 07:54:11

    Javascript中delete运算符

    Delete是Javascript语言中使用频率较低的操作之一,但是有些时候,当我们需要做delete或者清空动作时,就需要delete操作。在这篇文章中,我们将深入探讨如何使用它,以及它是如何工作的。

  • 2017-07-26 11:57:00

    Laravel 定时任务

    在 php 中使用定时器是一件不太简单的事情,之前大概只能通过 cron 来实现定时任务。但是在 Laravel5 中,定时任务将会变得很简单。