Определите расстояние от верхней части div до верхней части окна с помощью javascript

127

Как определить расстояние от самого верха div до верха текущего экрана? Мне просто нужно расстояние в пикселях до верхней части текущего экрана, а не до верхней части документа. Я пробовал кое-что вроде .offset()и .offsetHeight, но никак не могу осознать это. Спасибо!

Джоэл Экрот
источник
2
Возможно, вы захотите это проверить
Джозеф,
7
el.getBoundingClientRect().top+window.scrollY
caub
3
@caub Эх, это просто el.getBoundingClientRect().top. Добавление позиции прокрутки увеличивает расстояние до верха документа. developer.mozilla.org/de/docs/Web/API/Element/…
lynx
да, верно, просто хотел уточнить
caub

Ответы:

239

Вы можете использовать, .offset()чтобы получить смещение по сравнению с documentэлементом, а затем использовать scrollTopсвойство windowэлемента, чтобы узнать, как далеко вниз по странице прокрутил пользователь:

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);

Теперь distanceпеременная содержит расстояние от верха #my-elementэлемента до верхнего сгиба.

Вот демонстрация: http://jsfiddle.net/Rxs2m/

Обратите внимание, что отрицательные значения означают, что элемент находится выше верхнего сгиба.

Джаспер
источник
Как я могу проверить, является ли расстояние конкретным числом? Я хочу сделать элемент липким, если он находится на расстоянии 120 пикселей от вершины
Тесса Вербрюгген
@ThessaVerbruggen Вы можете проверить distanceпеременную, чтобы узнать, имеет ли она значение, 120но я бы рекомендовал проверять диапазон, а не точное число. Если, например, вы прокручиваете колесиком мыши, вы вполне можете пропустить более 120. Так что, если вы пытаетесь применить какой-то CSS или что-то еще, когда элемент находится в пределах 120 пикселей от верхнего сгиба, тогда, возможно, используйте if (distance < 120) { /* do something */}. Вот обновленная демонстрация: jsfiddle.net/na5qL91o
Джаспер,
Одна проблема, если я сделаю это: липкая часть мигает, когда я прокручиваю. Я думаю, потому что он пересчитывается при прокрутке. Есть идеи, как это исправить? Мой код: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondary'). Offset (). Top, distance = (elementOffset - scrollTop); if (distance <120) {$ ('# secondary'). addClass ('sticky');} else {$ ('# secondary'). removeClass ('sticky');}});
Thessa Verbruggen
60

Vanilla:

window.addEventListener('scroll', function(ev) {

   var someDiv = document.getElementById('someDiv');
   var distanceToTop = someDiv.getBoundingClientRect().top;

   console.log(distanceToTop);
});

Откройте консоль браузера и прокрутите страницу, чтобы увидеть расстояние.

horahore
источник
14
Это работает только в том случае, если пользователь не прокрутил страницу. В противном случае distanceToTopвозвращается относительное значение (может быть даже отрицательным, если пользователь прокрутил страницу назад). Чтобы принять это во внимание, используйтеwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty OP ищет расстояние до верха экрана, а не до верха документа - в этом случае будет допустимо отрицательное значение
Дренай
16

Этого можно достичь исключительно с помощью JavaScript .

Я вижу, что ответ, который я хотел написать, получил от lynx в комментариях к вопросу.

Но я все равно напишу ответ, потому что, как и я, люди иногда забывают читать комментарии.

Итак, если вы просто хотите получить расстояние до элемента (в пикселях) от верхней части окна экрана, вот что вам нужно сделать:

// Fetch the element
var el = document.getElementById("someElement");  

используйте getBoundingClientRect ()

// Use the 'top' property of 'getBoundingClientRect()' to get the distance from top
var distanceFromTop = el.getBoundingClientRect().top; 

Это оно!

Надеюсь, это кому-то поможет :)

Фуркан Рахаматх
источник
1
getBoundingClient () не работает, вместо этого .getBoundingClientRect ()
Elnoor
@Elnoor Спасибо за предложение :) Я внес соответствующие изменения.
Фуркан Рахамат
Просто классная работа @MohammedFurqanRahamathM. Большое спасибо за ответ :) Работает как шарм !! :)
Мерианос Никос
1
@MerianosNikos Спасибо. Я рад, что это помогло :)
Furqan Rahamath
1
но это будет работать только в том случае, если вы не перезагрузите страницу в середине, верно?
Sagive SEO
7

Я использовал это:

                              myElement = document.getElemenById("xyz");
Get_Offset_From_Start       ( myElement );  // returns positions from website's start position
Get_Offset_From_CurrentView ( myElement );  // returns positions from current scrolled view's TOP and LEFT

код:

function Get_Offset_From_Start (object, offset) { 
    offset = offset || {x : 0, y : 0};
    offset.x += object.offsetLeft;       offset.y += object.offsetTop;
    if(object.offsetParent) {
        offset = Get_Offset_From_Start (object.offsetParent, offset);
    }
    return offset;
}

function Get_Offset_From_CurrentView (myElement) {
    if (!myElement) return;
    var offset = Get_Offset_From_Start (myElement);
    var scrolled = GetScrolled (myElement.parentNode);
    var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
    return {lefttt: posX , toppp: posY };
}
//helper
function GetScrolled (object, scrolled) {
    scrolled = scrolled || {x : 0, y : 0};
    scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
    if (object.tagName.toLowerCase () != "html" && object.parentNode) { scrolled=GetScrolled (object.parentNode, scrolled); }
    return scrolled;
}

    /*
    // live monitoring
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  Get_Offset_From_CurrentView(myElement);  
        console.log(Positionsss);
    });
    */
T.Todua
источник
+1 для отображения того, что element.offsetTop существует. element.getBoundingClientRect (). top дает мне странное поведение. Я искал расстояние от верха веб-страницы до верха элемента.
alexandre1985
0

Я использовал эту функцию, чтобы определить, виден ли элемент в окне просмотра

Код:

const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
$(window).scroll(function(){
var scrollTop     = $(window).scrollTop(),
elementOffset = $('.for-scroll').offset().top,
distance      = (elementOffset - scrollTop);
if(distance < vh){
    console.log('in view');
}
else{
    console.log('not in view');
}
});
Мутасим Ахмад
источник