使用javascript确定从div顶部到窗口顶部的距离


127

如何确定div的最顶部到当前屏幕的顶部之间的距离?我只希望像素距离当前屏幕的顶部,而不是文档顶部。我已经尝试了诸如.offset()和的一些操作.offsetHeight,但是我无法解决这个问题。谢谢!


2
您可能想检查一下
约瑟夫

7
el.getBoundingClientRect().top+window.scrollY
caub 2016年

3
@caub嗯,只是el.getBoundingClientRect().top。添加滚动位置总计到文档顶部的距离。developer.mozilla.org/de/docs/Web/API/Element/…–
lynx

是的,只是想取消选民资格
caub

Answers:


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像素,我想使其保持粘性
Thessa Verbruggen

@ThessaVerbruggen您可以检查distance变量以查看其值为,120但我建议检查范围而不是确切的数字。例如,如果使用鼠标滚轮滚动,则可能会跳过120。因此,如果您尝试在元素位于顶部折叠的120px以内时应用一些CSS或其他内容,则可以使用if (distance < 120) { /* do something */}。这是更新的演示:jsfiddle.net/na5qL91o
Jasper,

如果执行此操作,则会出现一个问题:滚动时,粘性部分闪烁。我猜是因为它在我滚动时会重新计算。任何想法如何解决这个问题?我的代码:$(window).on('scroll',function(){var scrollTop = $(window).scrollTop(),elementOffset = $('#secondary')。offset()。top,distance =(elementOffset) -scrollTop); if(距离<120){$('#secondary')。addClass('sticky');} else {$('#secondary')。removeClass('sticky');}}));
Thessa Verbruggen

60

香草:

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

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

   console.log(distanceToTop);
});

打开浏览器控制台并滚动页面以查看距离。


14
仅当用户尚未滚动页面时,此方法才有效。否则distanceToTop返回的是相对的(如果用户滚动过去,甚至可以为负)。要考虑到这一点,请使用window.pageYOffset + someDiv.getBoundingClientRect().top
ty。

2
@ty OP正在寻找到屏幕顶部而不是文档顶部的距离-在这种情况下,负值将有效
Drenai

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谢谢您的建议:)我进行了适当的更改。
Furqan Rahamath '18

真棒的工作@MohammedFurqanRahamathM。非常感谢您的回答:)它就像一个魅力!:)
Merianos Nikos '18

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);
    });
    */

+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');
}
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.