我正在尝试将功能实现为带画布的firefox附加组件的一部分,该附加组件使用户能够进行绘制。

function draw(event,context,drawit) {
var drawx = event.layerX;
var drawy = event.layerY;

if (!drawit) {
        context.beginPath();
        context.strokeStyle='rgb(0,255,0)';
        context.lineWidth=1;
        context.moveTo(drawx,drawy);
        drawit = true;
} else {
        context.lineTo(drawx,drawy);
        context.stroke();
}


};

这行得通,但layerX / layerY的结果与绘制的线之间似乎有差异。只能在canvas元素的左上方绘制。当鼠标指针到达该元素的一半时,该行不再前进。

我已经检查了元素在Firebug中的位置,看起来还可以:画布位于div元素内部,并且两者的定义宽度均为100%,而图形结束于元素的约50%。它也可以手动设置值,以便在画布元素的右侧也绘制线条。
有谁知道出什么问题了吗?

最佳答案

当鼠标指针到达该元素的一半时,该行不再前进。


发生这种情况的原因可能很多。错误翻译的上下文(来自旋转/平移/缩放)和画布大小不匹配(您在html中写的内容以及在代码中的考虑内容)。

您确定LayerX和LayerY正在为您提供正确的鼠标坐标吗?您在layerx / y与绘制内容之间的“差异”到底是什么意思?有补偿吗?我问是因为我的鼠标代码有点复杂:

// Sets mx,my to the mouse position relative to the canvas
// unfortunately this can be tricky, we have to worry about padding and borders
function getMouse(e) {
      var element = canvas, offsetX = 0, offsetY = 0;

      if (element.offsetParent) {
        do {
          offsetX += element.offsetLeft;
          offsetY += element.offsetTop;
        } while ((element = element.offsetParent));
      }

      // Add padding and border style widths to offset
      offsetX += stylePaddingLeft;
      offsetY += stylePaddingTop;

      offsetX += styleBorderLeft;
      offsetY += styleBorderTop;

      mx = e.pageX - offsetX;
      my = e.pageY - offsetY
}

09-25 21:19