【问题标题】:Determine distance from the top of a div to top of window with javascript使用javascript确定从div顶部到窗口顶部的距离
【发布时间】:2012-03-26 21:57:17
【问题描述】:

如何确定 div 的最顶部与当前屏幕顶部之间的距离?我只想要到当前屏幕顶部的像素距离,而不是文档顶部。我已经尝试过.offset().offsetHeight 之类的一些方法,但我就是想不通。谢谢!

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您可以使用.offset() 获取与document 元素相比的偏移量,然后使用window 元素的scrollTop 属性来查找用户向下滚动页面的距离:

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

distance 变量现在保存与 #my-element 元素顶部和顶部折叠的距离。

这是一个演示:http://jsfiddle.net/Rxs2m/

请注意,负值表示该元素高于顶折。

【讨论】:

  • 如何检查距离是否为特定数字?如果元素距离顶部 120 像素,我想让它具有粘性
  • @ThessaVerbruggen 您可以检查distance 变量以查看其值是否为120,但我建议检查范围而不是确切数字。例如,如果您使用鼠标滚轮滚动,您很可能会跳过 120。因此,如果您尝试在元素位于顶部折叠的 120 像素内时应用一些 CSS 或其他内容,则可以使用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
【解决方案2】:

香草:

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

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

   console.log(distanceToTop);
});

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

【讨论】:

  • 这仅在用户没有滚动页面时有效。否则返回的distanceToTop 是相对的(如果用户滚动过去,甚至可以是负数)。考虑到这一点,请使用window.pageYOffset + someDiv.getBoundingClientRect().top
  • @ty OP 正在寻找到屏幕顶部的距离,而不是到文档顶部的距离——在这种情况下,负值是有效的
  • 这也是我需要的。我正在使用 Vue-toasted 库,它只允许在屏幕上的绝对位置显示 toast。我希望 toast 显示在我在表格中单击的按钮附近,最终需要在滚动事件中使用 getBoundingClientRect().top。我也在调整大小事件中做了同样的事情。在像这样计算到屏幕顶部的距离时,可能需要考虑添加 - 永远不知道客户端最终会做什么。
  • @ty。同时window.pageYOffset 已被弃用。最好使用window.scrollY
【解决方案3】:

这可以完全使用 JavaScript 实现

我看到我想写的答案已经被 cmets 中的lynx 回答了。

但我还是要写答案,因为就像我一样,人们有时会忘记阅读 cmets。

因此,如果您只想获取元素与屏幕窗口顶部的距离(以像素为单位),您需要执行以下操作:

// 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; 

就是这样!

希望这对某人有帮助:)

【讨论】:

  • getBoundingClient() 不起作用,而是 .getBoundingClientRect()
  • 简直太棒了@MohammedFurqanRahamathM。非常感谢您的回答:) 它就像一个魅力! :)
  • @MerianosNikos 谢谢。我很高兴它有帮助:)
  • 但这只有在您没有在页面中间重新加载时才有效,对吧?
  • @SaiveSEO 我不明白。您能否详细说明您的问题?
【解决方案4】:

我用过这个:

                              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 给了我奇怪的行为。我正在寻找从网页顶部到元素顶部的距离。
【解决方案5】:

我使用这个函数来检测元素在视口中是否可见

代码:

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');
}
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多