如何使用 .hide()
、.show()
或 .toggle()
切换元素的可见性?
如何测试元素是 visible
还是 hidden
?
$(element).is(":visible")
在 Internet Explorer 8 下适用于 jQuery 1.4.4,但不适用于 jQuery 1.3.2。这可以使用 Tsvetomir Tsonev's helpful test snippet 进行测试。只要记住改变jQuery的版本,在每一个下测试。
由于问题涉及单个元素,因此此代码可能更合适:
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
它与 twernt's suggestion 相同,但应用于单个元素;它matches the algorithm recommended in the jQuery FAQ。
我们使用 jQuery 的 is() 来检查所选元素与另一个元素、选择器或任何 jQuery 对象。该方法遍历 DOM 元素以找到满足传递参数的匹配项。如果匹配则返回true,否则返回false。
您可以使用 hidden
选择器:
// Matches all elements that are hidden
$('element:hidden')
visible
选择器:
// Matches all elements that are visible
$('element:visible')
type="hidden"
的表单元素只是可以触发 :hidden 的一种情况。没有高度和宽度的元素、具有 display: none
的元素以及具有隐藏祖先的元素也将符合 :hidden 的条件。
if ( $(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 不可见。但是上面的方法在很多情况下可能很有用,尤其是当您需要查找隐藏的父级中是否有任何可见的错误 div 时,因为在这种情况下 :visible 将不起作用。
hide()
、show()
和 toggle()
函数,但是,正如大多数人已经说过的,我们应该使用 :visible
和 :hidden
伪类。
这些答案都没有解决我所理解的问题,即我正在搜索的问题,“我如何处理具有 visibility: hidden
的项目?”。 :visible
和 :hidden
都不会处理此问题,因为它们都在根据文档寻找显示。据我所知,没有选择器来处理 CSS 可见性。这是我解决它的方法(标准 jQuery 选择器,可能有更简洁的语法):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
visibility
,但问题是How you would test if an element has been hidden or shown using jQuery?
。使用 jQuery 意味着:display
属性。
visibility: hidden
或 opacity: 0
的元素被认为是可见的,因为它们仍然占用布局中的空间。请参阅 :visible
选择器上的 answer by Pedro Rainho 和 jQuery documentation。
来自 How do I determine the state of a toggled element?
您可以使用 :visible
和 :hidden
选择器确定元素是否折叠。
var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
如果您只是根据元素的可见性对其进行操作,则只需在选择器表达式中包含 :visible
或 :hidden
。例如:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
top:-1000px
...猜猜这是一个边缘情况
通常在检查某些东西是否可见时,您会立即继续并用它做其他事情。 jQuery 链接使这很容易。
因此,如果您有一个选择器,并且您希望仅在可见或隐藏时对其执行某些操作,您可以使用 filter(":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" });
根据 the jQuery documentation 的 :visible
选择器:
它们的 CSS 显示值为 none。它们是 type="hidden" 的表单元素。它们的宽度和高度显式设置为 0。祖先元素是隐藏的,因此该元素不会显示在页面上。具有可见性的元素:隐藏或不透明度:0 被认为是可见的,因为它们仍然占用布局中的空间。
这在某些情况下有用而在其他情况下无用,因为如果您要检查元素是否可见(display != none
),忽略父母的可见性,您会发现执行.css("display") == 'none'
不仅更快,而且还会返回能见度检查正确。
如果您想检查可见性而不是显示,您应该使用:.css("visibility") == "hidden"
。
还要考虑 the additional jQuery notes:
因为 :visible 是一个 jQuery 扩展而不是 CSS 规范的一部分,所以使用 :visible 的查询不能利用原生 DOM querySelectorAll() 方法提供的性能提升。为了在使用 :visible 选择元素时获得最佳性能,首先使用纯 CSS 选择器选择元素,然后使用 .filter(":visible")。
此外,如果您担心性能,您应该检查 Now you see me… show/hide performance (2010-05-04)。并使用其他方法显示和隐藏元素。
如何element visibility and jQuery works;
可以使用 display:none
、visibility:hidden
或 opacity:0
隐藏元素。这些方法之间的区别:
display:none 隐藏元素,不占空间;
visibility:hidden 隐藏元素,但在布局中仍然占用空间;
opacity:0 将元素隐藏为“visibility:hidden”,在布局中仍然占用空间;唯一的区别是不透明度可以让一个元素部分透明; if ($('.target').is(':hidden')) { $('.target').show(); } 其他 { $('.target').hide(); } if ($('.target').is(':visible')) { $('.target').hide(); } 其他 { $('.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 切换方法: $('.click').click(function() { $('.target').toggle(); }); $('.click').click(function() { $('.target').slideToggle(); }); $('.click').click(function() { $('.target').fadeToggle(); });
visibility:hidden
和 opacity:0
之间的另一个区别是元素仍将使用 opacity:0
响应事件(如点击)。我学会了为文件上传制作自定义按钮的技巧。
这对我有用,我正在使用 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
可见。
我会使用 CSS 类 .hide { display: none!important; }
。
对于隐藏/显示,我调用 .addClass("hide")/.removeClass("hide")
。为了检查可见性,我使用 .hasClass("hide")
。
如果您不打算使用 .toggle()
或 .animate()
方法,这是一种检查/隐藏/显示元素的简单明了的方法。
.hasClass('hide')
不检查父级的祖先是否隐藏(这也会使其隐藏)。您可以通过检查 .closest('.hide').length > 0
来使其正常工作,但为什么要重新发明轮子呢?
$('#clickme').click(function() { $('#book').toggle('slow', function() { // 动画完成。alert($('#book').is(" :visible")); //<--- TRUE if Visible False if 隐藏 }); });
来源(来自我的博客):
可以简单地使用 hidden
或 visible
属性,例如:
$('element:hidden')
$('element:visible')
或者您可以将其简化如下。
$(element).is(":visible")
ebdiv
应设置为 style="display:none;"
。它适用于显示和隐藏:
$(document).ready(function(){
$("#eb").click(function(){
$("#ebdiv").toggle();
});
});
在 jQuery 中针对 :hidden
选择器测试元素时,应考虑绝对定位元素可能被识别为隐藏,尽管其子元素可见。
首先,这似乎有点违反直觉——尽管仔细查看 jQuery 文档会给出相关信息:
元素可以被认为是隐藏的有几个原因:[...]它们的宽度和高度被明确设置为0。[...]
所以这对于盒子模型和元素的计算样式来说实际上是有意义的。即使宽度和高度没有显式设置为 0,它们也可能被隐式设置。
看看下面的例子:
console.log($('.foo').is(':hidden')); // true console.log($('.bar').is(':hidden')); // false .foo { 位置:绝对;左:10px;顶部:10px;背景:#ff0000; } .bar { 位置:绝对;左:10px;顶部:10px;宽度:20px;高度:20px;背景:#0000ff; }
jQuery 3.x 的更新:
使用 jQuery 3,所描述的行为将会改变!如果元素具有任何布局框,包括零宽度和/或高度的布局框,则元素将被视为可见。
JSFiddle 与 jQuery 3.0.0-alpha1:
相同的 JavaScript 代码将具有以下输出:
console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false
expect($("#message_div").css("display")).toBe("none");
$(document).ready(function() { if ($("#checkme:hidden").length) { console.log('Hidden'); } });
要检查它是否不可见,我使用 !
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
或者下面也是sam,将jQuery选择器保存在一个变量中,以便在多次需要时有更好的性能:
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
使用类切换,而不是样式编辑。 . .
使用为“隐藏”元素指定的类很容易,也是最有效的方法之一。使用 Display
样式“无”切换类“隐藏”将比直接编辑该样式执行得更快。我在 Stack Overflow 问题 Turning two elements visible/hidden in the same div 中非常彻底地解释了其中的一些内容。
JavaScript 最佳实践和优化
以下是 Google 前端工程师 Nicholas Zakas 的 Google Tech Talk 视频:
加速你的 Javascript (YouTube)
毕竟,没有一个例子适合我,所以我自己写了。
测试(不支持 Internet Explorer filter:alpha
):
a) 检查文档是否未隐藏
b)检查元素是否具有零宽度/高度/不透明度或内联样式中的 display:none
/ visibility:hidden
c)检查元素的中心(也因为它比测试每个像素/角更快)是否未被其他元素(以及所有祖先,例如:overflow:hidden
/滚动/一个元素覆盖另一个元素)或屏幕边缘隐藏
d) 检查元素是否具有零宽度/高度/不透明度或 display:none
/可见性:隐藏在计算样式中(在所有祖先中)
经测试
Android 4.4 (Native browser/Chrome/Firefox), Firefox (Windows/Mac), Chrome (Windows/Mac), Opera (Windows Presto/Mac WebKit), Internet Explorer(Internet Explorer 5-11文档模式+Internet  ;Explorer 8 在虚拟机上)和 Safari(Windows/Mac/iOS)。
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(elem) // boolean
使用 adblocker 的可见检查的示例已激活:
$(document).ready(function(){ if(!$("#ablockercheck").is(":visible")) $("#ablockermsg").text("请禁用adblocker。").show( ); });
“ablockercheck” 是 adblocker 阻止的 ID。因此,检查它是否可见,您可以检测广告拦截器是否已打开。
您需要同时检查...显示和可见性:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
// The element is not visible
} else {
// The element is visible
}
如果我们检查 $(this).is(":visible")
,jQuery 会自动检查这两个东西。
$(document).ready(function() { var visible = $('#tElement').is(':visible'); if(visible) { alert("visible"); // 代码 } else { alert( "隐藏"); } }); 名字输入>
只需通过检查布尔值来检查可见性,例如:
if (this.hidden === false) {
// Your code
}
我为每个功能使用了这段代码。否则,您可以使用 is(':visible')
检查元素的可见性。
因为 Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout
(如 jQuery :visible Selector 所述) - 我们可以通过以下方式检查元素是否真的可见:
function isElementReallyHidden (el) {
return $(el).is(":hidden") || $(el).css("visibility") == "hidden" || $(el).css('opacity') == 0;
}
var booElementReallyShowed = !isElementReallyHidden(someEl);
$(someEl).parents().each(function () {
if (isElementReallyHidden(this)) {
booElementReallyShowed = false;
}
});
但是如果元素的 CSS 如下所示呢?
.element{
position: absolute;left:-9999;
}
所以this answer to Stack Overflow question How to check if an element is off-screen也应该被考虑。
可以创建一个函数来检查可见性/显示属性,以衡量元素是否显示在 UI 中。
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}
这里还有一个三元条件表达式来检查元素的状态,然后切换它:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
$('elementToToggle').toggle('slow');
... :)
if($('#postcode_div').is(':visible')) {
if($('#postcode_text').val()=='') {
$('#spanPost').text('\u00a0');
} else {
$('#spanPost').text($('#postcode_text').val());
}
visible=false
和display:none
;而 Mote 的解决方案清楚地说明了编码人员检查display:none
的意图; (通过提及隐藏和显示哪个控件display:none
而不是visible=true
):visible
还将检查父元素是否可见。display
属性。鉴于原始问题是针对show()
和hide()
,并且它们设置为display
,我的答案是正确的。顺便说一句,它确实适用于 IE7,这是一个测试片段 - jsfiddle.net/MWZss ;