Có rất nhiều câu trả lời, ở đây trên stackoverflow, về cách lấy toạ độ của một sự kiện trên Canvas Element, liên quan đến Canvas. Tôi sử dụng giải pháp sau (getEventPosition
) và nó hoạt động tốt, ngoại trừ từ khi tôi thêm một biên giới để bạt tôi:Tìm tọa độ của sự kiện HTML5 Canvas (nhấp), với đường viền
/**** This solution gives me an offset equal to the border size
**** when the canvas has a border. Example:
**** <canvas style='border: 10px solid black; background: #333;' id='gauge_canvas' width='500' height='500'></canvas>
****/
// Get DOM element position on page
this.getPosition = function(obj) {
var x = 0, y = 0;
if (obj.offsetParent) {
do {
x += obj.offsetLeft;
y += obj.offsetTop;
obj = obj.offsetParent;
} while (obj);
}
return {'x': x, 'y': y};
};
// Get mouse event position in DOM element (don't know how to use scale yet).
this.getEventPosition = function(e, obj, aux_e, scale) {
var evt, docX, docY, pos;
evt = (e ? e : window.event);
if (evt.pageX || evt.pageY) {
docX = evt.pageX;
docY = evt.pageY;
} else if (evt.clientX || evt.clientY) {
docX = evt.clientX + document.body.scrollLeft +
document.documentElement.scrollLeft;
docY = evt.clientY + document.body.scrollTop +
document.documentElement.scrollTop;
}
// This works on hammer.js
else if (typeof aux_e !== 'undefined') {
docX = aux_e.touches[0].x;
docY = aux_e.touches[0].y;
}
pos = this.getPosition(obj);
if (typeof scale === 'undefined') {
scale = 1;
}
return {'x': (docX - pos.x)/scale, 'y': (docY - pos.y)/scale};
};
Kể từ khi mã này thuộc về thư viện của tôi và có thể mất bất cứ điều gì yếu tố canvas một người sử dụng cung cấp cho nó, khi một người dùng cung cấp cho thư viện một canvas có viền, mọi thứ sẽ bị phá vỡ. Có giải pháp lấy biên giới trong tài khoản không?
Điều này không chỉ không giải quyết được vấn đề, mà nó còn thêm chiều cao của hai phần tử h1 lên trên cùng của canvas với tọa độ y nó trả về: ( – janesconference
@janesconference Tôi đã sửa câu trả lời của mình, thử nó. bạn có thể cung cấp một jsfiddle với tất cả mã của bạn để kiểm tra nó – Oriol
giải pháp đã chỉnh sửa bao gồm cả các phần tử khác. – janesconference