javascript - 如何检查元素是否在视口(viewport)中(div,无窗口)

标签 javascript jquery viewport

有没有办法检查指定的 html 元素是否在视口(viewport)中 - 没有窗口但指定的 div?我只找到了一个有意义的解决方案,但我无法让它为我工作。

根据这个问题Check if element is visible in div

我在这里创建了一个示例:http://jsfiddle.net/jm91n80u/

这是我的 html 代码:

<body style="overflow:hidden;">
<div id="outer" style="position:absolute;left:150px;top:20px;right:100px;bottom:30px;overflow:hidden;border:1px solid blue;">
    <div id="inner" style="position:relative;height:300px;border:1px solid red;width:100px;overflow-y:auto;overflow-x:hidden;">
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">1</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">2</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">3</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;background:yellow;" class="test" id="id1">4</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">5</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">6</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">7</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">8</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">9</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">10</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">11</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">12</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">13</div>
        <div style="position:relative;width:100%;height:30px;border:1px solid grey;" class="test">14</div>
    </div>
</div>
<div id="result" style="position:absolute;bottom:0px;overflow:hidden;border:1px solid black;height:20px;width:100%;"></div>
</body>

这是一个js函数

$(document).ready(function () {

    $.belowthefold = function (lookIn, elements, settings) {
        var fold = $(lookIn).height() + $(lookIn).scrollTop();
        return $(elements).filter(function () {
            return fold <= $(this).offset().top - settings.threshold;
        });
    };

    $.abovethetop = function (lookIn, elements, settings) {
        var top = $(lookIn).scrollTop();
        return $(elements).filter(function () {
            return top >= $(this).offset().top + $(this).height() - settings.threshold;
        });
    };

    $.rightofscreen = function (lookIn, elements, settings) {
        var fold = $(lookIn).width() + $(lookIn).scrollLeft() + $(lookIn).offset().width;
        return $(elements).filter(function () {
            return fold <= $(this).offset().left - settings.threshold;
        });
    };

    $.leftofscreen = function (lookIn, elements, settings) {
        var left = $(lookIn).scrollLeft();
        return $(elements).filter(function () {
            return left >= $(this).offset().left + $(this).width() - settings.threshold;
        });
    };

    $("#inner").scrollTop(100);

    var b = $.belowthefold("#inner", ".test", { threshold: 0 }).toArray();
    var t = $.abovethetop("#inner", ".test", { threshold: 0 }).toArray();
    var r = $.rightofscreen("#inner", ".test", { threshold: 0 }).toArray();
    var l = $.leftofscreen("#inner", ".test", { threshold: 0 }).toArray();


    var el = $("#id1")[0];
    
    var bS = "below the fold : ";
    for (var i = 0; i < b.length; i++) {
        bS += $(b[i]).html() + ",";
    }
    var tS = "above the top : ";
    for (var i = 0; i < t.length; i++) {
        tS += $(t[i]).html() + ",";
    }
    var rS = "right of screen : ";
    for (var i = 0; i < r.length; i++) {
        rS += $(r[i]).html() + ",";
    }
    var lS = "left of screen : ";
    for (var i = 0; i < l.length; i++) {
        lS += $(l[i]).html() + ",";
    }

    console.log(bS);
    console.log(tS);
    console.log(rS);
    console.log(lS);
});

我想做的是获取内部容器中当前不可见的所有“.test”元素(或在目标解决方案中部分不可见,任何开关都将受到赞赏)以及有关其位置的信息。结果应该是:

below the fold : 13, 14

above the top : 1,2,3,4

right of screen :

left of screen :

但在这种特殊情况下,这些功能不起作用。我尝试使用其他几种解决方案,但每个解决方案都将视口(viewport)视为窗口。

你能解释一下我做错了什么吗?任何帮助将不胜感激。

最佳答案

您应该将 div 的位置与:视口(viewport)大小和窗口边界进行比较。

大致: if(div.top > (window.top + viewport.height )) {/*这是可见的*/} else {/*这是不可见的*/}

你甚至可以让它更具体(div 的面积有多大?) if((div.top **+ div.height**) > (window.top + viewport.height )) {/*这是可见的*/}

这篇文章给出了一些代码Check if element is between 30% and 60% of the viewport

$(document).ready(function() {
    // Get viewport height, gridTop and gridBottom
    var windowHeight = $(window).height(),
        gridTop = windowHeight * .3,
        gridBottom = windowHeight * .6;

$(window).on('scroll', function() {
    // On each scroll check if `li` is in interested viewport
    $('ul li').each(function() {
        var thisTop = $(this).offset().top - $(window).scrollTop(); // Get the `top` of this `li`

        // Check if this element is in the interested viewport
        if (thisTop >= gridTop && (thisTop + $(this).height()) <= gridBottom) {
            $(this).css('background', 'red');
        } else {
            $(this).css('background', 'gray');
        }
    });
});

});

关于javascript - 如何检查元素是否在视口(viewport)中(div,无窗口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471094/

相关文章:

javascript - 动态文本区域高度

javascript - react : How to read from the DOM after mount?

jquery - 如何更改 jQuery 自动完成插件默认查询字符串键? (我想要的术语)

html - 移动网站视口(viewport)精确宽度问题

javascript - 将脚本内容调整到视口(viewport)中

javascript - 在 Node.js 中发出类似 cmd 的命令

javascript - 使用 Javascript 淡入/淡出数组列表中的单词

javascript - jquery/javascript : function(e){. ... e 是什么?为什么需要它?它实际上做了什么/完成了什么?

javascript - jquery 验证消息未显示

iphone - 如何仅在 iPhone 横向模式(视口(viewport)元标记)下定义网站的宽度?