Знайдіть положення миші відносно елемента


244

Я хочу зробити невеликий додаток для малювання за допомогою полотна. Тому мені потрібно знайти положення миші на полотні.


2
Повне рішення: acko.net/blog/…
edA-qa mort-ora-y

3
Я люблю, як короткий, але пояснює все, що ця публікація.
dwjohnston

Це справді старе, але я щойно розпочав проект GitHub, який, серед іншого, робить саме те, що потрібно: brainlessdeveloper.com/mouse-move-interaction-spot-js
Fausto NA

Відповіді:


177

Для людей, які використовують JQuery:

Іноді, коли ви вкладете елементи, один із них із подіями, приєднаними до нього, може бути заплутаним розуміння того, що ваш браузер бачить як батьків. Тут ви можете вказати, хто з батьків.

Ви приймаєте позицію миші, а потім віднімаєте її з положення зміщення батьківського елемента.

var x = evt.pageX - $('#element').offset().left;
var y = evt.pageY - $('#element').offset().top;

Якщо ви намагаєтеся отримати позицію миші на сторінці всередині панелі прокрутки:

var x = (evt.pageX - $('#element').offset().left) + self.frame.scrollLeft();
var y = (evt.pageY - $('#element').offset().top) + self.frame.scrollTop();

Або позиція відносно сторінки:

var x = (evt.pageX - $('#element').offset().left) + $(window).scrollLeft();
var y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();

Зверніть увагу на таку оптимізацію продуктивності:

var offset = $('#element').offset();
// Then refer to 
var x = evt.pageX - offset.left;

Таким чином, JQuery не повинен шукати #elementкожен рядок.

Оновлення

Нижче є новіша версія, доступна лише для JavaScript @anytimecoder, для браузерів, що підтримують getBoundingClientRect () .


7
Чи спрацювало це для вас @ben, я би вдячний за "правильну відповідь" або коментар до того, що для вас ще не працює. Можливо, я можу допомогти далі.
sparkyspider

8
Слід уникати використання $ ('selector') в обробці подій, якщо ви не хочете дуже млявий код. Попередньо виберіть елемент та використовуйте попередньо вибрану посилання у своєму обробнику. Те саме для $ (window) зробіть це один раз і кешуйте його.
Остін Франція

2
це не обов'язкова згадка: якщо ви копіюєте вставлення вищевказаного коду, не забудьте виправити var y = (evt.pageY - $('#element').offset().left) + $(window).scrollTop();цеvar y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();
Радж Натані

77
Якою може бути відповідь, оскільки питання не має нічого спільного з jQuery?
FlorianB

2
@Black, але деякі люди задають речі в JavaScript, а не jquery, тому що jquery може не бути сумісним у своїх умовах.
дбр

307

Оскільки я не знайшов відповідь без jQuery, що можу скопіювати / вставити, ось таке рішення я використав:

function clickEvent(e) {
  // e = Mouse click event.
  var rect = e.target.getBoundingClientRect();
  var x = e.clientX - rect.left; //x position within the element.
  var y = e.clientY - rect.top;  //y position within the element.
}

JSFiddle повного прикладу


2
Вам потрібно округлювати обмежувальну пряму, щоб забезпечити цілі значення за допомогою цього методу.
Джейк Кобб

2
Нова редакція повинна виправити проблеми прокрутки (використовуючи clientX / Y)
Ерік Коопманс,

6
За цю відповідь слід проголосувати. Дякую anytimecoder та @ErikKoopmans.
Іван

3
PSA: коментар @mpen застарілий; цей метод спрацьовує навіть у випадках із прокруткою. Дивіться оновлену версію їх Fiddle
Xharlie

4
Дякую! Одна примітка: вам потрібно e.currentTarget, а не цільовий ціль. Інакше на це вплинуть дитячі елементи
Максим Георгієвський

60

Далі обчислює відношення положення миші до елемента полотна:

var example = document.getElementById('example'); 
example.onmousemove = function(e) { 
    var x = e.pageX - this.offsetLeft; 
    var y = e.pageY - this.offsetTop; 
}

У цьому прикладі thisпосилається на exampleелемент і eє onmousemoveподія.


83
Можливо, це я, але у двох рядках кодів, у яких використовується ключове слово "цей", немає контексту?
Дератрій

9
Однозначно бракує контексту. "е" - це подія, а "це" - елемент, з яким пов'язана подія var example = document.getElementById('example'); example.onmousemove = function(e) { var X = e.pageX - this.offsetLeft; var Y = e.pageY - this.offsetTop; }
Нік Бісбі

