如何在 jQuery 中检查一个元素是否隐藏

在前端开发中,我们常常需要判断一个元素是否隐藏。在 jQuery 中,有多种方式可以实现这一点。然而,并不是所有的解决方案都适用于所有情况。为此,我写了一个通用的解决方案来应对各种复杂情形。本文将详细介绍这个方法及其使用方式。

测试条件

为了确保代码的通用性,该方法涵盖以下几种情况:

  1. 检测文档是否隐藏: 有时整个文档处于隐藏状态,例如在某些浏览器的背景标签页中。
  2. 测试元素的宽度、高度、透明度以及内联样式中的 display:nonevisibility:hidden 如果元素的宽度或高度为零,透明度为零,或者内联样式设置为 display:nonevisibility:hidden,则该元素被认为是隐藏的。
  3. 检测元素中心点是否被其他元素遮挡: 如果元素的中心被其他元素(例如具有 overflow:hidden、滚动或覆盖的元素)或屏幕边缘遮挡,该元素也被视为隐藏。
  4. 检测计算样式中的宽度、高度、透明度以及 display:nonevisibility:hidden 同时会检查所有祖先元素的这些属性,以确保任何一个包含祖先元素设置为隐藏状态时,当前元素都被视为隐藏。

适用的浏览器

该方法在多个平台和浏览器上进行了测试,包括:

  • Android 4.4 (原生浏览器/Chrome/Firefox)
  • Firefox (Windows/Mac)
  • Chrome (Windows/Mac)
  • Opera (Presto 引擎/ Mac WebKit)
  • Internet Explorer (IE 5-11 文档模式,以及虚拟机上的 IE 8)
  • Safari (Windows/Mac/iOS)

代码实现

下面是实现这一功能的 JavaScript 代码。请确保在您的项目中引入 jQuery 库。

var is_visible = (function () {
    var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
        y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
        relative = !!((!x && !y) || !document.elementFromPoint(x, y));
        
    function inside(child, parent) {
        while (child) {
            if (child === parent) return true;
            child = child.parentNode;
        }
        return false;
    }
    
    return function (elem) {
        if (
            document.hidden ||
            elem.offsetWidth === 0 ||
            elem.offsetHeight === 0 ||
            elem.style.visibility === 'hidden' ||
            elem.style.display === 'none' ||
            elem.style.opacity === 0
        ) return false;
        
        var rect = elem.getBoundingClientRect();
        
        if (relative) {
            if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth / 2, rect.top + elem.offsetHeight / 2), elem)) return false;
        } else if (
            !inside(document.elementFromPoint(rect.left + elem.offsetWidth / 2 + window.pageXOffset, rect.top + elem.offsetHeight / 2 + window.pageYOffset), elem) ||
            (
                rect.top + elem.offsetHeight / 2 < 0 ||
                rect.left + elem.offsetWidth / 2 < 0 ||
                rect.bottom - elem.offsetHeight / 2 > (window.innerHeight || document.documentElement.clientHeight) ||
                rect.right - elem.offsetWidth / 2 > (window.innerWidth || document.documentElement.clientWidth)
            )
        ) return false;
        
        if (window.getComputedStyle || elem.currentStyle) {
            var el = elem,
                comp = null;
                
            while (el) {
                if (el === document) { break; }
                else if (!el.parentNode) return false;
                
                comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                
                if (comp && (comp.visibility === 'hidden' || comp.display === 'none' || (typeof comp.opacity !== 'undefined' && comp.opacity !== 1))) {
                    return false;
                }
                
                el = el.parentNode;
            }
        }
        
        return true;
    };
})();

使用方法

要使用该函数,只需将目标元素传递给 is_visible 函数。该函数将返回一个布尔值,表示元素是否可见。

is_visible(elem); // 返回布尔值

通过本文的讲解,相信您已经掌握了如何在 jQuery 中判断一个元素是否隐藏的多个方面,希望这对您的项目有所帮助。如有任何问题,欢迎在评论区留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JKooll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值