【问题标题】:How to check element's visibility via javascript?如何通过javascript检查元素的可见性?
【发布时间】:2009-08-27 19:14:44
【问题描述】:

我对检查元素是否具有 display:none 样式显式性(即 style="display:none")、是否具有具有(或继承)此样式的类或其父元素之一感兴趣隐藏(我的元素继承了这个)

案例1:

<body><div><span style="display:none;">Some hidden text</span></div>

<body><div style="display:none;"><span>Some hidden text</span></div>

案例2:

SomeClass {   display:none;   }
<body><div class="SomeClass"><span>Some hidden text</span></div>

谢谢,

【问题讨论】:

    标签: javascript css


    【解决方案1】:

    您正在为两种不同情况寻找一种解决方案。

    第一个场景是获取 CSS 属性的级联/计算样式。请参阅this answer 了解如何执行此操作。

    第二种情况是检测元素的任何父母是否被隐藏。这需要遍历,既麻烦又慢。

    您可以采用outlined here 的解决方案(自1.3.2 起被 jQuery/Sizzle 采用),只需读取元素的尺寸:

    var isVisible = element.offsetWidth > 0 || element.offsetHeight > 0;
    

    如果它有尺寸,那么它是可见的,因为它占用了文档中的一些矩形空间(无论多么小)。请注意,对于某些浏览器中的某些元素,此技术仍然有 some downsides,但在大多数情况下应该可以工作。

    【讨论】:

    • 不需要遍历,我只需要检查父级是否会影响计算样式,因此计算机样式对我来说就足够了...感谢您的回答,它有很大帮助,在这里是我最后使用的代码: function IsVisible(elem) { if (elem.currentStyle) // ie only { return elem.currentStyle["display"] != 'none'; } else { // jquery 的计算方式是可见的。返回 (elem.offsetWidth > 0 || elem.offsetHeight > 0);但是,我需要做更多的测试,看看是否“||”就足够了,还是我需要用“&&”代替..
    • jQuery/Sizzle 1.3.2 链接已损坏,您现在可以find it here
    • 在编写 jQuery 中使用的当前解决方案并修复了缺点时,可以找到 here。进一步讨论here
    • 这只是说明我刚刚使用 IE8 测试了上述解决方案,它似乎按预期工作,因此@Crescent Fresh 提到的downsides 可能不再适用。我测试了 IE8 版本 8.0.7601.17514。
    • "var isVisible" 具有误导性,在这种情况下实际上应该是“var isDisplayed”,特别是因为这个答案不适用于“可见性:隐藏”元素仍然有偏移,即使它不能见过
    【解决方案2】:

    这是确定元素是否可见的最快捷、最简单的方法。

    function is_visible(e) {return e.offsetWidth > 0 || e.offsetHeight > 0;}
    

    【讨论】:

      【解决方案3】:

      每个案例都需要自己的检查,并且您需要知道该元素的 ID。首先,抓取元素(这样做是为了让代码可读):

      var MyElementName = document.getElementById("MyElementName");
      

      然后进行检查:

      案例 1:

       if (MyElementName.style.display == "none")
      

      案例2,查看父级,先检查FF:

      if ((MyElementName.previousSibling.nodeType == 3 )
          && (MyElementName.parentNode.nextSibling.style.display == "none"))
      

      那么对于其他浏览器:

      else (MyElementName.parentNode.style.display == "none")
      

      案例3,寻找应用的css类:

      if (MyElementName.className = "SomeClass")
      

      【讨论】:

        【解决方案4】:

        上述解决方案适合这种“隐形”场景:

        display:none;
        

        但它不适合这个:

        visibility: hidden;
        

        为了包含可见性测试:隐藏;脚本可以修改如下...

        首先,创建一个跨浏览器兼容的函数来获取所需元素的计算样式:

        computedStyle = function(vElement) {
          return window.getComputedStyle?
                 ?window.getComputedStyle(vElement,null)
                 :vElement.currentStyle;                    //IE 8 and less
        }
        

        其次,创建函数来测试可见性

        isVisible = function(vElement) {
          return !(vElement.offsetWidth == 0 && vElement.offsetHeight == 0)
                 && computedStyle(vElement).visibility != "hidden";  
        }
        

        最后,只需在需要的地方引用 isVisible 函数,如下所示:

        if (isVisible(myElement)) {
          alert('You can see me!');
        } else {
          alert('I am invisible ha ha!');
        }
        

        请注意,当前的 isVisible() 测试不适合许多“不可见”场景(但是我认为可以增强测试以包含这些)。以下是几个例子:

        1. 元素的颜色与周围的颜色相同
        2. 其中一个元素可见,但在物理上位于另一个元素之后,例如。不同的 z-index 值

        关于上面的 computedStyle() 函数,可能还需要注意以下几点:

        1. 除了测试可见性之外,它当然可以用于许多其他与样式相关的目的
        2. 由于浏览器支持不完整,我选择忽略 :pseudo 样式测试,但是如果需要,可以对函数进行细微修改。

        【讨论】:

          【解决方案5】:

          这是你想要做的吗?

          function SomeClass()
          {
            if (document.getElementById("MY_DIV_ID").style.display == "none")
            {
          
            }
          }
          

          【讨论】:

          • 我不认为这是他想要的......我认为他想要一种方法来检查它是由一个类设置还是内联完成,这种方式只有在它是内联完成
          猜你喜欢
          • 2012-07-08
          • 2017-02-28
          • 2012-09-18
          • 2013-06-28
          • 1970-01-01
          • 2019-12-03
          • 2017-01-01
          • 2017-09-17
          相关资源
          最近更新 更多