检测元素是否可见

The*_*ver 507 javascript jquery

使用.fadeIn().fadeOut(),我一直在我的页面上隐藏/显示一个元素,但有两个按钮,一个用于隐藏,一个用于显示.我现在想要一个按钮来切换两者.因此,我的问题是如何检测元素是否可见?

我的HTML原样:

<a onclick="showTestElement()">Show</a>
<a onclick="hideTestElement()">Hide</a>
Run Code Online (Sandbox Code Playgroud)

我的JS是这样的:

function showTestElement() {
  $('#testElement').fadeIn('fast');
}

function hideTestElement() {
  $('#testElement').fadeOut('fast');
}
Run Code Online (Sandbox Code Playgroud)

我希望得到我的HTML:

<a onclick="toggleTestElement()">Show/Hide</a>
Run Code Online (Sandbox Code Playgroud)

我希望得到我的JS,虽然纯粹的jQuery会很好:

function toggleTestElement() {
  if (document.getElementById('testElement').***IS_VISIBLE***) {
    $('#testElement').fadeOut('fast');
  } else {
    $('#testElement').fadeIn('fast');
  }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助感激地收到..

Boj*_*les 744

您正在寻找:

.is(':visible')
Run Code Online (Sandbox Code Playgroud)

虽然您可能应该更改您的选择器以使用jQuery,因为您仍然在其他地方使用它:

if($('#testElement').is(':visible')) {
    // Code
}
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,如果目标元素的父元素中的任何一个被隐藏,那么.is(':visible')孩子将返回false(这是有意义的).

jQuery 3

:visible由于它必须遍历DOM树来检查一堆元素,因此它已成为一个相当慢的选择器.然而,jQuery 3有个好消息,正如这篇文章解释的那样(Ctrl+ Ffor :visible):

感谢Paul Irish在谷歌的一些侦探工作,我们发现了一些情况,当自定义选择器如:可见在同一文档中多次使用时,我们可以跳过一堆额外的工作.这个特殊情况现在快了17倍!

请记住,即使有了这些改进,选择器如:visible和:hidden也可能很昂贵,因为它们依赖于浏览器来确定元素是否实际显示在页面上.在最坏的情况下,这可能需要完全重新计算CSS样式和页面布局!虽然我们不鼓励在大多数情况下使用它们,但我们建议您测试页面以确定这些选择器是否会导致性能问题.


进一步扩展到您的特定用例,有一个内置的jQuery函数,名为$.fadeToggle():

function toggleTestElement() {
    $('#testElement').fadeToggle('fast');
}
Run Code Online (Sandbox Code Playgroud)

  • @vsync而不是呻吟,发布一个支持IE7及以上版本的vanilla JavaScript解决方案.除了发布讽刺(尽管是正确的)评论之外,它还会提供更多帮助 (9认同)
  • @Felipe根据[thise page](http://blog.jquery.com/2009/02/20/jquery-1-3-2-released/#:visible.2F:hidden_​​Overhauled)**...一个元素如果浏览器报告的offsetWidth或offsetHeight大于0**,则可见.[这个JSBin](http://jsbin.com/UTomiLe/1/edit)显示如果父母被隐藏,那么它是孩子 (3认同)

Ry-*_*Ry- 45

没有必要,只需fadeToggle()在元素上使用:

$('#testElement').fadeToggle('fast');
Run Code Online (Sandbox Code Playgroud)

这是一个演示.

  • 这是一个棘手的答案,其中问题清楚地问了一件事,但OP的最佳方法是另一个. (15认同)

Iva*_*nos 26

if($('#testElement').is(':visible')){
    //what you want to do when is visible
}
Run Code Online (Sandbox Code Playgroud)