22
Це не працює, якщо деякий нащадковий елемент використовує відносне або абсолютне позиціонування.
edA-qa mort-ora-y

12
Ви можете переключитися на thisце e.currentTarget, і ви отримаєте позицію відносно елемента, до якого ви додали слухача події.
Linus Unnebäck

2
Це, здається, надає позиції відновлення видимої частини елемента, а не цілого елемента. Чи є спосіб, як це зробити, якщо частина елемента неможливо побачити у вікні перегляду та є смуги прокрутки тощо?
frabjous

37

У чистому JavaScript немає відповіді, яка повертає відносні координати, коли опорний елемент вкладений всередині інших, який може бути з абсолютним позиціонуванням. Ось рішення цього сценарію:

function getRelativeCoordinates (event, referenceElement) {

  const position = {
    x: event.pageX,
    y: event.pageY
  };

  const offset = {
    left: referenceElement.offsetLeft,
    top: referenceElement.offsetTop
  };

  let reference = referenceElement.offsetParent;

  while(reference){
    offset.left += reference.offsetLeft;
    offset.top += reference.offsetTop;
    reference = reference.offsetParent;
  }

  return { 
    x: position.x - offset.left,
    y: position.y - offset.top,
  }; 

}

3
Я не думаю, що він враховує htmlзміщення елементів
apieceofbart

3
Чудово підходить для прокрутки контейнерів, лише з невеликою зміною: замінити while(reference !== undefined)на while(reference). У Chrome, принаймні, offsetParent не закінчується undefined, але null. Просто перевірка того, чи referenceє truthy, забезпечить, що вона працює з обома undefinedта null.
блекс

Я б дав ще +1, якби міг, бо дав мені знати, що є offsetParentвластивість, яка виявляється дуже корисною і в інших ситуаціях!
FonzTech

Взагалі перевірка проти невизначеного зазвичай погана ідея
Хуан Мендес

Я думаю, вам потрібно відняти scrollLeftі scrollTopкомпенсувати прокручені нащадки.
Роберт

20

Гарну інформацію про складність цієї проблеми можна знайти тут: http://www.quirksmode.org/js/events_properties.html#position

Використовуючи описану там техніку, ви можете знайти положення миші в документі. Тоді ви просто перевірити, якщо він знаходиться всередині обмежує рамки вашого елемента, який ви можете знайти за покликанням , element.getBoundingClientRect()який буде повертати об'єкт з наступними властивостями: { bottom, height, left, right, top, width }. Звідси неважливо з'ясувати, чи все-таки трапилося всередині вашого елемента чи ні.


1
На жаль, це не вдається, якщо відбувається якась ротація
Ерік

17

Я спробував усі ці рішення, і завдяки моєму спеціальному налаштуванню з матричним перетвореним контейнером (бібліотека panzoom) жоден не працював. Це повертає правильне значення, навіть якщо його масштабують і вмикають:

mouseevent(e) {
 const x = e.offsetX,
       y = e.offsetY
}

Але тільки в тому випадку, якщо в дорозі немає елементів дитини. Це можна обійти, зробивши їх «невидимими» для події, використовуючи CSS:

.child {
   pointer-events: none;
}

3
Це, безумовно, спосіб зробити це у 2019 році. Інші відповіді всі завантажені старим багатим багажем.
Колін Д

1
@ColinD дякую! Я забув додати, що це працює і в IE11.
Фабіан фон Еллертс

Це працювало для мене. Однак я підозрюю, що 1) Кілька рейтингів 2) Відповіді з більш високою оцінкою є набагато складнішими і 3) Я не бачу пояснення недоліків. Хтось знає якийсь мінус використання цього підходу?
Марк Е

1
@MarkE У цьому немає нічого підозрілого. Це одна з багатьох помилок StackOverflow. Ті відповіді, які ви бачите вгорі, були опубліковані за багато років до цієї відповіді тут, тож вони набрали величезного оберту голосу. Після того, як відповідь набирає такого оберту, перемогти її досить важко і досить рідко.
Джек Гіффін

9

Я наштовхнувся на це питання, але для того, щоб він працював у моєму випадку (використовуючи дравер на DOM-елементі (в моєму випадку не є полотном)), я виявив, що вам потрібно використовуватись offsetXі offsetYна події драговер-миша .

onDragOver(event){
 var x = event.offsetX;
 var y = event.offsetY;
}

