¿Es posible alternar la visibilidad de un elemento, usando las funciones .hide()
, .show()
o .toggle()
?
¿Cómo probarías si un elemento es visible
o hidden
?
¿Es posible alternar la visibilidad de un elemento, usando las funciones .hide()
, .show()
o .toggle()
?
¿Cómo probarías si un elemento es visible
o hidden
?
Dado que la pregunta se refiere a un solo elemento, este código podría ser más adecuado:
// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");
// The same works with hidden
$(element).is(":hidden");
Es lo mismo que la sugerencia de twernt , pero aplicada a un solo elemento; y coincide con el algoritmo recomendado en las preguntas frecuentes de jQuery .
Usamos jQuery's is () para verificar el elemento seleccionado con otro elemento, selector o cualquier objeto jQuery. Este método recorre los elementos DOM para encontrar una coincidencia que satisfaga el parámetro pasado. Devolverá verdadero si hay una coincidencia; de lo contrario, devolverá falso.
visible=false
y display:none
; Considerando que la solución de Mote ilustra claramente la intención de los codificadores de verificar display:none
; (a través de la mención de ocultar y mostrar qué control display:none
no visible=true
)
29 de diciembre de 2010 a las 18:30
:visible
también verificará si los elementos principales son visibles, como señaló chiborg.
6 de enero de 2011 a las 12:30
display
propiedad. Dado que la pregunta original es para show()
y hide()
, y establecieron display
, mi respuesta es correcta. Por cierto, funciona con IE7, aquí hay un fragmento de prueba: jsfiddle.net/MWZss ;
14 de enero de 2011 a las 16:54
Puedes usar el hidden
selector:
// Matches all elements that are hidden
$('element:hidden')
Y el visible
selector:
// Matches all elements that are visible
$('element:visible')
type="hidden"
es solo un caso que puede activarse: oculto. Los elementos sin alto ni ancho, los elementos con display: none
y los elementos con antepasados ocultos también se clasificarán como: ocultos.
15 de enero de 2016 a las 4:15
if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
// 'element' is hidden
}
El método anterior no considera la visibilidad del padre. Para considerar al padre también, debe usar .is(":hidden")
o .is(":visible")
.
Por ejemplo,
<div id="div1" style="display:none">
<div id="div2" style="display:block">Div2</div>
</div>
The above method will consider
div2
visible while:visible
not. But the above might be useful in many cases, especially when you need to find if there is any error divs visible in the hidden parent because in such conditions:visible
will not work.
hide()
, show()
y toggle()
funciones, sin embargo, como la mayoría ya han dicho, debemos utilizar los :visible
y :hidden
pseudo-clases.
14/04/15 a las 9:18
Ninguna de estas respuestas aborda lo que entiendo que es la pregunta, que es lo que estaba buscando, "¿Cómo manejo los elementos que tienen visibility: hidden
?" . Ni :visible
tampoco :hidden
va a manejar esto, ya que ambos se buscan para su visualización por la documentación. Por lo que pude determinar, no hay un selector para manejar la visibilidad de CSS. Así es como lo resolví (selectores de jQuery estándar, puede haber una sintaxis más condensada):
$(".item").each(function() {
if ($(this).css("visibility") == "hidden") {
// handle non visible state
} else {
// handle visible state
}
});
visibility
literalmente, pero la pregunta era How you would test if an element has been hidden or shown using jQuery?
. Usar jQuery significa: la display
propiedad.
visibility: hidden
o opacity: 0
se consideran visibles, ya que aún consumen espacio en el diseño. Vea la respuesta de Pedro Rainho y la documentación de jQuery en el :visible
selector.
De ¿Cómo determino el estado de un elemento conmutado?
Puede determinar si un elemento está contraído o no utilizando los selectores :visible
y :hidden
.
var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');
Si simplemente está actuando sobre un elemento en función de su visibilidad, puede incluir :visible
o :hidden
en la expresión del selector. Por ejemplo:
$('#myDiv:visible').animate({left: '+=200px'}, 'slow');
top:-1000px
... Supongo que es un caso de borde
A menudo, al comprobar si algo es visible o no, va a seguir adelante inmediatamente y hacer algo más con él. El encadenamiento de jQuery lo hace fácil.
Entonces, si tiene un selector y desea realizar alguna acción en él solo si está visible u oculto, puede usarlo filter(":visible")
o filter(":hidden")
seguirlo encadenándolo con la acción que desea realizar.
Entonces, en lugar de una if
declaración, como esta:
if ($('#btnUpdate').is(":visible"))
{
$('#btnUpdate').animate({ width: "toggle" }); // Hide button
}
O más eficiente, pero aún más feo:
var button = $('#btnUpdate');
if (button.is(":visible"))
{
button.animate({ width: "toggle" }); // Hide button
}
Puedes hacerlo todo en una sola línea:
$('#btnUpdate').filter(":visible").animate({ width: "toggle" });
El :visible
selector de acuerdo con la documentación de jQuery :
- They have a CSS
display
value ofnone
.- They are form elements with
type="hidden"
.- Their width and height are explicitly set to 0.
- An ancestor element is hidden, so the element is not shown on the page.
Elements with
visibility: hidden
oropacity: 0
are considered to be visible, since they still consume space in the layout.
Esto es útil en algunos casos e inútil en otros, porque si desea verificar si el elemento es visible ( display != none
), ignorando la visibilidad de los padres, encontrará que hacerlo .css("display") == 'none'
no solo es más rápido, sino que también devolverá la verificación de visibilidad correctamente.
Si desea comprobar la visibilidad en lugar de la pantalla, se debe utilizar: .css("visibility") == "hidden"
.
También tenga en cuenta las notas adicionales de jQuery :
Because
:visible
is a jQuery extension and not part of the CSS specification, queries using:visible
cannot take advantage of the performance boost provided by the native DOMquerySelectorAll()
method. To achieve the best performance when using:visible
to select elements, first select the elements using a pure CSS selector, then use.filter(":visible")
.
Además, si le preocupa el rendimiento, debería marcar Ahora me ves… mostrar / ocultar rendimiento (2010-05-04). Y use otros métodos para mostrar y ocultar elementos.
Cómo funciona la visibilidad de elementos y jQuery ;
Un elemento puede estar oculto con display:none
, visibility:hidden
o opacity:0
. La diferencia entre esos métodos:
display:none
oculta el elemento y no ocupa espacio;visibility:hidden
oculta el elemento, pero aún ocupa espacio en el diseño;opacity:0
oculta el elemento como "visibilidad: oculta" y aún ocupa espacio en el diseño; la única diferencia es que la opacidad permite hacer que un elemento sea parcialmente transparente;
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: ""
});
}
Métodos útiles de alternancia de jQuery:
$('.click').click(function() {
$('.target').toggle();
});
$('.click').click(function() {
$('.target').slideToggle();
});
$('.click').click(function() {
$('.target').fadeToggle();
});
visibility:hidden
y opacity:0
es que el elemento seguirá respondiendo a eventos (como clics) con opacity:0
. Aprendí ese truco haciendo un botón personalizado para cargar archivos.
Esto funciona para mí, y estoy usando show()
y hide()
para hacer que mi div esté oculto / visible:
if( $(this).css('display') == 'none' ){
/* your code goes here */
} else {
/* alternate logic */
}
También puede hacer esto usando JavaScript simple:
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;
}
Notas:
Funciona en todas partes
Funciona para elementos anidados
Funciona para CSS y estilos en línea
No requiere un marco
visibility: hidden
para ser visibles .
Usaría la clase CSS .hide { display: none!important; }
.
Para esconder / mostrar, llamo .addClass("hide")/.removeClass("hide")
. Para comprobar la visibilidad, utilizo .hasClass("hide")
.
Es una forma simple y clara de verificar / ocultar / mostrar elementos, si no planea usar métodos .toggle()
o .animate()
.
.hasClass('hide')
no comprueba si un antepasado del padre está oculto (lo que también lo ocultaría). Posiblemente podría hacer que esto funcione correctamente comprobando si .closest('.hide').length > 0
, pero ¿por qué reinventar la rueda?
$('#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"/>
Fuente (de mi blog):
Uno puede simplemente usar el atributo hidden
o visible
, como:
$('element:hidden')
$('element:visible')
O se puede simplificar con el mismo es de la siguiente manera.
$(element).is(":visible")
ebdiv
debe establecerse en style="display:none;"
. Funciona tanto para mostrar como para ocultar:
$(document).ready(function(){
$("#eb").click(function(){
$("#ebdiv").toggle();
});
});
Otra respuesta que debe tener en cuenta es que si está ocultando un elemento, debe usar jQuery , pero en lugar de ocultarlo, elimina todo el elemento, pero copia su contenido HTML y la etiqueta en una variable jQuery, y luego todo lo que necesita hacer es probar si existe una etiqueta de este tipo en la pantalla, usando el archivo normal if (!$('#thetagname').length)
.
Al probar un elemento contra el :hidden
selector en jQuery, se debe considerar que un elemento posicionado absoluto puede reconocerse como oculto aunque sus elementos secundarios sean visibles .
Esto parece algo contrario a la intuición en primer lugar, aunque echar un vistazo más de cerca a la documentación de jQuery proporciona la información relevante:
Elements can be considered hidden for several reasons: [...] Their width and height are explicitly set to 0. [...]
Entonces, esto tiene sentido en lo que respecta al modelo de caja y el estilo calculado para el elemento. Incluso si el ancho y el alto no se establecen explícitamente en 0, pueden establecerse implícitamente .
Eche un vistazo al siguiente ejemplo:
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>
Actualización para jQuery 3.x:
¡Con jQuery 3, el comportamiento descrito cambiará! Los elementos se considerarán visibles si tienen cuadros de diseño, incluidos los de ancho y / o alto cero.
JSFiddle con jQuery 3.0.0-alpha1:
El mismo código JavaScript tendrá esta salida:
console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false
Esto puede funcionar:
expect($("#message_div").css("display")).toBe("none");
Ejemplo:
$(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>
Para comprobar si no es visible utilizo !
:
if ( !$('#book').is(':visible')) {
alert('#book is not visible')
}
O lo siguiente también es el sam, guardando el selector de jQuery en una variable para tener un mejor rendimiento cuando lo necesite varias veces:
var $book = $('#book')
if(!$book.is(':visible')) {
alert('#book is not visible')
}
Usar clases designadas para "ocultar" elementos es fácil y también uno de los métodos más eficientes. Alternar una clase 'oculta' con un Display
estilo de 'ninguno' funcionará más rápido que editar ese estilo directamente. Expliqué algo de esto bastante a fondo en la pregunta de Stack Overflow Convertir dos elementos visibles / ocultos en el mismo div .
Aquí hay un video realmente esclarecedor de una charla técnica de Google realizada por el ingeniero front-end de Google, Nicholas Zakas:
Ejemplo de uso de la marca de verificación visible para adblocker está activado:
$(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" es un ID que bloquea adblocker. Por lo tanto, verificando si está visible, puede detectar si el bloqueador de anuncios está activado.
Después de todo, ninguno de los ejemplos me queda bien, así que escribí el mío.
Pruebas (sin soporte de Internet Explorer filter:alpha
):
a) Comprueba si el documento no está oculto
b) Verifique si un elemento tiene cero ancho / alto / opacidad o display:none
/ visibility:hidden
en estilos en línea
c) Compruebe si el centro (también porque es más rápido que probar cada píxel / esquina) del elemento no está oculto por otro elemento (y todos los antepasados, por ejemplo: overflow:hidden
/ scroll / un elemento sobre otro) o los bordes de la pantalla
d) Verifique si un elemento tiene cero ancho / alto / opacidad o display:none
/ visibilidad: oculto en estilos calculados (entre todos los antepasados)
Probado en
Android 4.4 (navegador nativo / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Presto / Mac WebKit), Internet Explorer (modos de documento de Internet Explorer 5-11 + Internet Explorer 8 en un máquina virtual) y 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;
}
})();
Cómo utilizar:
is_visible(elem) // boolean
Debe comprobar tanto ... Visualización como visibilidad:
if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
// The element is not visible
} else {
// The element is visible
}
Si buscamos $(this).is(":visible")
, jQuery verifica ambas cosas automáticamente.
Tal vez puedas hacer algo como esto
$(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>
Simplemente verifique la visibilidad verificando un valor booleano, como:
if (this.hidden === false) {
// Your code
}
Usé este código para cada función. De lo contrario, puede utilizar is(':visible')
para comprobar la visibilidad de un elemento.
Porque Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout
(como se describe para jQuery: selector visible ) - podemos verificar si el elemento es realmente visible de esta manera:
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;
}
});
Pero, ¿qué pasa si el CSS del elemento es como el siguiente?
.element{
position: absolute;left:-9999;
}
Por lo tanto , también se debe considerar esta respuesta a la pregunta de Stack Overflow: Cómo verificar si un elemento está fuera de la pantalla .
Se puede crear una función para verificar los atributos de visibilidad / visualización para medir si el elemento se muestra en la interfaz de usuario o no.
function checkUIElementVisible(element) {
return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}
También aquí hay una expresión condicional ternaria para verificar el estado del elemento y luego alternarlo:
$('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());
}
$(element).is(":visible")
funciona para jQuery 1.4.4, pero no para jQuery 1.3.2, en Internet & nbsp; Explorer & nbsp; 8 . Esto se puede probar utilizando el útil fragmento de prueba de Tsvetomir Tsonev . Solo recuerde cambiar la versión de jQuery, para probar en cada una.