Получить положение/смещение элемента относительно родительского контейнера?
Я привык работать с jQuery. Однако в моем текущем проекте я использую zepto.js. Zepto не предоставляет position()
метод, как jQuery делает. Zepto поставляется только с offset()
.
любая идея, как я могу получить смещение контейнера относительно родителя с чистым js или с Zepto?
7 ответов:
element.offsetLeft
иelement.offsetTop
являются ли чистые свойства javascript для нахождения позиции элемента относительно егоoffsetParent
; будучи ближайшим родительским элементом с позициейrelative
илиabsolute
кроме того, вы всегда можете использовать Zepto чтобы получить положение элемента и его родителя, и просто вычесть два:
var childPos = obj.offset(); var parentPos = obj.parent().offset(); var childOffset = { top: childPos.top - parentPos.top, left: childPos.left - parentPos.left }
это имеет то преимущество, что дает вам смещение ребенка относительно его родителя, даже если родитель не установленный.
в чистом js просто используйте
offsetLeft
иoffsetTop
свойства.
Пример скрипки:http://jsfiddle.net/WKZ8P/var elm = document.querySelector('span'); console.log(elm.offsetLeft, elm.offsetTop);
p { position:relative; left:10px; top:85px; border:1px solid blue; } span{ position:relative; left:30px; top:35px; border:1px solid red; }
<p> <span>paragraph</span> </p>
Я сделал это так в Internet Explorer.
function getWindowRelativeOffset(parentWindow, elem) { var offset = { left : 0, top : 0 }; // relative to the target field's document offset.left = elem.getBoundingClientRect().left; offset.top = elem.getBoundingClientRect().top; // now we will calculate according to the current document, this current // document might be same as the document of target field or it may be // parent of the document of the target field var childWindow = elem.document.frames.window; while (childWindow != parentWindow) { offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left; offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top; childWindow = childWindow.parent; } return offset; };
=================== вы можете назвать это так
getWindowRelativeOffset(top, inputElement);
я фокусируюсь на IE только в соответствии с моим фокусом, но подобные вещи могут быть сделаны для других браузеров.
пример
Итак, если бы у нас был дочерний элемент с идентификатором "child-element", и мы хотели бы получить его левую/верхнюю позицию относительно родительского элемента, скажем, div, который имел класс "item-parent", мы бы использовали этот код.
var position = $("#child-element").offsetRelative("div.item-parent"); alert('left: '+position.left+', top: '+position.top);
плагин наконец, для фактического плагина (с несколькими примечаниями, расширяющими то, что происходит):
// offsetRelative (or, if you prefer, positionRelative) (function($){ $.fn.offsetRelative = function(top){ var $this = $(this); var $parent = $this.offsetParent(); var offset = $this.position(); if(!top) return offset; // Didn't pass a 'top' element else if($parent.get(0).tagName == "BODY") return offset; // Reached top of document else if($(top,$parent).length) return offset; // Parent element contains the 'top' element we want the offset to be relative to else if($parent[0] == $(top)[0]) return offset; // Reached the 'top' element we want the offset to be relative to else { // Get parent's relative offset var parent_offset = $parent.offsetRelative(top); offset.top += parent_offset.top; offset.left += parent_offset.left; return offset; } }; $.fn.positionRelative = function(top){ return $(this).offsetRelative(top); }; }(jQuery));
Примечание : можно использовать этой по щелчку мыши или событие наведения курсора
$(this).offsetRelative("div.item-parent");
добавьте смещение события к смещению родительского элемента, чтобы получить абсолютное положение смещения события.
пример :
HTMLElement.addEventListener('mousedown',function(e){ var offsetX = e.offsetX; var offsetY = e.offsetY; if( e.target != this ){ // 'this' is our HTMLElement offsetX = e.target.offsetLeft + e.offsetX; offsetY = e.target.offsetTop + e.offsetY; } }
когда цель события не является элементом, в котором было зарегистрировано событие, она добавляет смещение родителя к текущему смещению события, чтобы вычислить значение "абсолютного" смещения.
по данным веб-браузер Mozilla АФИ: "о HTMLElement.offsetLeft свойство только для чтения возвращает число пикселов, верхний левый угол элемента смещение влево в пределах HTMLElement.offsetParent узел."
это в основном происходит, когда вы зарегистрировали событие на родителе, который содержит еще несколько детей, например: кнопка с внутренним значком или текстовым промежутком,
li
элемент с внутренними промежутками. так далее...
конечно, легко с чистым JS, просто сделайте это, работайте для фиксированных и анимированных панелей HTML 5 тоже, я сделал и попробовал этот код, и он работает для любого brower (включая IE 8):
<script type="text/javascript"> function fGetCSSProperty(s, e) { try { return s.currentStyle ? s.currentStyle[e] : window.getComputedStyle(s)[e]; } catch (x) { return null; } } function fGetOffSetParent(s) { var a = s.offsetParent || document.body; while (a && a.tagName && a != document.body && fGetCSSProperty(a, 'position') == 'static') a = a.offsetParent; return a; } function GetPosition(s) { var b = fGetOffSetParent(s); return { Left: (b.offsetLeft + s.offsetLeft), Top: (b.offsetTop + s.offsetTop) }; } </script>