2
це чудово працювало для мене. чому ніхто цього не підтримував? Цікаво, чи є якісь підводні камені. Якщо я знайду будь-який, я звітую про це!
морський бас

7
event.offsetX по відношенню до елемента, яким покажчик миші зараз закінчений, а не до елемента, до якого приєднаний драувер-слухач. Якщо у вас немає вкладеної структури елементів, це нормально, але якщо ви це зробите, це не спрацює.
opsb

7

Я поставив +1 "Відповідь Марка ван Віка, оскільки він мене направив у правильному напрямку, але не зовсім вирішив це для мене". У мене все ще було зрушення в малюванні елементів, що містяться в іншому елементі.

FOllowing вирішив це для мене:

        x = e.pageX - this.offsetLeft - $(elem).offset().left;
        y = e.pageY - this.offsetTop - $(elem).offset().top;

Іншими словами - я просто склав усі компенсації від усіх вкладених елементів


+1 для вас! Це відповідь, яку я шукав. У мене було два полотна, розміщені один на одного, і координати були неправильні через інші диви. Я знав, що це проблема, але не знав логіки / рівняння для її компенсації. Ви також вирішили мою проблему! = D дякую!
Партак

5

Жоден із наведених відповідей не є задовільним ІМО, тому ось що я використовую:

// Cross-browser AddEventListener
function ael(e, n, h){
    if( e.addEventListener ){
        e.addEventListener(n, h, true);
    }else{
        e.attachEvent('on'+n, h);
    }
}

var touch = 'ontouchstart' in document.documentElement; // true if touch device
var mx, my; // always has current mouse position IN WINDOW

if(touch){
    ael(document, 'touchmove', function(e){var ori=e;mx=ori.changedTouches[0].pageX;my=ori.changedTouches[0].pageY} );
}else{
    ael(document, 'mousemove', function(e){mx=e.clientX;my=e.clientY} );
}

// local mouse X,Y position in element
function showLocalPos(e){
    document.title = (mx - e.getBoundingClientRect().left)
        + 'x'
        + Math.round(my - e.getBoundingClientRect().top);
}

І якщо вам колись потрібно знати поточну позицію прокрутки Y:

var yscroll = window.pageYOffset
        || (document.documentElement && document.documentElement.scrollTop)
        || document.body.scrollTop; // scroll Y position in page

4

Для тих, хто розробляє звичайні веб-сайти або PWA (прогресивні веб-програми) для мобільних пристроїв та / або ноутбуків / моніторів з сенсорними екранами, ви приземлилися сюди, тому що вас можуть використовувати для проведення подій миші та є новим для часом болісного досвіду дотику події ... так!

Існує лише 3 правила:

  1. Робіть якомога менше під час mousemoveабо touchmoveподій.
  2. Робіть якомога більше під час mousedownабо touchstartподій.
  3. Скасуйте розповсюдження та запобігайте налаштуванням за замовчуванням для подій на дотик, щоб запобігти появі подій миші також на гібридних пристроях.

Потрібно сказати, що з touchподіями все складніше, тому що їх може бути більше, і вони більш гнучкі (складніші), ніж події миші. Я збираюся тут висвітлити лише один дотик. Так, я лінуюся, але це найпоширеніший тип дотику, тому є.

