programing

상위 컨테이너를 기준으로 요소의 위치/오프셋을 가져오시겠습니까?

newsource 2023. 7. 29. 08:29

상위 컨테이너를 기준으로 요소의 위치/오프셋을 가져오시겠습니까?

순수 JS를 가진 상위에 대한 컨테이너의 오프셋을 검색하려면 어떻게 해야 합니까?

element.offsetLeft 그리고element.offsetTop(위치가 다음과 같은 가장 가까운 부모 요소)에 대해 요소의 위치를 지정합니다.relative또는absolute.)

순수한 j 용법으로 그냥.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>

저는 인터넷 익스플로러에서 이렇게 했습니다.

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-div').offset().top - $('parent-div').offset().top;

이벤트의 절대 오프셋 위치를 가져오려면 이벤트의 오프셋을 상위 요소 오프셋에 추가합니다.

예:

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 Web API에 따르면: "HTMLlement.offsetLeft 읽기 전용 속성은 HTMLlement.offsetParent 노드 에서 현재 요소의 왼쪽 상단 모서리가 오프셋된 픽셀 수를 반환합니다."

이 문제는 대부분 여러 하위 항목이 포함된 이벤트를 부모에 등록한 경우에 발생합니다. 예를 들어, 내부 아이콘 또는 텍스트 범위가 있는 단추,li내부 스팬이 있는 요소 등...

따라서 ID가 "child-element"인 자식 요소가 있고 부모 요소에 대한 왼쪽/위쪽 위치를 얻고자 한다면, 예를 들어, "항목-부모" 클래스가 있는 div를 사용할 것입니다.

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");

순수한 JS로는 확실히 쉽습니다. 그냥 이렇게 하세요. 고정되고 애니메이션화된 HTML 5 패널에서도 작업합니다. 저는 이 코드를 만들어 사용해보고 모든 브라우저(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>

언급URL : https://stackoverflow.com/questions/11634770/get-position-offset-of-element-relative-to-a-parent-container