相关疑难解决方法(0)

如何判断DOM元素在当前视口中是否可见?

是否有一种有效的方法来判断DOM元素(在HTML文档中)当前是否可见(出现在视口中)?

(关于Firefox的问题)

html javascript browser firefox dom

878
推荐指数
18
解决办法
46万
查看次数

有效地获得元素的可见区域坐标

StackOverflow的是装载 问题有关如何检查元素是否在检视真正可见的,但它们都寻求一个布尔答案.我有兴趣获得元素的可见实际区域.

function getVisibleAreas(e) {
    ...
    return rectangleSet;
}
Run Code Online (Sandbox Code Playgroud)

更正式地说 - 元素的可见区域是CSS坐标中的一组(最好是非重叠的)矩形,elementFromPoint(x, y)如果点(x,y)包含在(至少)一个矩形中,它将返回元素.集合.

在所有DOM元素(包括iframe)上调用此函数的结果应该是一组非重叠区域集,其中union是整个视口区域.

我的目标是创建一种视口"转储"数据结构,它可以有效地为视口中的给定点返回单个元素,反之亦然 - 对于转储中的给定元素,它将返回可见的集合区域.(数据结构将传递给远程客户端应用程序,因此当我需要查询视口结构时,我不一定能访问实际文档).

实施要求:

  • 显然,实现应该考虑元素的hidden状态z-index,页眉和页脚等.
  • 我正在寻找适用于所有常用浏览器的实现,尤其是移动设备 - Android的Chrome和iOS的Safari.
  • 最好不要使用外部库.

    当然,我可能天真并且elementFromPoint在视口中调用每个离散点,但是性能是至关重要的,因为我迭代所有元素,并且会经常这样做.

    请指导我如何实现这一目标.

    免责声明:我对网络编程概念很不错,所以我可能使用了错误的技术术语.

    进展:

    我想出了一个实现.算法非常简单:

    1. 迭代所有元素,并将其垂直/水平线添加到坐标图(如果坐标位于视口内).
    2. 为每个"矩形"中心位置调用`document.elementFromPoint`.矩形是来自步骤1的地图中的两个连续垂直坐标和两个连续水平坐标之间的区域.

    这会产生一组区域/矩形,每个区域/矩形指向一个元素.

    我的实施问题是:

    1. 对于复杂的页面来说效率很低(对于非常大的屏幕和gmail收件箱,最多可能需要2-4分钟).
    2. 它每单个元素产生大量的矩形,这使得通过网络进行字符串化和发送效率低下,并且使用起来也不方便(我希望最终得到每个元素尽可能少的矩形集合).

    尽我所知,这个elementFromPoint电话需要花费很多时间才能使我的算法相对无用......

    有谁能建议更好的方法?

    这是我的实现:

    function AreaPortion(l, t, r, b, currentDoc) {
        if (!currentDoc) currentDoc = document;
        this._x = l;
        this._y = t;
        this._r = r;
        this._b = b;
        this._w …
    Run Code Online (Sandbox Code Playgroud)
  • html javascript css jquery visibility

    15
    推荐指数
    1
    解决办法
    4337
    查看次数

    标签 统计

    html ×2

    javascript ×2

    browser ×1

    css ×1

    dom ×1

    firefox ×1

    jquery ×1

    visibility ×1