How to get the distance from the top for an element?

前端 未结 13 1660
北恋
北恋 2020-12-07 12:13

I want to know how to use JavaScript to get the distance of an element from the top of the page not the parent element.

相关标签:
13条回答
  • 2020-12-07 12:44

    offsetTop only looks at the element's parent. Just loop through parent nodes until you run out of parents and add up their offsets.

    function getPosition(element) {
        var xPosition = 0;
        var yPosition = 0;
    
        while(element) {
            xPosition += (element.offsetLeft - element.scrollLeft + element.clientLeft);
            yPosition += (element.offsetTop - element.scrollTop + element.clientTop);
            element = element.offsetParent;
        }
    
        return { x: xPosition, y: yPosition };
    }
    
    0 讨论(0)
  • 2020-12-07 12:44

    Easy vanilla way:

    document.querySelector('your-element').getBoundingClientRect().top
    
    0 讨论(0)
  • 2020-12-07 12:45

    offsetTop doesn’t get the distance to the top of the page, but rather to the top of the closest parent element that has a specified position.

    You can use a simple technique that adds up the offsetTop of all the parent element of the element you are interested in to get the distance.

    // Our element
    var elem = document.querySelector('#some-element');
    
    // Set our distance placeholder
    var distance = 0;
    
    // Loop up the dom
    do {
        // Increase our distance counter
        distance += elem.offsetTop;
    
        // Set the element to it's parent
        elem = elem.offsetParent;
    
    } while (elem);
    distance = distance < 0 ? 0 : distance;
    

    Original code from https://gomakethings.com/how-to-get-an-elements-distance-from-the-top-of-the-page-with-vanilla-javascript/

    0 讨论(0)
  • 2020-12-07 12:49

    Use offsetTop

    document.getElementById("foo").offsetTop
    

    Demo

    0 讨论(0)
  • 2020-12-07 12:49

    (SOURCE : Determine distance from the top of a div to top of window with javascript )

    <script type="text/javascript">
    var myyElement = document.getElementById("myyy_bar");  //your element
    var EnableConsoleLOGS = true;                          //to check the results in Browser's Inspector(Console), whenever you are scrolling
    
    
    
    // ==============================================
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  GetTopLeft ();  
        if (EnableConsoleLOGS) { console.log(Positionsss); }
    });
    function GetOffset (object, offset) {
        if (!object) return;
        offset.x += object.offsetLeft;       offset.y += object.offsetTop;
        GetOffset (object.offsetParent, offset);
    }
    function GetScrolled (object, scrolled) {
        if (!object) return;
        scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
        if (object.tagName.toLowerCase () != "html") {          GetScrolled (object.parentNode, scrolled);        }
    }
    
    function GetTopLeft () {
        var offset = {x : 0, y : 0};        GetOffset (myyElement, offset);
        var scrolled = {x : 0, y : 0};      GetScrolled (myyElement.parentNode, scrolled);
        var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
        return {lefttt: posX , toppp: posY };
    }
    // ==============================================
    </script>
    
    0 讨论(0)
  • 2020-12-07 12:54

    warning warning warning warning warning warning

    "Classic case" - URL "/#about-us" and div with an id of "about-us". In this case, the top position set by default anchor click behavior (So the top is 0 for about-us div). You must prevent default (Or you'll go crazy for why it doesn't work -or- any other code you find out there). More details below under "warning".

    1

    Less than 30 seconds solution (Two lines of code "hello world"):

    get your element:

    var element = document.getElementById("hello");
    

    Get getBoundingClientRect ();

    The Element.getBoundingClientRect() method returns the size of an element and its position relative to the viewport. https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect

    var rect = element.getBoundingClientRect();
    

    Return object:

    Dot notation top

    var distance_from_top = rect.top; /* 1007.9971313476562 */
    

    Thats it.

    2

    StackOverflow nightmare 2 - set scroll position to this value

    Again "hello world" (8,000 answers out there - 7,999 not working or to complex).

    https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo

      window.scrollTo({
        top: element.getBoundingClientRect().top,
        behavior: 'smooth'
      });
    

    Add offset value to top if you want (For sticky navbars).

    "Hello World" code snippet (Get distance from top viewport + click to scrollTo)

    var element = document.getElementById("hello");
    var rect = element.getBoundingClientRect();
    var distance_from_top = rect.top; /* 50px */
    console.log(distance_from_top);
    
    function scrollTovView(){
      window.scrollTo({
        top: distance_from_top,
        behavior: 'smooth'
      });
    }
    div{
      text-align:center;
      border: 1px solid lightgray;
    }
    <button onclick="scrollTovView()">scrollTo to red DIV</button>
    <div style="height: 50px;">50px height</div>
    <div id="hello" style="width: 500px; height: 500px; background: red;"></div>

    warning

    scrollTo "conflict" with main anchor navbars

    This trick is very buggy if, for example, you use this URL (ID to anchor URL)(Top is 0 or "get crazy" hh).

    www.mysite/about#hello
    
      window.scrollTo({
        top: element.getBoundingClientRect().top,
        behavior: 'smooth'
      });
    

    For this code to work you should add:

        if (this.hash !== "") {
          // Prevent default anchor click behavior
          event.preventDefault();
    

    Basic example her: https://www.w3schools.com/howto/howto_css_smooth_scroll.asp

    0 讨论(0)
提交回复
热议问题