Entspricht jQuery .hide (), um die Sichtbarkeit festzulegen: versteckt


340

In jQuery gibt es .hide()und .show()Methoden , die die CSS setzt display: noneEinstellung.

Gibt es eine äquivalente Funktion, die die visibility: hiddenEinstellung festlegen würde ?

Ich weiß, dass ich verwenden kann, .css()aber ich bevorzuge eine Funktion wie .hide()oder so. Vielen Dank.


2
Sie können Ihre eigenen basierend auf.toggle()
— zerkms

Ich bin auch ein Fan von jQuerys toggleClass () -Methode dafür :) jqueryui.com/toggleClass Schauen Sie sich das Beispiel an, das ich in meiner Antwort unter stackoverflow.com/a/14632687/1056713
— Chaya Cooper

Antworten:


426

Sie könnten Ihre eigenen Plugins erstellen.

jQuery.fn.visible = function() {
    return this.css('visibility', 'visible');
};

jQuery.fn.invisible = function() {
    return this.css('visibility', 'hidden');
};

jQuery.fn.visibilityToggle = function() {
    return this.css('visibility', function(i, visibility) {
        return (visibility == 'visible') ? 'hidden' : 'visible';
    });
};

Wenn Sie die ursprüngliche jQuery überladen möchten toggle(), was ich nicht empfehle ...

!(function($) {
    var toggle = $.fn.toggle;
    $.fn.toggle = function() {
        var args = $.makeArray(arguments),
            lastArg = args.pop();

        if (lastArg == 'visibility') {
            return this.visibilityToggle();
        }

        return toggle.apply(this, arguments);
    };
})(jQuery);

jsFiddle .


@Tomas Sie müssten Schatten, toggle()die andere Skripte brechen könnten. Wenn Sie möchten , können Sie ein zusätzliches Argument hinzufügen, toggle()um anzugeben, ob umgeschaltet werden soll visibilityoder displaynicht. Ich würde jedoch nur die benutzerdefinierte in meinem letzten Beispiel verwenden. :)
— Alex

Könnten Sie ein Beispiel zur Unterstützung zusätzlicher Parameter show(Geschwindigkeit, Lockerung, Rückruf) veröffentlichen?
— Georg

11
Es ist überflüssig, wenn man es so betrachtet, aber es gibt einen Zweck. Wenn dies mit einem anderen Skript mit einem (function() { })()oder einem ähnlichen Skript verknüpft ist, wird ASI nicht aktiviert, da es wie ein Funktionsaufruf aussieht. Versuchen Sie dies und entfernen Sie das !.
— Alex

1
@NoBugs Automatisches Einfügen von Semikolons. Ich habe einen Blog-Beitrag geschrieben darüber geschrieben.
— Alex

1
@ VishalSakaria Soweit ich weiß, ist es kein genau definierter Begriff, daher sollte es in Ordnung sein, ihn hier zu verwenden.
— Alex

103

Es gibt keine eingebaute, aber Sie können ganz einfach Ihre eigene schreiben:

(function($) {
    $.fn.invisible = function() {
        return this.each(function() {
            $(this).css("visibility", "hidden");
        });
    };
    $.fn.visible = function() {
        return this.each(function() {
            $(this).css("visibility", "visible");
        });
    };
}(jQuery));

Sie können dies dann so nennen:

$("#someElem").invisible();
$("#someOther").visible();

Hier ist ein Arbeitsbeispiel .


1
Guter Punkt, nur eine Kraft der Gewohnheit. Vielen Dank. +1 auf Alex 'Antwort!
— James Allardice

Nur neugierig, was bringt es, diese beiden Funktionen in den (function($) {...}(jQuery));Wrapper zu packen? Ich habe noch nie meine eigenen Funktionen in jQuery definiert, ich habe immer nur Funktionen in reinem JavaScript definiert.
— VoidKing

2
@VoidKing - Dies ist nur die "Best Practice" für jQuery-Plugins gemäß den Dokumenten. Sie können den $Bezeichner innerhalb der Funktion verwenden, auch wenn er sich auf etwas anderes im übergeordneten Bereich bezieht.
— James Allardice

