是否有可能切换元素的可见性,使用功能.hide()
,.show()
或.toggle()
?
你会如何测试一个元素是否visible
还是hidden
?
是否有可能切换元素的可见性,使用功能.hide()
,.show()
或.toggle()
?
你会如何测试一个元素是否visible
还是hidden
?
Answers:
由于问题涉及单个元素,因此此代码可能更合适:
// 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
)
:visible
也将检查父元素是否可见,如chiborg指出的那样。
display
属性。鉴于最初的问题是show()
和hide()
,并且它们已设置display
,我的回答是正确的。通过它与IE7兼容的方式,这是一个测试代码段-jsfiddle.net/MWZss ;
您可以使用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
属性。
您可以使用: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" });
:visible
根据jQuery文档的选择器:
- 它们的CSS
display
值为none
。- 它们是具有
type="hidden"
。- 它们的宽度和高度明确设置为0。
- 祖先元素被隐藏,因此该元素未显示在页面上。
带有
visibility: hidden
或的元素opacity: 0
被视为可见,因为它们仍然占用布局中的空间。
这在某些情况下很有用,而在其他情况下则没有用,因为如果您想检查元素是否可见(display != none
),而忽略父级的可见性,您会发现.css("display") == 'none'
不仅速度更快,而且还会正确返回可见性检查。
如果要检查可见性而不是显示,则应使用: .css("visibility") == "hidden"
。
还请考虑其他jQuery注释:
因为
:visible
是jQuery扩展而不是CSS规范的一部分,所以使用的查询:visible
无法利用本机DOMquerySelectorAll()
方法提供的性能提升。为了在:visible
选择元素时获得最佳性能,请先使用纯CSS选择器选择元素,然后使用.filter(":visible")
。
另外,如果您担心性能,则应选中“ 现在您可以看到我…显示/隐藏性能”(2010-05-04)。并使用其他方法来显示和隐藏元素。
元素可见性和jQuery是如何工作的 ;
一个元素可以与被隐藏display:none
,visibility:hidden
或opacity:0
。这些方法之间的区别:
display:none
隐藏元素,并且不占用任何空间;visibility:hidden
隐藏元素,但是它仍然占用布局中的空间;opacity:0
将元素隐藏为“ visibility:hidden”,并且仍然占用布局中的空间;唯一的区别是不透明度使一个元素可以部分透明。
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切换方法:
$('.click').click(function() {
$('.target').toggle();
});
$('.click').click(function() {
$('.target').slideToggle();
});
$('.click').click(function() {
$('.target').fadeToggle();
});
visibility:hidden
和之间的另一个区别opacity:0
是元素仍将通过响应事件(例如点击)opacity:0
。我了解了为文件上传创建自定义按钮的技巧。
您也可以使用普通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() {
// Animation complete.
alert($('#book').is(":visible")); //<--- TRUE if Visible False if Hidden
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="clickme">
Click here
</div>
<img id="book" src="https://upload.wikimedia.org/wikipedia/commons/8/87/Google_Chrome_icon_%282011%29.png" alt="" width="300"/>
资源:
:hidden
在jQuery中针对选择器测试元素时,应考虑将绝对定位的元素识别为隐藏,尽管其子元素可见。
首先,这似乎有点违反直觉–尽管仔细查看jQuery文档会提供相关信息:
可以将元素视为隐藏的原因有几个:[...]它们的宽度和高度明确设置为0。[...]
因此,这对于盒模型和元素的计算样式实际上是有意义的。即使没有将width和height 显式设置为0,也可以隐式设置它们。
看下面的例子:
console.log($('.foo').is(':hidden')); // true
console.log($('.bar').is(':hidden')); // false
.foo {
position: absolute;
left: 10px;
top: 10px;
background: #ff0000;
}
.bar {
position: absolute;
left: 10px;
top: 10px;
width: 20px;
height: 20px;
background: #0000ff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo">
<div class="bar"></div>
</div>
jQuery 3.x的更新:
使用jQuery 3,描述的行为将改变!如果元素具有任何布局框,包括宽度和/或高度为零的布局框,则它们将被视为可见。
带有jQuery 3.0.0-alpha1的JSFiddle:
相同的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');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="checkme" class="product" style="display:none">
<span class="itemlist"><!-- Shows Results for Fish --></span> Category:Fish
<br>Product: Salmon Atlantic
<br>Specie: Salmo salar
<br>Form: Steaks
</div>
要检查它是否不可见,我使用!
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
或以下也是sam,将jQuery选择器保存在一个变量中,以便在需要多次时具有更好的性能:
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
使用为“隐藏”元素指定的类很容易,也是最有效的方法之一。将Display
样式“隐藏”的类切换为“无”样式将比直接编辑该样式更快。我在“堆栈溢出”问题中相当详尽地解释了其中的一些问题,即在同一个div中将两个元素变为可见/隐藏状态。
这是Google前端工程师Nicholas Zakas进行的Google技术讲座的真正令人启发的视频:
激活了对adblocker 使用可见检查的示例:
$(document).ready(function(){
if(!$("#ablockercheck").is(":visible"))
$("#ablockermsg").text("Please disable adblocker.").show();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>
“ ablockercheck”是adblocker阻止的ID。因此,检查它是否可见,便可以检测到adblocker是否已打开。
毕竟,没有哪个例子适合我,所以我写了自己的例子。
测试(不支持Internet Explorer filter:alpha
):
a)检查文件是否未隐藏
b)检查元素的宽度/高度/不透明度为零或display:none
/ visibility:hidden
内联样式为零
c)检查元素的中心(也是因为它比测试每个像素/角更快)是不是被其他元素(和所有祖先)隐藏了,例如: overflow:hidden
/滚动/一个元素覆盖另一个元素)或屏幕边缘
d)检查元素是否具有零宽度/高度/不透明度或display:none
/可见性:隐藏在计算样式中(在所有祖先中)
经过测试
Android 4.4(本机浏览器/ Chrome / Firefox),Firefox(Windows / Mac),Chrome(Windows / Mac),Opera(Windows Presto / Mac WebKit),Internet Explorer(Internet Explorer 5-11文档模式+ Internet Explorer 8 on a虚拟机)和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
您需要同时检查...显示和可见性:
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");
// Code
}
else
{
alert("hidden");
}
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<input type="text" id="tElement" style="display:block;">Firstname</input>
因为Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout
(如jQuery:visible Selector所述)-我们可以通过以下方式检查element是否真正可见:
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;
}
});
另外,这里是一个三元条件表达式,用于检查元素的状态然后进行切换:
$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
$('elementToToggle').toggle('slow');
……:)
$(element).is(":visible")
适用于Internet Explorer 8下的jQuery 1.4.4,但不适用于jQuery 1.3.2 。可以使用Tsvetomir Tsonev的有用测试片段进行测试。只要记住要更改jQuery的版本,并在每个版本下进行测试即可。