var posTop;
var posLeft;
function handleMouseDown(evt) {
  var e = evt || window.event; // Because Firefox, etc.
  posTop = e.target.offsetTop;
  posLeft = e.target.offsetLeft;
  e.target.style.background = "red";
  // The statement above would be better handled by CSS
  // but it's just an example of a generic visible indicator.
}
function handleMouseMove(evt) {
  var e = evt || window.event;
  var x = e.offsetX; // Wonderfully
  var y = e.offsetY; // Simple!
  e.target.innerHTML = "Mouse: " + x + ", " + y;
  if (posTop)
    e.target.innerHTML += "<br>" + (x + posLeft) + ", " + (y + posTop);
}
function handleMouseOut(evt) {
  var e = evt || window.event;
  e.target.innerHTML = "";
}
function handleMouseUp(evt) {
  var e = evt || window.event;
  e.target.style.background = "yellow";
}
function handleTouchStart(evt) {
  var e = evt || window.event;
  var rect = e.target.getBoundingClientRect();
  posTop = rect.top;
  posLeft = rect.left;
  e.target.style.background = "green";
  e.preventDefault(); // Unnecessary if using Vue.js
  e.stopPropagation(); // Same deal here
}
function handleTouchMove(evt) {
  var e = evt || window.event;
  var pageX = e.touches[0].clientX; // Touches are page-relative
  var pageY = e.touches[0].clientY; // not target-relative
  var x = pageX - posLeft;
  var y = pageY - posTop;
  e.target.innerHTML = "Touch: " + x + ", " + y;
  e.target.innerHTML += "<br>" + pageX + ", " + pageY;
  e.preventDefault();
  e.stopPropagation();
}
function handleTouchEnd(evt) {
  var e = evt || window.event;
  e.target.style.background = "yellow";
  // Yes, I'm being lazy and doing the same as mouseout here
  // but obviously you could do something different if needed.
  e.preventDefault();
  e.stopPropagation();
}
div {
  background: yellow;
  height: 100px;
  left: 50px;
  position: absolute;
  top: 80px;
  user-select: none; /* Disable text selection */
  -ms-user-select: none;
  width: 100px;
}
<div 
  onmousedown="handleMouseDown()" 
  onmousemove="handleMouseMove()"
  onmouseout="handleMouseOut()"
  onmouseup="handleMouseUp()" 
  ontouchstart="handleTouchStart()" 
  ontouchmove="handleTouchMove()" 
  ontouchend="handleTouchEnd()">
</div>
Move over box for coordinates relative to top left of box.<br>
Hold mouse down or touch to change color.<br>
Drag to turn on coordinates relative to top left of page.

Віддаєте перевагу використовувати Vue.js ? Я згоден! Тоді ваш HTML виглядатиме так:

<div @mousedown="handleMouseDown"
     @mousemove="handleMouseMove"
     @mouseup="handleMouseUp"
     @touchstart.stop.prevent="handleTouchStart"
     @touchmove.stop.prevent="handleTouchMove"
     @touchend.stop.prevent="handleTouchEnd">

3

ви можете отримати його

var element = document.getElementById(canvasId);
element.onmousemove = function(e) {
    var xCoor = e.clientX;
    var yCoor = e.clientY;
}

Чи буде це працювати в IE, чи IE все ще використовує window.event замість передачі події першому аргументу слухача? редагувати - я думаю, що IE не вистачає елемента полотна до версії 9, але це, мабуть, має підтримувати IE через такі речі, як екванви ....
Dagg Nabbit

21
Це дасть координати відносно вікна браузера, все ще потрібно з’ясувати, чи знаходяться вони в елементі, використовуючи element.getBoundingClientRect ()
David W. Keith

дякую за те, що я дав мені знати про getBoundingClientRect !!!! Я ніколи не усвідомлював, що існує таке!
Гершом

@ DavidW.Keith коментар дійсно слід вважати правильною відповіддю!
Ульрік. S

3

Взяте з цього підручника із виправленнями, внесеними завдяки головному коментарю:

function getMousePos( canvas, evt ) {
    var rect = canvas.getBoundingClientRect();
    return {
        x: Math.floor( ( evt.clientX - rect.left ) / ( rect.right - rect.left ) * canvas.width ),
        y: Math.floor( ( evt.clientY - rect.top ) / ( rect.bottom - rect.top ) * canvas.height )
    };
}

Використовуйте на полотні так:

var canvas = document.getElementById( 'myCanvas' );
canvas.addEventListener( 'mousemove', function( evt ) {
    var mousePos = getMousePos( canvas, evt );
} );

3

Я розумію, що я трохи спізнююся, але це працює з PURE javascript, і він навіть дає вам координати вказівника всередині елемента, якщо елемент більший за вікно перегляду та користувач прокрутив.

var element_offset_x ; // The distance from the left side of the element to the left of the content area


....// some code here (function declaration or element lookup )



element_offset_x = element.getBoundingClientRect().left  -  document.getElementsByTagName("html")[0].getBoundingClientRect().left  ;

....// code here 




function mouseMoveEvent(event) 
{
   var pointer_location = (event.clientX + window.pageXOffset) - element_offset_x ; 
}

Як це працює.

Перше, що ми робимо - це розташування елемента HTML (область вмісту) щодо поточного вікна перегляду. Якщо на сторінці є смуги прокрутки і прокручується, то число, повернене getBoundingClientRect().leftдля тега html, буде негативним. Потім ми використовуємо це число для обчислення відстані між елементом та зліва від області вмісту. Зelement_offset_x = element.getBoundingClientRect().left......;

