Ответ 1
Я использую этот
var rect = e.target.getBoundingClientRect();
var x = e.targetTouches[0].pageX - rect.left;
var y = e.targetTouches[0].pageY - rect.top;
Привет, я пытаюсь получить смещение X, Y касания, которое должно быть идентично offsetX события мыши. Для этого я использовал этот код:
ev.offsetX = ev.targetTouches[0].pageX- canvasName.offsetLeft
Я даже попытался имитировать событие touch в событии мыши, но для этого мне нужно смещение X/Y, которое недоступно в событии touch. Есть ли способ offsetX/Y, который можно вычислить для касания? Пожалуйста, помогите
Я использую этот
var rect = e.target.getBoundingClientRect();
var x = e.targetTouches[0].pageX - rect.left;
var y = e.targetTouches[0].pageY - rect.top;
Вы должны использовать свойства clientX
/clientY
события мыши (или pageX
/pageY
), если у вас есть прокрутка на вашей странице.
Что касается вашего решения. Его можно исправить, используя getElementById(canvasName).clientX
ev.offsetX = ev.targetTouches[0].pageX - getElementById(canvasName).clientX
canvasName.offsetLeft
является смещением canvasName
по отношению к нему родительским. Поэтому, если вы хотите использовать offsetLeft
, вы должны сделать что-то вроде следующего
var left = 0,
elem = getElementById(canvasName);
while(elem) {
left = left + parseInt(elem.offsetLeft);
elem = elem.offsetParent;
}
ev.offsetX = ev.targetTouches[0].pageX - left
Я знаю, что это старый вопрос, но первый в google "событие offsetX touch". Я закончил эту функцию после исследования, которое я сделал.
function normalizePosition(evt, parent){ // Simple adoptation
var position = {};
position.x = (evt.targetTouches) ? evt.targetTouches[0].pageX : evt.clientX;
position.y = (evt.targetTouches) ? evt.targetTouches[0].pageY : evt.clientY;
while(parent.offsetParent){
position.x -= parent.offsetLeft - parent.scrollLeft;
position.y -= parent.offsetTop - parent.scrollTop;
parent = parent.offsetParent;
}
return position;
}
function normalizePosition(evt, parent, gridSize, offset){ // With some extra stuffs
var position = {};
position.x = (evt.targetTouches) ? evt.targetTouches[0].pageX : evt.clientX;
position.y = (evt.targetTouches) ? evt.targetTouches[0].pageY : evt.clientY;
while(parent.offsetParent){
position.x -= parent.offsetLeft - parent.scrollLeft;
position.y -= parent.offsetTop - parent.scrollTop;
parent = parent.offsetParent;
}
if(gridSize){
position.x = Math.floor(position.x / gridSize);
position.y = Math.floor(position.y / gridSize);
}
if(offset){
position.x -= offset.x;
position.y -= offset.y;
}
return position;
}
Если вы используете события касания jQuery, атрибуты layerX и layerY предоставляют относительные x и y, но не принимают во внимание преобразование. Поэтому я вручную применил преобразование, взяв значения масштаба преобразования из CSS.
e = событие касания из jQuery
parent = объект jQuery родительского элемента, к которому применяется "преобразование". Для меня это был $(e.target.parentNode);
const layerX = e.originalEvent.layerX;
const layerY = e.originalEvent.layerY;
const currentScale = 1 / parseFloat(parent.css('transform').match(/-?[\d\.]+/g)[0]);
const offsetX = layerX * currentScale;
const offsetY = layerY * currentScale;
Чтобы сделать последние две строки совместимыми с событиями касания и нажатия:
const offsetX = e.offsetX || layerX * currentScaleX;
const offsetY = e.offsetY || layerY * currentScaleY;
Ссылка для захвата значений преобразования: Получить значение css преобразования напрямую, используя jquery
Если вы используете Reactjs onClick
, то вы можете получить значение Layerx и layerY с: e.nativeEvent.layerX
. По какой-то причине layerX и layerY недоступны в событиях касания React. Если вам нужно использовать React onTouchEnd
:
const rect = e.nativeEvent.target.getBoundingClientRect();
const layerX = e.changedTouches[0].clientX - rect.left;
const layerY = e.changedTouches[0].clientY - rect.top;
const currentScale = 1 / parseFloat(parent.css('transform').match(/-?[\d\.]+/g)[0]);
const offsetX = layerX * currentScale;
const offsetY = layerY * currentScale;
Примечание. Лучше хранить значения преобразования в Redux, а не захватывать их с помощью jQuery.
Кредиты для fooobar.com/info/11599/...
function recoverOffsetValues(e) {
var rect = e.target.getBoundingClientRect();
var bodyRect = document.body.getBoundingClientRect();
var x = e.originalEvent.changedTouches[0].pageX - (rect.left - bodyRect.left);
var y = e.originalEvent.changedTouches[0].pageY - (rect.top - bodyRect.top);
return [x, y];
}