Узнать координаты мыши относительно блока

Столкнулся с такой проблемой: надо получить координаты мыши относительно блока, на котором она находится.

const div = document.querySelector('div');

div.addEventListener('mousemove', (e) => {
  let x = e.clientX,
    y = e.clientY;
  console.log(`${x}:${y}`);
}, {
  capture: true
})
div {
  border: 2px solid #000;
  width: 500px;
  height: 500px;
}
<div>daw</div>

Пытался так, но понятно дело, что не получилось.




введите сюда описание изображения


Ответы (3 шт):

Автор решения: Grundy

Чтобы получить координаты внутри элемента, нужно из абсолютных координат мыши (pageY, pageX) вычесть смещение самого элемента. Получить его можно с помощью методов .offsetLeft и .offsetTop

let div = document.querySelector('#f');

div.addEventListener('mousemove', (e) => {
  let x = e.pageX,
    y = e.pageY;

  console.log(`${x - div.offsetLeft}:${y-div.offsetTop}`);
}, {
  capture: true
})
div#a {
  margin-top: 100px;
  padding-top: 100px;
  border: 2px solid #0f0;
}

div#f {
  border: 2px solid #000;
  width: 500px;
  height: 500px;
}
<div id="a">
  <div id="f">daw</div>
</div>

→ Ссылка
Автор решения: Sergei Kirjanov

Вариант на getBoundingClientRect и event.clientX, который не зависит от relative.

offsetLeft считается от ближайшего предка с position relative.

У clientX и pageX разное поведение при скроле.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title> позиция мыши </title>
<style>

div#a {
  position: absolute;
  top: 100px;
  left: 100px;
  width: 350px;
  height: 350px;
  border: 2px solid #0f0;
}
div#b {
  position: relative;
}
div#f {
  border: 2px solid #000;
  position: absolute;
  top: 50px;
  left: 50px;
  width: 250px;
  height: 250px;
  cursor: pointer;
}

</style>
</head>
<body>
<div id="a"><div id="b"><div id="f">0</div></div></div>
<script>

const div = document.querySelector('#f');
window.addEventListener('mousemove', (ev) => {
  const rect = div.getBoundingClientRect()
  console.log(` + ${ev.clientX - rect.left}:${ev.clientY - rect.top}    ----------    ${ev.pageX - div.offsetLeft}:${ev.pageY - div.offsetTop}`);
}, {
  capture: true
})

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

→ Ссылка
Автор решения: Daniil

document.querySelector('.class').addEventListener('mousemove',e=>console.log([e.toElement,e.offsetX])) // console.log

document.querySelector('.class').addEventListener('mousemove',e=>{e.toElement.className == document.querySelector('.class').className ? console.log(e.offsetX) : false})

→ Ссылка