Знаючи відстань елемента від області вмісту. event.clientXдає нам відстань вказівника від вікна перегляду. Важливо розуміти, що вікно перегляду та область вмісту є двома різними об'єктами. Програма перегляду може переміщуватися, якщо сторінка прокручується. Отже, clientX поверне той самий номер, навіть якщо сторінка прокручена.

Щоб компенсувати це, нам потрібно додати положення х вказівника (відносно вікна перегляду), до положення х області перегляду (відносно області вмісту). Позиція X у вікні перегляду знайдено з window.pageXOffset.


1
Дякуємо, що ви єдиний відповідач, який задумався про прокручування. Спробуйте змінити свою відповідь, щоб додати також вісь y.
frabjous

3

На основі рішення @ Spider моя версія, яка не є JQuery, така:

// Get the container element's bounding box
var sides = document.getElementById("container").getBoundingClientRect();

// Apply the mouse event listener
document.getElementById("canvas").onmousemove = (e) => {
  // Here 'self' is simply the current window's context
  var x = (e.clientX - sides.left) + self.pageXOffset;
  var y = (e.clientY - sides.top) + self.pageYOffset;
}

Це працює як з прокруткою, так і з масштабуванням (у такому випадку іноді вона повертає плаває).


Я б схвалив, але чи не повинні це бути мінусові знаки для зміщення сторінки? Або це, або дужки навколо другої частини?
Кріс Сунамі підтримує Моніку

1

Координати миші всередині полотна можна отримати завдяки event.offsetX та event.offsetY. Ось невеликий фрагмент, який підтверджує мою думку:

c=document.getElementById("c");
ctx=c.getContext("2d");
ctx.fillStyle="black";
ctx.fillRect(0,0,100,100);
c.addEventListener("mousemove",function(mouseEvt){
  // the mouse's coordinates on the canvas are just below
  x=mouseEvt.offsetX;
  y=mouseEvt.offsetY;
  // the following lines draw a red square around the mouse to prove it
  ctx.fillStyle="black";
  ctx.fillRect(0,0,100,100);
  ctx.fillStyle="red";
  ctx.fillRect(x-5,y-5,10,10);
});
  
body {
  background-color: blue;
}

canvas {
  position: absolute;
  top: 50px;
  left: 100px;
}
<canvas id="c" width="100" height="100"></canvas>
    


Це не працює, якщо інший дів накладає полотно, так, як сказав @opsb
Девід Пейхо,

1
canvas.onmousedown = function(e) {
    pos_left = e.pageX - e.currentTarget.offsetLeft;
    pos_top = e.pageY - e.currentTarget.offsetTop;
    console.log(pos_left, pos_top)
}

HTMLElement.offsetLeft

В HTMLElement.offsetLeftтільки для читання , повертається власність кількість пікселів , що верхній лівий кут поточного елемента зміщений вліво в межах HTMLElement.offsetParentвузла.

Для елементів рівня блоку, offsetTop, offsetLeft, offsetWidth, і offsetHeightописують кордону блоку елемента щодо offsetParent.

Однак для елементів вбудованого рівня (таких як span), які можуть переходити від однієї лінії до другої, offsetTopі offsetLeftописувати положення першої рамкової рамки (використовувати Element.getClientRects()для отримання її ширини та висоти), а offsetWidthтакож offsetHeightописувати розміри обмежувальної рамки (використовувати Element.getBoundingClientRect()для отримання його позиції). Таким чином, коробка з лівого, верхньою частиною, шириною і висотою offsetLeft, offsetTop, offsetWidthі offsetHeightне становитиме обмежує прямокутником для діапазону з загорнутим текстом.

HTMLElement.offsetTop

HTMLElement.offsetTopВластивість тільки для читання повертає відстань поточного елемента по відношенню до верхньої частини offsetParentвузла.

MouseEvent.pageX

pageXВластивість тільки для читання повертає Х (горизонтальна) координата в пікселях подій щодо всього документа. Ця властивість враховує будь-яке горизонтальне прокручування сторінки.

MouseEvent.pageY

В MouseEvent.pageYтільки для читання , повертає нерухомість Y ( по вертикалі) координати в пікселях подій щодо всього документа. Ця властивість враховує будь-яке вертикальне прокручування сторінки.

Для подальшого пояснення див. Мережу розробників Mozilla:

https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageX https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY https: // developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop


Хоча цей фрагмент коду може вирішити питання, у тому числі пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
Патрік Гунд

