如何使用.hide()
、.show()
或.toggle()
来切换元素的可见性?
如何测试元素是否visible
(可见)或hidden
(隐藏)?
如何使用.hide()
、.show()
或.toggle()
来切换元素的可见性?
如何测试元素是否visible
(可见)或hidden
(隐藏)?
由于该问题涉及单个元素,因此这段代码可能更合适:
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
这与twernt的建议相同,但应用于单个元素; 并且它符合jQuery FAQ中推荐的算法。
我们使用jQuery的is()方法来检查选定的元素与另一个元素、选择器或任何jQuery对象是否匹配。 该方法沿着DOM元素遍历以查找满足传递参数的匹配项。 如果存在匹配项,则返回true,否则返回false。
visible=false
和display:none
的概念;然而Mote的解决方案清楚地说明了代码编写者意图检查display:none
(通过提到控制display:none
而不是visible=true
的hide和show)。 - kralco626:visible
也会检查父元素是否可见。 - Tsvetomir Tsonevdisplay
属性。鉴于原问题涉及到show()
和hide()
函数,并且它们设置的是display
属性,我的答案是正确的。顺便说一句,它可以在IE7上工作,这里有一个测试代码段 - http://jsfiddle.net/MWZss/ - Tsvetomir Tsonevtype="hidden"
的表单元素只是触发:hidden的一种情况。没有高度和宽度的元素、display: none
的元素和具有隐藏祖先的元素也将符合:hidden的条件。 - Joshua Walshif ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
// 'element' is hidden
}
上述方法未考虑父元素的可见性。若要同时考虑父元素,您应该使用.is(":hidden")
或.is(":visible")
。
例如,
<div id="div1" style="display:none">
<div id="div2" style="display:block">Div2</div>
</div>
上述方法会认为div2
是可见的,而:visible
则不一定。但是在许多情况下,上述方法可能很有用,特别是在需要查找隐藏父元素中是否可见任何错误:visible
将无法工作。hide()
、show()
和toggle()
函数,但正如大多数人已经说过的那样,我们应该使用:visible
和:hidden
伪类。 - Jimmy Knoot这些答案都没有解决我所理解的问题,这正是我在搜索的内容:"如何处理具有visibility: hidden
属性的项目?" :visible
和 :hidden
都无法处理此问题,因为它们都是根据文档寻找显示。就我所知,目前没有选择器可以处理CSS可见性。以下是我是如何解决该问题的(使用标准的jQuery选择器,可能还有更简洁的语法):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
visibility: hidden
或opacity: 0
属性的元素被认为是可见的,因为它们在布局中仍占用空间。请参考Pedro Rainho的答案和jQuery文档中对:visible
选择器的描述。 - awe:visible
和:hidden
选择器来确定一个元素是否被折叠。var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
如果您只是根据元素的可见性来操作它,可以在选择器表达式中直接包含:visible
或:hidden
。例如:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
top: -1000px
... 这可能是一个边缘情况。 - jazzcatfilter(":visible")
或filter(":hidden")
,然后将其与要执行的动作链接起来。if
语句:if ($('#btnUpdate').is(":visible"))
{
$('#btnUpdate').animate({ width: "toggle" }); // Hide button
}
或者更高效地:
var button = $('#btnUpdate');
if (button.is(":visible"))
{
button.animate({ width: "toggle" }); // Hide button
}
你可以在一行代码中完成所有操作:
$('#btnUpdate').filter(":visible").animate({ width: "toggle" });
:visible
选择器满足以下条件:
- CSS属性
display
的值为none
。- 表单元素设置了
type="hidden"
。- 宽度和高度明确设置为0。
- 祖先元素被隐藏,因此该元素在页面上不可见。
visibility: hidden
或opacity: 0
属性的元素被认为是可见的,因为它们仍然占据布局中的空间。
这在某些情况下很有用,但在其他情况下则无用,因为如果要检查元素是否可见(即display != none
),而忽略其父元素的可见性,则会发现执行.css("display") == 'none'
不仅更快,而且返回正确的可见性检查结果。
如果想检查的是可见性,而非显示方式,应该使用:.css("visibility") == "hidden"
。
此外,需要考虑到jQuery的附加说明:
由于
:visible
是jQuery扩展,而非CSS规范的一部分,使用:visible
查询无法利用原生DOMquerySelectorAll()
方法提供的性能优势。为了在选择元素时获得最佳性能,请先使用纯CSS选择器选择元素,然后使用.filter(":visible")
。
此外,如果你关心性能,应该查看Now you see me… show/hide performance (2010-05-04)以及使用其他方法来显示和隐藏元素。
如何使用jQuery来处理元素可见性:element visibility and jQuery works;
元素的隐藏可以通过display:none
、visibility:hidden
或opacity:0
实现,它们之间的区别:
display:none
隐藏元素并且不占据任何空间;visibility:hidden
隐藏元素但仍在布局中占据空间;opacity:0
像visibility:hidden
一样隐藏元素,并且仍在布局中占据空间;唯一的区别是opacity可以使元素部分透明。
if ($('.target').is(':hidden')) {
$('.target').show();
} else {
$('.target').hide();
}
if ($('.target').is(':visible')) {
$('.target').hide();
} else {
$('.target').show();
}
if ($('.target-visibility').css('visibility') == 'hidden') {
$('.target-visibility').css({
visibility: "visible",
display: ""
});
} else {
$('.target-visibility').css({
visibility: "hidden",
display: ""
});
}
if ($('.target-visibility').css('opacity') == "0") {
$('.target-visibility').css({
opacity: "1",
display: ""
});
} else {
$('.target-visibility').css({
opacity: "0",
display: ""
});
}
jQuery 的有用的 toggle 方法:
$('.click').click(function() {
$('.target').toggle();
});
$('.click').click(function() {
$('.target').slideToggle();
});
$('.click').click(function() {
$('.target').fadeToggle();
});
visibility:hidden
和 opacity:0
的另一个区别是,使用 opacity:0
时元素仍将对事件(如点击)作出响应。我学习过这个技巧,用于制作自定义文件上传按钮。 - urraka这对我很有效,我使用show()
和hide()
来隐藏/显示我的div:
if( $(this).css('display') == 'none' ){
/* your code goes here */
} else {
/* alternate logic */
}
你还可以使用纯JavaScript来实现这个功能:
function isRendered(domObj) {
if ((domObj.nodeType != 1) || (domObj == document.body)) {
return true;
}
if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
return isRendered(domObj.parentNode);
} else if (window.getComputedStyle) {
var cs = document.defaultView.getComputedStyle(domObj, null);
if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
return isRendered(domObj.parentNode);
}
}
return false;
}
注意事项:
适用于任何地方
适用于嵌套元素
适用于CSS和内联样式
无需框架
visibility: hidden
是可见的。 - alex
$(element).is(":visible")
适用于jQuery 1.4.4,但不适用于jQuery 1.3.2。可以使用Tsvetomir Tsonev提供的有用测试片段进行测试。请记得更改jQuery版本以在每个版本下进行测试。 - Reuben