Эквивалент jQuery .hide () для установки видимости: скрыто


341

В jQuery есть .hide()и .show()методы, которые устанавливают display: noneнастройки CSS .

Есть ли эквивалентная функция, которая установит visibility: hiddenнастройку?

Я знаю, что могу использовать, .css()но я предпочитаю какую-то функцию, как .hide()или так. Спасибо.


2
Вы можете реализовать свои собственные на основе.toggle()
zerkms

Я также являюсь поклонником метода jQuery toggleClass () для этого :) jqueryui.com/toggleClass Не стесняйтесь проверить пример, которым я поделился в своем ответе ниже stackoverflow.com/a/14632687/1056713
Chaya Cooper

Ответы:


427

Вы можете сделать свои собственные плагины.

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

Если вы хотите перегрузить оригинальный jQuery toggle(), который я не рекомендую ...

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


@ Томас Вы должны были бы затенить, toggle()что может сломать другие сценарии. Если вы хотите, вы можете добавить дополнительный аргумент , toggle()чтобы указать , следует ли visibilityили displayдолжна быть включена. Однако я бы просто использовал пользовательский в своем последнем примере. :)
Алекс

Не могли бы вы опубликовать пример о том, как поддерживать дополнительные параметры show(скорость, замедление, обратный вызов)?
Георг

11
Это излишне, если вы посмотрите на это так, но есть цель. Если это объединено с другим сценарием с (function() { })()или подобным, ASI не сработает, потому что это похоже на вызов функции. Попробуйте это , затем удалите !.
Алекс

1
@NoBugs Автоматическая вставка точек с запятой. Я написал пост в блоге об этом здесь.
Алекс

1
Насколько я знаю, @VishalSakaria Это не совсем четко определенный термин, так что стоит использовать его здесь.
Алекс

103

Нет встроенного, но вы могли бы написать свой довольно легко:

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

Затем вы можете назвать это так:

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

Вот рабочий пример .


1
Хороший вопрос, просто сила привычки. Спасибо. +1 к ответу Алекса!
Джеймс Аллардик

Просто любопытно, какой смысл заключать эти две функции в (function($) {...}(jQuery));оболочку? Я никогда раньше не определял свои собственные функции в jQuery, я просто определял функции в прямом JavaScript.
VoidKing

2
@VoidKing - это просто «лучшая практика» для плагинов jQuery согласно документации. Это позволяет вам использовать $идентификатор внутри функции, даже если он ссылается на что-то еще в родительской области видимости.
Джеймс Аллардис

В jQuery для этого есть встроенный метод toggleClass () :) jqueryui.com/toggleClass Не стесняйтесь проверить пример, которым я поделился в своем ответе ниже stackoverflow.com/a/14632687/1056713
Чая Купер

55

Еще более простой способ сделать это - использовать метод toggleClass () в 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");
    });
});

1
Мне нравится этот подход. Он менее автономен, поскольку требует отдельной таблицы стилей, но помогает хранить всю информацию о стилях в таблицах стилей, к которой он должен принадлежать. Если вы хотите отключить видимость, вы можете изменить тег css в одном месте, вместо того, чтобы менять весь свой js-код.
вон

19
Для тех, кто использует bootstrap, этот класс называется невидимым.
user239558 23.09.14

25

Если вам нужна только стандартная функция hide только с видимостью: hidden, чтобы сохранить текущий макет, вы можете использовать функцию обратного вызова hide, чтобы изменить css в теге. Скрыть документы в JQuery

Пример :

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

При этом будет использоваться обычная классная анимация, чтобы скрыть div, но после завершения анимации вы устанавливаете видимость на скрытый и отображение для блокировки.

Пример: http://jsfiddle.net/bTkKG/1/

Я знаю, что вам не нужно решение $ ("# aa"). Css (), но вы не указали, было ли это потому, что при использовании только метода css () вы теряете анимацию.


2

Вот одна реализация, которая работает как $.prop(name[,value])или $.attr(name[,value])функция. Если bпеременная заполнена, видимость устанавливается в соответствии с этим и thisвозвращается (что позволяет продолжить с другими свойствами), в противном случае она возвращает значение видимости.

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

Пример:

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

1

Чистый эквивалент JS для 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

Мы используем, return elчтобы удовлетворить свободный интерфейс "дизайн шаблона".

Вот рабочий пример .


Ниже я также приведу крайне нежелательную альтернативу, которая, тем не менее, является, вероятно, более "близким к вопросу" ответом:

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

конечно, это не реализует jQuery 'each' (приведенный в ответе @JamesAllardice ), потому что здесь мы используем чистый js

Рабочий пример здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.