Jquery检查元素是否在视口中可见

IT技术 javascript jquery visible
2021-02-08 21:30:52

无论窗口滚动位置如何,用于检查 div 类“媒体”是否在浏览器视觉视口内的函数。

<HTML>
<HEAD>
  <TITLE>My first HTML document</TITLE>
</HEAD>
<BODY>
  <div class="main">
   <div class="media"></div>
  </div>

</BODY>
</HTML>

尝试将此插件https://github.com/customd/jquery-visible与此功能一起使用,但我不知道如何使其工作。

$('#element').visible( true );
5个回答

使用 jquery 检查元素在视口中是否可见:

首先确定元素的顶部和底部位置。然后通过将滚动位置添加到视口高度来确定视口底部的位置(相对于页面顶部)。

如果视口的底部位置大于元素的顶部位置并且视口的顶部位置小于元素的底部位置,则该元素在视口中(至少部分)。简单来说,当元素的任何部分位于视口的顶部和底部边界之间时,该元素在屏幕上可见。

现在您可以编写 if/else 语句,其中 if 语句仅在满足上述条件时运行。

下面的代码执行上面解释的内容:

// this function runs every time you are scrolling

$(window).scroll(function() {
    var top_of_element = $("#element").offset().top;
    var bottom_of_element = $("#element").offset().top + $("#element").outerHeight();
    var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
    var top_of_screen = $(window).scrollTop();

    if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
        // the element is visible, do something
    } else {
        // the element is not visible, do something else
    }
});

这个答案是对 Chris Bier 和 Andy 在下面讨论的内容的总结。我希望它可以帮助其他像我一样在做研究时遇到这个问题的人。我还使用了以下问题的答案来制定我的答案:滚动位置时显示 Div

一个以前的版本,如果你想探测当一个元素首次进入鉴于这个答案也可能是有益的/是完全视图,然后当它开始离开视图(当一个元素的顶部是可见的)。
2021-03-12 21:30:52
没有插件?!怎么样:$(window).scroll??
2021-03-19 21:30:52
小修正;就像@boblapointe 指出的那样:它应该是outerheight(),并且offset()top 之间缺少一个点('.')
2021-03-20 21:30:52
你指的是jquery吗?
2021-03-24 21:30:52
我认为它应该是 $("#element").outerHeight();
2021-04-02 21:30:52

您可以编写这样的 jQuery 函数来确定元素是否在视口中。

在包含 jQuery 之后在某处包含它:

$.fn.isInViewport = function() {
    var elementTop = $(this).offset().top;
    var elementBottom = elementTop + $(this).outerHeight();

    var viewportTop = $(window).scrollTop();
    var viewportBottom = viewportTop + $(window).height();

    return elementBottom > viewportTop && elementTop < viewportBottom;
};

示例用法:

$(window).on('resize scroll', function() {
    if ($('#Something').isInViewport()) {
        // do something
    } else {
        // do something else
    }
});

请注意,这仅检查元素的顶部和底部位置,它不会检查元素是否水平位于视口之外。

谢谢!我使用您的代码作为基础制作了一个更完整的插件:github.com/frontid/jQueryIsInViewport
2021-03-12 21:30:52
如果在 div(而不是窗口)内进行检查,请记住减去父 div 偏移量。
2021-04-02 21:30:52
如果您的按钮在顶部并且元素出现在底部,您将像这样减去偏移量: return ( elementBottom > viewportTop ) && ( elementTop < viewportBottom - $( this ).height() );
2021-04-04 21:30:52
顺便说一句,如果您在移动模式下使用 Chrome 调试器并单击页面并滚动,则这不起作用。仅当我使用拨轮上下滚动时才有效。除非我错过了什么
2021-04-07 21:30:52
$(window).height()不考虑移动设备的缩放(至少在使用 jQuery v1.9 时)。更好的解决方案是使用window.innerHeight,当捏合屏幕以放大移动设备时,它确实会发生变化。
2021-04-10 21:30:52

根据该插件文档.visible()返回一个布尔值,指示元素是否可见。所以你会像这样使用它:

if ($('#element').visible(true)) {
    // The element is visible, do something
} else {
    // The element is NOT visible, do something else
}
您应该删除可见()中的(真)
2021-03-12 21:30:52
一个不错的小图书馆。不幸的是,它已被放弃并且不再适用于当前版本的 jQuery。它会抛出类似 的错误Uncaught TypeError: r.getClientRects is not a function,这在与 jQuery>3 不兼容的库中很常见。
2021-03-25 21:30:52
@slvnperron: True :整个元素可见,false :元素的一部分可见
2021-04-01 21:30:52
@slvnperron:为什么?这是插件的有效使用,对应于问题中发布的原始代码。
2021-04-06 21:30:52
好吧,他可能想检查整个 div 的可见性,参数是用于部分检测
2021-04-07 21:30:52

你可以看到这个例子

// Is this element visible onscreen?
var visible = $(#element).visible( detectPartial );

检测部分:

  • True : 整个元素可见
  • false :元素的一部分是可见的

visible 是布尔变量,指示元素是否可见。

这不是标准的 jQuery 函数(“visible is not a function)
2021-04-08 21:30:52
var visible = $(".media").visible();
这不是标准的 jQuery 函数(“visible is not a function)
2021-04-03 21:30:52
我不确定使用 class selector.media是否微妙,因为如果有很多属于 media class 的元素......
2021-04-07 21:30:52