Я дуже сподіваюся, що читачі в майбутньому матимуть API JS, який обчислює це для них. ;-) Це, мабуть, найпростіша повноцінна відповідь. Коментуючи сам пояснювальний код, це просто відволікає відходи.
lama12345

Я другий @ PatrickHund прохання про пояснення. Я не фахівець з CSS / JS, і знаю більше про відносини між, наприклад, pageі offsetмені було б дуже корисно. Дякуємо, що розглянули цей запит!
cxw

@cxw Добре, ти зараз другий потік (мав 1 підсумок) ... Я зараз додав довге пояснення, це як 10 разів, поки 4 рядки коду. Запрошуємо вас, весело читайте. Я розглядав ваше прохання! : p
lama12345

1
@cxw Я заплутався навколо, додавши додатковий абсолютний розміщений елемент і змусивши сам елемент полотна поза екраном, тому мені довелося прокрутити його, як лівий / верхній 2000px-екран. Не вдалося зламати цей код.
lama12345

1

Я реалізував інше рішення, яке, на мою думку, дуже просте, тому я подумав, що поділюся з вами, хлопці.

Отже, проблема для мене полягала в тому, що перетягнутий div підскочить до 0,0 для курсору миші. Тому мені потрібно було зафіксувати положення миші на діві, щоб скорегувати діву нове положення.

Я читаю сторінку divs PageX та PageY і встановлюю верхню і ліву частини відповідно до цього, а потім отримую значення для коригування координат, щоб утримувати курсор у початковому положенні в div, використовую слухач onDragStart і зберігаю e.nativeEvent .layerX та e.nativeEvent.layerY, що лише в початковому тригері дає вам положення миші в розділювальному елементі, що перетягується.

Приклад коду:

 onDrag={(e) => {
          let newCoords;
          newCoords = { x: e.pageX - this.state.correctionX, y: e.pageY - this.state.correctionY };
          this.props.onDrag(newCoords, e, item.id);
        }}
        onDragStart={
          (e) => {
            this.setState({
              correctionX: e.nativeEvent.layerX,
              correctionY: e.nativeEvent.layerY,
            });
          }

Я сподіваюся, що це допоможе комусь, хто пройшов через ті самі проблеми, які я переживав :)


1
function myFunction(e) {
    var x =  e.clientX - e.currentTarget.offsetLeft ; 
    var y = e.clientY - e.currentTarget.offsetTop ;
}

це працює добре!


0

Ви повинні знати структуру вашої сторінки, адже якщо ваше полотно - це дитина діва, яка, в свою чергу, є дитиною іншого діва ..., то історія ускладнюється. Ось мій код полотна, який знаходиться у двох рівнях діви:

canvas.addEventListener("click", function(event) {
var x = event.pageX - (this.offsetLeft + this.parentElement.offsetLeft);
var y = event.pageY - (this.offsetTop + this.parentElement.offsetTop);
console.log("relative x=" + x, "relative y" + y);

});


0

Оригінальна відповідь сказала, що вкладається в рамку. Кращим рішенням є використання подій offsetX та offsetY на полотні, на якому накладка встановлена ​​на 0px.

<html>
<body>
<script>

var main=document.createElement('canvas');
main.width="200";
main.height="300";
main.style="padding:0px;margin:30px;border:thick dashed red";
document.body.appendChild(main);

// adding event listener

main.addEventListener('mousemove',function(e){
    var ctx=e.target.getContext('2d');
    var c=Math.floor(Math.random()*0xFFFFFF);
    c=c.toString(16); for(;c.length<6;) c='0'+c;
    ctx.strokeStyle='#'+c;
    ctx.beginPath();
    ctx.arc(e.offsetX,e.offsetY,3,0,2*Math.PI);
    ctx.stroke();
    e.target.title=e.offsetX+' '+e.offsetY;
    });

// it worked! move mouse over window

</script>
</body>
</html>

0

Ось що я отримав.

    $(".some-class").click(function(e) {

    var posx = 0;
    var posy = 0;

    posx = e.pageX;
    posy = e.pageY;

    alert(posx);
    alert(posy);
});

0

Ви можете використовувати getBoudingClientRect()в relativeбатьку.

document.addEventListener("mousemove", (e) => {
  let xCoord = e.clientX - e.target.getBoundingClientRect().left + e.offsetX
  let yCoord = e.clientY - e.target.getBoundingClientRect().top + e.offsetY
  console.log("xCoord", xCoord, "yCoord", yCoord)
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.