Когда мышь перемещается по элементу, я хочу получить координаты мыши курсора относительно левого верхнего края области содержимого элемента (это область, исключая заполнение, границу и контур). Звучит просто, не так ли? До сих пор я пользуюсь очень популярной функцией:
function element_position(e) {
var x = 0, y = 0;
do {
x += e.offsetLeft;
y += e.offsetTop;
} while (e = e.offsetParent);
return { x: x, y: y };
}
И я бы получил положение мыши относительно элемента element
с помощью:
p = element_position(element);
x = mouseEvent.pageX - p.x;
y = mouseEvent.pageY - p.y;
Это не совсем правильно. Поскольку offsetLeft
и offsetTop
- это различия между "внешним" верхним левым элементом и "внутренним" верхним левым от его родителя смещения, позиция суммы будет пропускать границы all и paddings в иерархии.
Здесь сравнение, которое должно (надеюсь) прояснить, что я имею в виду.
- Если я получу сумму расстояний в позиции между "внешним" верхним левым элементом и "внутренним" верхним левым от их смещенных родителей ( outers минус внутри, что я делаю прямо сейчас), я получаю позицию области содержимого элемента, минус все границы и paddings в иерархии смещения.
- Если я получаю сумму расстояний в позиции между "внешним" верхним левым элементом и "внешним" верхним левым от их смещенных родителей (outers минус outers), я получаю положение области содержимого элемента, минус граница и добавление нужного элемента (близко, но не совсем).
- Если я получу сумму расстояний в позиции между "внутренним" верхним левым элементом и "внутренним" верхним левым от их смещенных родителей (внутри минус внутри), я получаю положение области содержимого элемента. Это то, что я хочу.