Здесь необходимо рассмотреть две отдельные проблемы:
- Как узнать положение элемента на странице?
- Что происходит, когда я присваиваю новые значения
left
и top
свойства стиля?
Ответ на первый вопрос основан на понимании element.offsetLeft
и element.offsetTop
.Эти свойства дают смещение относительно element.offsetParent
, которое определено как «ближайший (самый близкий в иерархии содержимого) позиционированный содержащий элемент».
В вашем документе это <body>
элемент, поэтому он работает, как вы ожидали.Если бы вы поместили свои квадраты внутри других элементов, вы бы обнаружили, что ваш код перестал работать.То, что вам нужно, это функция, чтобы пройтись по дереву, содержащему элементы, и суммировать каждое из смещений, вот так :
function findPos(obj) {
var curleft = curtop = 0;
if (obj.offsetParent) {
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return { x: curleft, y: curtop };
}
}
Используется так:
var pos= findPos(element);
posX = event.clientX - pos.x;
posY = event.clientY - pos.y;
Ответ на второй вопрос требует понимания относительно позиционированных элементов.Элементы, которые расположены относительно, отображаются в позиции относительно относительно того места, где они обычно отображаются на странице.Когда вы присваиваете значения top
и left
, вы не даете абсолютные значения.Вы даете позиции, которые обрабатываются относительно первоначальной позиции элемента в макете.Это особенность относительного позиционирования, а не ошибка.Вы, вероятно, хотите использовать position: absolute;
вместо.