如何检查元素是否在屏幕外

时间:2012-01-17 15:31:32

标签: jquery zk

如果DIV元素没有脱离屏幕,我需要检查jQuery。元素是可见的并根据CSS属性显示,但它们可以通过以下方式有意地放置在屏幕外:

position: absolute; 
left: -1000px; 
top: -1000px;

我无法使用jQuery :visible选择器,因为该元素的高度和宽度都不为零。

我没有做任何幻想。这个绝对位置放置是我的Ajax框架实现某些小部件的隐藏/显示的方式。

8 个答案:

答案 0 :(得分:115)

取决于您对“屏幕外”的定义。是在视口内,还是在页面的已定义边界内?

使用Element.getBoundingClientRect(),您可以轻松检测您的元素是否在视口的边界内(即屏幕上或屏幕外):

jQuery.expr.filters.offscreen = function(el) {
  var rect = el.getBoundingClientRect();
  return (
           (rect.x + rect.width) < 0 
             || (rect.y + rect.height) < 0
             || (rect.x > window.innerWidth || rect.y > window.innerHeight)
         );
};

然后您可以通过多种方式使用它:

// returns all elements that are offscreen
$(':offscreen');

// boolean returned if element is offscreen
$('div').is(':offscreen');

答案 1 :(得分:17)

jQuery plugin here允许用户测试元素是否属于浏览器的可见视口,并考虑浏览器的滚动位置。

$('#element').visible();

您还可以检查部分可见性:

$('#element').visible( true);

一个缺点是它只适用于垂直定位/滚动,尽管它应该很容易在混合中添加水平定位。

答案 2 :(得分:7)

无需插件检查是否在视口之外。

var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
var d = $(document).scrollTop();

$.each($("div"),function(){
    p = $(this).position();
    //vertical
    if (p.top > h + d || p.top > h - d){
        console.log($(this))
    }
    //horizontal
    if (p.left < 0 - $(this).width() || p.left > w){
        console.log($(this))
    }
});

答案 3 :(得分:4)

嗯......我在这里找到了每个提出的解决方案中的一些问题。

  • 您应该可以选择是否希望整个元素出现在屏幕上或只是
  • 如果元素高于/宽于窗口并且有点涵盖浏览器窗口,则建议的解决方案会失败。

以下是我的解决方案,其中包含jQuery .fn实例函数和expression。我在我的函数中创建了比我更多的变量,但是对于复杂的逻辑问题,我喜欢把它分成更小的,明确命名的部分。

我使用getBoundingClientRect方法相对于视口返回元素位置,所以我不需要关心滚动位置

<强>使用率

$(".some-element").filter(":onscreen").doSomething();
$(".some-element").filter(":entireonscreen").doSomething();
$(".some-element").isOnScreen(); // true / false
$(".some-element").isOnScreen(true); // true / false (partially on screen)
$(".some-element").is(":onscreen"); // true / false (partially on screen)
$(".some-element").is(":entireonscreen"); // true / false 

<强>来源

$.fn.isOnScreen = function(partial){

    //let's be sure we're checking only one element (in case function is called on set)
    var t = $(this).first();

    //we're using getBoundingClientRect to get position of element relative to viewport
    //so we dont need to care about scroll position
    var box = t[0].getBoundingClientRect();

    //let's save window size
    var win = {
        h : $(window).height(),
        w : $(window).width()
    };

    //now we check against edges of element

    //firstly we check one axis
    //for example we check if left edge of element is between left and right edge of scree (still might be above/below)
    var topEdgeInRange = box.top >= 0 && box.top <= win.h;
    var bottomEdgeInRange = box.bottom >= 0 && box.bottom <= win.h;

    var leftEdgeInRange = box.left >= 0 && box.left <= win.w;
    var rightEdgeInRange = box.right >= 0 && box.right <= win.w;


    //here we check if element is bigger then window and 'covers' the screen in given axis
    var coverScreenHorizontally = box.left <= 0 && box.right >= win.w;
    var coverScreenVertically = box.top <= 0 && box.bottom >= win.h;

    //now we check 2nd axis
    var topEdgeInScreen = topEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
    var bottomEdgeInScreen = bottomEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );

    var leftEdgeInScreen = leftEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
    var rightEdgeInScreen = rightEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );

    //now knowing presence of each edge on screen, we check if element is partially or entirely present on screen
    var isPartiallyOnScreen = topEdgeInScreen || bottomEdgeInScreen || leftEdgeInScreen || rightEdgeInScreen;
    var isEntirelyOnScreen = topEdgeInScreen && bottomEdgeInScreen && leftEdgeInScreen && rightEdgeInScreen;

    return partial ? isPartiallyOnScreen : isEntirelyOnScreen;

};

$.expr.filters.onscreen = function(elem) {
  return $(elem).isOnScreen(true);
};

$.expr.filters.entireonscreen = function(elem) {
  return $(elem).isOnScreen(true);
};

答案 4 :(得分:3)

我创建了a small plugin that does this,它有一些灵活的选项(当你调整浏览器窗口大小时它也有效)。

答案 5 :(得分:1)

我知道这有点晚了但是这个插件应该可行。 http://remysharp.com/2009/01/26/element-in-view-event-plugin/

$('p.inview').bind('inview', function (event, visible) {
if (visible) {
  $(this).text('You can see me!');
} else {
  $(this).text('Hidden again');
}

答案 6 :(得分:0)

  • 从给定元素的顶部获取距离
  • 添加相同给定元素的高度。这将告诉您从屏幕顶部到给定元素末尾的总数。
  • 然后,您只需从总文档高度

    中减去该值
    jQuery(function () {
        var documentHeight = jQuery(document).height();
        var element = jQuery('#you-element');
        var distanceFromBottom = documentHeight - (element.position().top + element.outerHeight(true));
        alert(distanceFromBottom)
    });
    

答案 7 :(得分:-1)

您可以使用$(div).position()检查div的位置,并检查左边距和上边距属性是否小于0:

if($(div).position().left < 0 && $(div).position().top < 0){
    alert("off screen");
}