我一直在处理触摸事件并且有一些代码工作得非常好,直到画布没有从左上角开始。只要我在它之前添加任何内容,报告的事件就会被画布的位置所抵消。
我通过在触摸的位置周围画一个圆圈来确定这一点。圆圈始终偏离画布从屏幕左上角的偏移量。
查看触摸开始的事件,我可以看到有一个pageY可用(在chrome中,使用usb调试)。但是当我谷歌它时,似乎它不是标准的一部分,并且似乎有一些争论它可能被折旧(虽然我无法找到一种方式或另一种方式)。
所以我的问题是什么是最好的跨浏览器方法来解决这个问题(主要关注的是safari和chrome,即webkit,firefox是个不错的选择)?
鼠标事件也出现同样的问题,我为此创建了JSFiddle of the problem。但是我不确定鼠标事件和触摸事件是否有相同的属性。
我应该注意,我知道我可以硬编码偏移并且问题已经解决,但是我正在寻找一种使用手头信息的解决方案,而不需要任何特定于我的html的硬连线代码。
要重新创建JSFiddle,HTML,CSS和Javascript如下:
<div class="title"></div>
<div class="container">
<canvas id="myCanvas"></canvas>
</div>
CSS:
body {
background-color: #ff0000;
margin: 0px;
}
canvas {
display:block;
position:absolute;
width:100%;
height:100%;
background-color:#000;
}
.title {
position:absolute;
top:0px;
left:0px;
width: 100%;
height: 40px;
background-color: #888;
}
.container {
width:auto;
text-align:center;
background-color:#777;
width:100%;
position:absolute;
top:40px;
left:0px;
bottom:0px;
}
使用Javascript:
var onMouseDown = function(e) {
draw(document.getElementById('myCanvas').getContext('2d'), e.clientX, e.clientY);
}
$(function () {
document.getElementById('myCanvas').addEventListener('mousedown', onMouseDown, false);
});
function draw(ctx, x, y) {
ctx.canvas.width = ctx.canvas.offsetWidth;
ctx.canvas.height = ctx.canvas.offsetHeight;
var radius = 50;
var lineWidth = 15;
var r = 255;
var g = 75;
var b = 75;
var a75 = 0.05;
var adj = Math.abs(lineWidth / 2);
rad = radius + adj;
var stop1 = (rad - lineWidth) / rad;
var stop2 = 0;
var stop3 = stop1 + (1 - stop1) / 2;
var stop4 = 0;
var stop5 = 1;
stop2 = stop3 - (stop3 - stop1) / 2;
stop4 = stop3 + (stop5 - stop3) / 2;
var radgrad = ctx.createRadialGradient(x, y, 0, x, y, rad);
radgrad.addColorStop(stop1, 'rgba(' + r + ',' + g + ',' + b + ', 0)');
radgrad.addColorStop(stop2, 'rgba(' + r + ',' + g + ',' + b + ', .4)');
radgrad.addColorStop(stop3, 'rgba(' + r + ',' + g + ',' + b + ', 1)');
radgrad.addColorStop(stop4, 'rgba(' + r + ',' + g + ',' + b + ', .4)');
radgrad.addColorStop(stop5, 'rgba(' + r + ',' + g + ',' + b + ', 0)');
ctx.fillStyle = radgrad;
ctx.arc(x, y, rad, 0, 2 * Math.PI, true);
ctx.fill();
}
答案 0 :(得分:4)
这应该有效:http://jsfiddle.net/DG4fb/3/
您的画布顶部和左侧不是clientX == 0; clientY == 0;
,因此您需要计算偏移量。你的画布的左上角在哪里?它是offsetLeft
和offsetTop
加上其offsetParent
的值及其offsetParent.offsetParent
的值,以及其他值。这就是recursiveOffsetLeftAndTop
函数为您处理的内容。
答案 1 :(得分:0)
如果我们使用PageX和PageY而不是ClientX和ClientY,它在我的情况下完美运行......
var offsets = recursiveOffsetLeftAndTop(canvas);
var x = evt.targetTouches[0].pageX - offsets.offsetLeft;
var y = evt.targetTouches[0].pageY - offsets.offsetTop;
感谢您的解决方案。