Equivalente a jQuery .hide () para definir a visibilidade: oculto

340

No jQuery, existem .hide()e .show()métodos que definem a display: noneconfiguração CSS .

Existe uma função equivalente que definiria a visibility: hiddenconfiguração?

Eu sei que posso usar, .css()mas prefiro algumas funções como .hide()essa. Obrigado.

TMS
fonte
2
Você pode implementar o seu próprio com base em.toggle()
zerkms
Também sou fã do método toggleClass () do jQuery :) jqueryui.com/toggleClass Sinta-se à vontade para conferir o exemplo que compartilhei na minha resposta abaixo stackoverflow.com/a/14632687/1056713
Chaya Cooper

Respostas:

426

Você pode fazer seus próprios plugins.

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';
    });
};

Se você deseja sobrecarregar o jQuery original toggle(), o que eu não recomendo ...

!(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 .

alex
fonte
@ Tomas Você teria que sombra toggle()que poderia quebrar outros scripts. Se desejar, você pode adicionar um argumento extra toggle()para especificar se deve visibilityou displaynão ser alternado. Eu apenas usaria o personalizado no meu último exemplo, no entanto. :) #
318 alex
Você poderia postar um exemplo de como oferecer suporte a parâmetros adicionais de show(velocidade, flexibilização, retorno de chamada)?
22412 georg
11
É supérfluo se você olhar dessa maneira, mas há um propósito. Se isso for concatenado para outro script com um (function() { })()ou similar, o ASI não será ativado porque parece uma invocação de função. Tente isso e remova o !.
alex
11
@NoBugs Inserção automática de ponto e vírgula. Eu escrevi um post sobre isso aqui.
alex
11
@VishalSakaria Não é realmente um termo bem definido, tanto quanto eu sei, por isso deve ser bom usá-lo aqui.
alex
103

Não existe um incorporado, mas você pode escrever o seu com bastante facilidade:

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

Você pode chamar assim:

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

Aqui está um exemplo de trabalho .

James Allardice
fonte
11
Bom ponto, apenas uma força do hábito. Obrigado. +1 na resposta de alex!
James Allardice
Apenas curioso, qual é o sentido de agrupar essas duas funções no (function($) {...}(jQuery));wrapper? Eu nunca defini minhas próprias funções no jQuery antes, sempre defini funções no JavaScript direto.
VoidKing
2
@VoidKing - É apenas a "melhor prática" para plug-ins jQuery, conforme os documentos. Ele permite que você use o $identificador dentro da função, mesmo que se refira a outra coisa no escopo pai.
James Allardice
jQuery realmente foi construído em um toggleClass () método para isso :) jqueryui.com/toggleClass Sinta-se livre para verificar o exemplo que eu compartilhada na minha resposta abaixo stackoverflow.com/a/14632687/1056713
Chaya Cooper
55

Uma maneira ainda mais simples de fazer isso é usar o método toggleClass () do jQuery

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");
    });
});
Chaya Cooper
fonte
11
Eu gosto dessa abordagem. É menos autônomo porque requer uma folha de estilo separada, mas ajuda a manter todas as informações de estilo nas folhas de estilo, onde é onde deve pertencer. Se você quiser desativar a visibilidade, poderá alterar uma tag css em um só lugar, em vez de alterar todo o seu código js.
Vaughan
19
Para quem usa bootstrap, essa classe é chamada invisível.
user239558
25

Se você precisar apenas da funcionalidade padrão de ocultar apenas com visibilidade: oculto para manter o layout atual, poderá usar a função de retorno de chamada ocultar para alterar o css na tag. Ocultar documentos no jquery

Um exemplo :

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

Isso usará a animação legal normal para ocultar a div, mas após o término da animação, você define a visibilidade como oculta e exibe para bloquear.

Um exemplo: http://jsfiddle.net/bTkKG/1/

Sei que você não queria a solução $ ("# aa"). Css (), mas não especificou se era porque, usando apenas o método css (), você perde a animação.

h3ct0r
fonte
2

Aqui está uma implementação, o que funciona como $.prop(name[,value])ou $.attr(name[,value])função. Se a bvariável for preenchida, a visibilidade será definida de acordo com isso e thisretornada (permitindo continuar com outras propriedades); caso contrário, ela retornará o valor da visibilidade.

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

Exemplo:

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

Equivale a JS puro para 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

Usamos return eldevido a satisfazer a interface fluente "padrão desing".

Aqui está um exemplo de trabalho .


Abaixo, também forneço uma alternativa altamente não recomendada , que é provavelmente a resposta mais "próxima da pergunta":

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

é claro que isso não implementa o jQuery 'each' (fornecido na resposta @JamesAllardice ) porque usamos js puros aqui.

Exemplo de trabalho está aqui .

Kamil Kiełczewski
fonte