【问题标题】:HTML 5 Canvas Co-Ordinates and browser pixels correlation?HTML 5 Canvas Co-Ordinates 和浏览器像素相关?
【发布时间】:2013-01-18 07:00:23
【问题描述】:

我正在尝试为我的应用程序获取 HTML 5 画布作为绘图板。我面临的问题是:

绘图发生在鼠标指针的某个偏移处。我正在使用 Jquery .offset 方法来计算画布上事件的偏移量。我注意到的另一件奇怪的事情是 虽然画布标签的宽度是 150 像素,但从 (0,10) 到 (150,10) 绘制的一条线刚好到达画布区域的中间,甚至一条线为大到 (0,10) 到 (250,10) 也是可见的。从事件对象映射计算的“像素”不是直接到画布标签的“点坐标”吗?这里还有什么问题?示例代码:

 if (event.pageX || event.pageY)
 {
    event._x = event.pageX;
    event._y = event.pageY;
}
else if (event.clientX || event.clientY)
{
    event._x = event.clientX + document.body.scrollLeft
                            + document.documentElement.scrollLeft;
    event._y = event.clientY + document.body.scrollTop
                            + document.documentElement.scrollTop;
}

var canvasElem = $('#' + canvasId);
canvasOffset = canvasElem.offset();

event._x -= Math.floor(canvasOffset.left);
event._y -= Math.floor(canvasOffset.top);

////////////// CODE STRIPPED //////////////////////////////


  this.mousedown = function (ev) { 
       context.beginPath(); 
       context.moveTo(ev._x, ev._y); 
       tool.started = true; 
  }; 

  // This function is called every time you move the mouse. Obviously, it only  
  // draws if the tool.started state is set to true (when you are holding down  
  // the mouse button). 
 this.mousemove = function (ev) { 
      if (tool.started) { 
         context.lineTo(ev._x, ev._y); 
         context.stroke(); 
       } 
 }; 

// This is called when you release the mouse button. 
this.mouseup = function (ev) { 
      if (tool.started) { 
         tool.mousemove(ev); 
         tool.started = false; 
      }
}

已解决

发现问题:

我使用字符串来设置画布的高度和宽度。 就像是: canvas.height = "200px";

但是我们应该总是使用数字来设置画布的高度/宽度。 canvas.height = 200;

这样就解决了问题。

【问题讨论】:

  • 你能提供一个jsFiddle的例子吗?

标签: javascript jquery html html5-canvas dom-events


【解决方案1】:

您可以使用 jQuery .offset() 函数获取画布左上角的坐标。从鼠标事件传递的坐标中减去这些,你就得到了画布上的位置。

关于您遇到的缩放问题,有两种可能的解释:

答:您使用translate, transform or scale 来更改画布的坐标系(但当您这样做时,您肯定会意识到这一点)

B:您正在使用 CSS 样式属性来更改画布的大小。画布的分辨率由<canvas> HTML 标记的widthheight 属性决定。当您使用 CSS 更改呈现画布的宽度或高度时,它首先以内部分辨率绘制,然后相应地缩放以在浏览器中显示。

【讨论】:

  • 节省了我写解释的时间。 +1
  • @philipp 我正在使用您提到的确切机制。但是我的代码中没有发生A和B,还有其他原因吗?我会发布整个代码,但作为一个通用的画布解决方案,我正在编写代码超过 500 行。让我知道我是否可以提供任何其他信息,这可能有助于缩小问题范围。非常感谢您的帮助。
  • @user1989521 可能还有很多其他原因,但不看你的代码,我的猜测和你的一样好。尝试通过将代码精简到仍然执行并显示错误的最低限度来缩小错误范围。在此过程中,您自己发现错误的机会很高。如果您仍然不确定出了什么问题,请将您的最小化示例发布到 jsfiddle.net 并给我们链接。
  • @Philipp 非常感谢您的帮助。你确实推动了我的解决方案。我使用字符串来设置高度,但阅读了明确提到我应该使用数字而不是字符串的 Canvas Spec :)。非常感谢。
猜你喜欢
  • 2016-01-04
  • 2011-12-13
  • 1970-01-01
  • 2011-11-21
  • 2011-02-10
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多