Верхняя часть смещения jQuery работает неправильно
Я пытаюсь создать script рисовать что-то в элементе с помощью мыши, и я использую Raphaeljs
для этого.
Для правильного рисования мне нужно найти top
и left
элемента input
. Я использую var offset = $("#input").offset();
для получения left
и top
.
Но значение top
неверно. Он 10px
ниже, чем реальное расстояние top
. Я думаю, что 10px
может измениться в разных разрешениях, тогда я не могу добавить 10px
к нему обычно, тогда Я хочу знать, как я могу исправить эту проблему!
Я загрузил свой тест здесь.
Ответы
Ответ 1
Функция jQuery .offset()
имеет это ограничение:
Примечание. jQuery не поддерживает получение смещенных координат скрытых элементов или учет границ, полей или отступов, установленных на элементе body.
Тело в этом случае имеет верхнюю границу 10px, поэтому ваш рисунок отключен на 10 пикселей.
Рекомендуемое решение:
var offset = $("#input").offset();
x = x - offset.left - $(document.body).css( "border-left" );
y = y - offset.top + $(document.body).css( "border-top" );
Ответ 2
У меня есть два разных решения:
1) Вы можете рассчитать общую высоту элемента с помощью метода externalHeight (true). Этот метод будет вычислять высоту с полями, прокладками и границами.
И этот не будет создавать конфликт, он вернет истинное значение.
Вот пример jsFiddle.
HTML
<div class="header"></div>
<div class="nav"></div>
<div class="myEle"></div>
JQuery
var myEleTop = $('.header').outerHeight(true) + $('.nav').outerHeight(true);
2) Если вы определили top
css для элемента, который помещен относительно тела, вы также можете использовать это значение:
parseInt($('#myEle').css('top'));
Ответ 3
После долгой борьбы и рассмотрения различных потенциальных ответов я пришел к выводу, что jQuery offset(). top (и, предположительно, DOM API, который он использует) слишком ненадежен для общего использования. Он не только документируется как исключение полей уровня html, но также возвращает неожиданные результаты в нескольких других случаях.
position(). top работает, но может быть нецелесообразно проектировать страницу так, чтобы она была эквивалентной.
К счастью, я обнаружил, что element.getBoundingClientRect(). top отлично позиционирует позицию относительно окна просмотра. Затем вы можете добавить $(документ).scrollTop(), чтобы получить позицию из верхней части документа, если это необходимо.