jQuery hat tatsächlich eine eingebaute toggleClass () -Methode dafür :) jqueryui.com/toggleClass Schauen Sie sich das Beispiel an, das ich in meiner Antwort unter stackoverflow.com/a/14632687/1056713
— Chaya Cooper

55

Eine noch einfachere Möglichkeit, dies zu tun, ist die Verwendung von jQuery's toggleClass () -Methode von

CSS

.newClass{visibility: hidden}

HTML

<a href="#" class=trigger>Trigger Element </a>
<div class="hidden_element">Some Content</div>

JS

$(document).ready(function(){
    $(".trigger").click(function(){
        $(".hidden_element").toggleClass("newClass");
    });
});

1
Ich mag diesen Ansatz. Es ist weniger eigenständig, da es ein separates Stylesheet erfordert, aber es hilft, alle Style-Informationen in den Stylesheets zu behalten, zu denen es gehören sollte. Wenn Sie die Sichtbarkeit deaktivieren möchten, können Sie ein CSS-Tag an einer Stelle ändern, anstatt Ihren gesamten JS-Code zu ändern.
— Vaughan

19
Für Benutzer von Bootstrap wird diese Klasse als unsichtbar bezeichnet.
— user239558

25

Wenn Sie nur die Standardfunktionalität von Ausblenden nur mit Sichtbarkeit benötigen: Ausgeblendet, um das aktuelle Layout beizubehalten, können Sie die Rückruffunktion von Ausblenden verwenden, um das CSS im Tag zu ändern. Dokumente in jquery ausblenden

Ein Beispiel :

$('#subs_selection_box').fadeOut('slow', function() {
      $(this).css({"visibility":"hidden"});
      $(this).css({"display":"block"});
});

Dies verwendet die normale coole Animation, um das Div auszublenden, aber nach Abschluss der Animation setzen Sie die Sichtbarkeit auf ausgeblendet und die Anzeige auf Blockieren.

Ein Beispiel : http://jsfiddle.net/bTkKG/1/

Ich weiß, dass Sie die Lösung $ ("# aa"). Css () nicht wollten, aber Sie haben nicht angegeben, ob dies daran liegt, dass Sie die Animation verlieren, wenn Sie nur die Methode css () verwenden.


2

Hier ist eine Implementierung, wie sie funktioniert $.prop(name[,value])oder $.attr(name[,value])funktioniert. Wenn die bVariable gefüllt ist, wird die Sichtbarkeit entsprechend festgelegt und thiszurückgegeben (um mit anderen Eigenschaften fortzufahren), andernfalls wird der Sichtbarkeitswert zurückgegeben.

jQuery.fn.visible = function (b) {
    if(b === undefined)
        return this.css('visibility')=="visible";
    else {
        this.css('visibility', b? 'visible' : 'hidden');
        return this;
    }
}

Beispiel:

$("#result").visible(true).on('click',someFunction);
if($("#result").visible())
    do_something;

1

Reines JS- Äquivalent für jQuery hide () / show ():

function hide(el) {
    el.style.visibility = 'hidden';    
    return el;
}

function show(el) {
    el.style.visibility = 'visible';    
    return el;
}

hide(document.querySelector(".test"));
// hide($('.test')[0])   // usage with jQuery

Wir verwenden return elaufgrund der fließenden Schnittstelle "Designmuster".

Hier ist ein Arbeitsbeispiel .


Im Folgenden biete ich auch eine sehr nicht empfohlene Alternative an, die jedoch wahrscheinlich eher "nah an der Frage" ist:

HTMLElement.prototype.hide = function() {
    this.style.visibility = 'hidden';  
    return this;
}

HTMLElement.prototype.show = function() {
    this.style.visibility = 'visible';  
    return this;
}

document.querySelector(".test1").hide();
// $('.test1')[0].hide();   // usage with jQuery

Natürlich implementiert dies nicht jQuery 'each' (angegeben in @JamesAllardice Antwort von ), da wir hier reine js verwenden.

Arbeitsbeispiel ist hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.