画布上的鼠标位置

Posted

技术标签:

【中文标题】画布上的鼠标位置【英文标题】:Mouse position on canvas painting 【发布时间】:2014-01-20 11:20:31 【问题描述】:

下面的代码绘制正确,但绘制到错误的坐标。它应该绘制鼠标所在的位置。我无法发现我的错误。谢谢。

JSFIDDLE

container.mousedown(function(e) 

    var parentOffset = $(this).offset(); 
    var x = e.pageX - parentOffset.left;
    var y = e.pageY - parentOffset.top;

    context_temp.beginPath();
    context_temp.moveTo(x, y);
    started = true;
);

container.mousemove(function(e) 

    var parentOffset = $(this).offset(); 
    var x = e.pageX - parentOffset.left;
    var y = e.pageY - parentOffset.top;

    if (started) 
        context_temp.lineTo(x, y);
        context_temp.stroke();
    
);

container.mouseup(function(e) 

    var parentOffset = $(this).offset(); 
    var x = e.pageX - parentOffset.left;
    var y = e.pageY - parentOffset.top;

    if (started) 
        container.mousemove(x, y);
        started = false;
        update();
    
);

【问题讨论】:

【参考方案1】:

您正在 CSS 中设置画布的宽度和高度。这只是像拉伸图像一样拉伸画布。

效果画错地方了。

相反,您需要在标签本身上设置画布尺寸:

<canvas  ></canvas>

【讨论】:

谢谢。我白白浪费了我的时间:D。但为什么一定要这样呢? 只要把画布想象成一个可以绘制的 元素,这样就更有意义了。 请注意,您也可以使用 javascript 设置宽度/高度,如下所示:canvas.width = '400'; canvas.height = '300'; @ryanbrill:是的。但是 height 和 width 属性是数字,所以没有引号会更好。 (无论哪种方式都可以,但看起来更干净。) @ryanbrill 在更正的小提琴中,我为他的“temp_canvas”做了那个:)【参考方案2】:

&lt;canvas&gt; 有自己的 widthheight,它们不仅定义了它的物理大小(除非 CSS 介入),还定义了它的逻辑大小(其绘图表面上的像素行数/列数) )。当 CSS 更改大小时,画布会拉伸以适应大小,但不会更改其 逻辑 大小。基本上,像素也会拉伸,因此逻辑坐标和物理坐标不再匹配。

要解决此问题,您可以进行数学计算以匹配备份的坐标,或者专门使用画布自己的宽度/高度来调整它们的大小,或者在事后设置画布的宽度和高度属性以匹配宽度和高度由 CSS 设置。

【讨论】:

以上是关于画布上的鼠标位置的主要内容,如果未能解决你的问题,请参考以下文章

鼠标位置上的 WPF 缩放画布中心

查找相对于元素的鼠标位置

画布中的真实鼠标位置

如何使画布元素根据鼠标位置填充和重新填充

在画布上用鼠标绘图。笔划与当前鼠标位置不匹配

使用图像在画布上绘图时如何更正笔画位置?用打字稿角