Как проверить, скрыт ли элемент в jQuery?

Можно ли переключить видимость элемента с помощью функций .hide(), .show() или .toggle()?

Как бы вы проверили, является ли элемент visible или hidden?


person Philip Morton    schedule 07.10.2008    source источник
comment
Стоит упомянуть (даже спустя столько времени), что $(element).is(":visible") работает для jQuery 1.4.4, но не для jQuery 1.3.2, в InternetExplorer8. Это можно проверить с помощью полезного фрагмента теста Цветомира Цонева. . Просто не забудьте изменить версию jQuery, чтобы тестировать под каждой.   -  person Reuben    schedule 01.02.2011
comment
Это связано, хотя и с другим вопросом: stackoverflow.com/questions/17425543/   -  person Mark Schultheiss    schedule 22.03.2016
comment
Если вас не интересует скрытие виртуального элемента css, а физическая видимость в области просмотра для пользователя, предложите увидеть stackoverflow.com/questions/487073/ и stackoverflow .com / questions / 123999 /.   -  person user1742529    schedule 02.01.2021


Ответы (55)


Поскольку вопрос относится к одному элементу, этот код может быть более подходящим:

// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");

// The same works with hidden
$(element).is(":hidden");

Это то же самое, что и предложение twernt, но применяется к отдельному элементу; и он соответствует рекомендованному алгоритму в FAQ по jQuery.

Мы используем is () jQuery для проверки выбранного элемента с другим элементом, селектором или любым объектом jQuery. Этот метод просматривает элементы DOM, чтобы найти совпадение, которое удовлетворяет переданному параметру. Он вернет истину, если есть совпадение, в противном случае вернет ложь.

person Tsvetomir Tsonev    schedule 07.10.2008
comment
Это решение, казалось бы, поощряет путаницу visible=false и display:none; в то время как решение Mote явно иллюстрирует намерение программистов проверить display:none; (через упоминание скрыть и показать, какой элемент управления display:none, а не visible=true) - person kralco626; 29.12.2010
comment
Это правильно, но :visible также проверит, видны ли родительские элементы, как указал чиборг. - person Tsvetomir Tsonev; 06.01.2011
comment
Цветомир, для IE7 это не работает - даже когда элементы скрыты, он думает, что visible = true. Пожалуйста, исправьте свой ответ, чтобы не вводить людей в заблуждение. visible и display - это разные свойства, и их следует рассматривать как таковые. Ответ Моте правильный. - person sarsnake; 11.01.2011
comment
Вы правы - я поясню, что код проверяет только свойство display. Учитывая, что исходный вопрос касается show() и hide(), и они задают display, мой ответ правильный. Кстати, он работает с IE7, вот тестовый фрагмент - jsfiddle.net/MWZss; - person Tsvetomir Tsonev; 14.01.2011
comment
Я действительно обнаружил, что слова обратной логики лучше:! $ ('Selector'). Is (': hidden'); по какой-то причине. Стоит попробовать. - person Kzqai; 05.01.2012
comment
Вот простой тест производительности () для регулярного выражения: jsperf.com/jquery -is-vs-regexp-for-css-visibility. Заключение: если вы стремитесь к производительности, используйте регулярное выражение поверх is () (поскольку is () сначала ищет все скрытые узлы, прежде чем смотреть на фактический элемент). - person Max Leske; 22.06.2012
comment
Чалвак, вы можете почувствовать, что что-то идет правильно, но попытайтесь объяснить, почему. Двойное отрицание сбивает с толку, в отличие от простого оператора, поэтому $ ('selector'). Is (': shown'); намного понятнее, чем! $ ('selector'). is (': hidden'); - person Yasen; 10.09.2012
comment
@TsvetomirTsonev, чтобы проверить видимость родителя, вы можете использовать $ (element) .parent (). Is (: visible); Я знаю, что это немного устарело, но будет полезно для нового поиска - person Robin Michael Poothurai; 23.10.2012
comment
Что возвращает $(element).is(":visible"), если элемент виден не с точки зрения having display:none или visibility:hidden, а пользователь прокручивает страницу вниз, поэтому на самом деле он его не видит? Есть простой способ это проверить? - person Martin Thoma; 03.01.2013
comment
Для других пользователей, которым интересно, действительно ли это работает в IE7, это может сэкономить вам время - это работает, jquery 1.9.1: imgur .com / uKD4t8h - person Chris Moschini; 28.03.2013
comment
@MaxLeske - Я почти уверен, что ДАННЫЙ! (в большинстве случаев), что когда вы вытаскиваете нож для регулярного выражения, вы получаете перфоманс. ударять. Дополнительные проверки будут нулевыми по сравнению с накладными расходами / обработкой регулярного выражения. - person Bill Ortell; 17.04.2013
comment
Как сделать наоборот? - person Robert Johnstone; 30.08.2013
comment
Я нашел это информативным при поиске информации о :visible и :hidden. По сути, он смотрит на offsetHeight и offsetWidth, что позволяет ему обеспечить наилучшее покрытие (например, у вас может быть класс, который имеет display:none; в качестве свойства, и он правильно сообщит, виден ли он) - person Turnerj; 17.10.2013
comment
Итак, должны ли мы использовать .is(":invisible") для false? Или !$(element).is(":visible"), или что? - person Wolfpack'08; 04.12.2013
comment
@ Wolfpack'08: Я тоже ищу похожее решение. До сих пор я использовал $(element).css('display')=='none' для обнаружения скрытых элементов. - person Ameen; 05.12.2013
comment
@Kzqai Кроме того, я считаю, что это работает: $(selector).is('not(:hidden)') - person Izkata; 04.02.2014
comment
Это не работает в последней версии jquery. Он устарел. Какая лучшая работа? (Почему они удалили это ...?) - person carl; 11.02.2014
comment
@carl Я ничего не вижу в документации jQuery о том, что это устарело. Я также протестировал его с помощью последней версии jQuery, и он все еще работает. Здесь: jsfiddle.net/F6atJ - person BruceHill; 24.06.2014
comment
Не работает для элемента, у которого есть родительский overflow: hidden; - person Yana Agun Siswanto; 04.02.2015
comment
Не работает на chrome, хотя работает безупречно в firefox :( Пришлось сделать что-то вроде jQuery(textarea).parent().css('display') != 'none' вместо jQuery(textarea).parent().is(":visible") - person Aniket Thakur; 11.09.2015
comment
Изменения в версиях 1.12+, 2.2.0+ и 3.0+ изменяют счетчики, если выбрано несколько элементов (см. Примечание внизу этого stackoverflow.com / a / 17426800/125981) - person Mark Schultheiss; 25.04.2017
comment
Не работает с jQuery UI Selectmenu, в нем говорится, что моя опция скрыта, хотя она видна. - person Black; 20.05.2019
comment
Возможно, это поможет кому-то: если вы используете анимацию, например toggle("slow"), вам нужно использовать опцию обратного вызова и проверить видимость там. - person Broots Waymb; 02.03.2020

Вы можете использовать селектор hidden:

// Matches all elements that are hidden
$('element:hidden')

И селектор visible:

// Matches all elements that are visible
$('element:visible')
person twernt    schedule 07.10.2008
comment
будьте осторожны, в этой презентации есть несколько полезных советов, связанных с производительностью: addyosmani.com/jqprovenperformance - person codecraig; 11.07.2011
comment
На страницах с 21 по 28 показано, насколько медленный: hidden или: visible по сравнению с другими селекторами. Спасибо, что указали на это. - person Etienne Dupuis; 05.07.2012
comment
Когда вы имеете дело с парой элементов, а происходит очень мало - то есть АБСОЛЮТНО БОЛЬШОЕ БОЛЬШИНСТВО СЛУЧАЕВ - проблема времени до смехотворно незначительна. О нет! Прошло 42 мс вместо 19 мс !!! - person vbullinger; 20.02.2013
comment
Я переключаю элемент вручную, используя этот селектор. $ ('element: hidden') для меня всегда верно! - person ZoomIn; 09.08.2013
comment
: hidden предназначен для элементов формы, а не для отображения: none. Это не тот ответ, которого люди, скорее всего, ожидают. - person cwingrav; 18.11.2015
comment
@cwingrav Возможно, вы захотите перечитать документацию,: hidden применяется ко всем элементам. Элементы формы с type="hidden" - это только один случай, который может сработать: скрытый. Элементы без высоты и ширины, элементы с display: none и элементы со скрытыми предками также квалифицируются как: скрытые. - person Joshua Walsh; 15.01.2016
comment
Встроенное представление на связанной странице больше не работает, перейдите на slideshare.net/ AddyOsmani / jquery-Verified-performance-tips-tricks вместо этого. - person chiborg; 23.02.2016
comment
@vbullinger 42 мс на самом деле немного дольше, чем я бы хотел дождаться, пока веб-сайт отреагирует на мои действия - это означает, что около 3 кадров анимации отбрасываются / задерживаются только при 60 кадрах в секунду. - person Sebi; 30.07.2016
comment
@vbullinger - любая обработка, которая занимает более 16 мс, начинает снижать FPS. Так что да, если это занимает 42 мс, это может быть плохой сделкой, если вы заинтересованы в производительности. - person Alejandro García Iglesias; 02.08.2017
comment
Из jQuery docs: использование :hidden в значительной степени может повлиять на производительность, поскольку может вызвать браузер, чтобы повторно отобразить страницу, прежде чем она сможет определить видимость. Отслеживание видимости элементов с помощью других методов, например с использованием класса, может обеспечить лучшую производительность. - person CPHPython; 17.05.2018
comment
Ссылка выше на веб-сайт AddyOsmani действительна, но Slideshare больше не позволяет встраивать flash. Вы можете просмотреть слайды здесь slideshare.net/AddyOsmani/ - person Craig London; 14.11.2018

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 не будет работать.

person Mote    schedule 07.10.2008
comment
Это проверяет только свойство отображения одного элемента. Атрибут: visible проверяет также видимость родительских элементов. - person chiborg; 03.03.2010
comment
Это единственное решение, которое у меня сработало при тестировании с IE 8. - person evanmcd; 13.01.2012
comment
@chiborg Да, но иногда это то, что вам нужно, и мне пришлось на собственном горьком опыте узнать, насколько умным был jQuery ... - person Casey; 14.03.2014
comment
Это действительно отвечает на вопрос, поскольку вопрос касается одного элемента и использования функций hide(), show() и toggle(), однако, как уже было сказано большинством, мы должны использовать псевдоклассы :visible и :hidden. - person Jimmy Knoot; 14.04.2015
comment
Этот ответ можно использовать, когда элемент существует, но в данный момент отсутствует на странице, например, после detach (). - person atheaos; 25.04.2017

Ни один из этих ответов не касается того, что я понимаю как вопрос, который я искал: «Как мне обрабатывать элементы, содержащие visibility: hidden. Ни :visible, ни :hidden не справятся с этим, поскольку они оба ищут отображение в соответствии с документацией. Насколько я мог определить, нет селектора для обработки видимости CSS. Вот как я решил это (стандартные селекторы jQuery, может быть более сжатый синтаксис):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});
person aaronLile    schedule 24.03.2011
comment
С этим ответом хорошо справиться visibility буквально, но вопрос был How you would test if an element has been hidden or shown using jQuery?. Использование jQuery означает: свойство display. - person MarioDS; 12.05.2013
comment
Элементы с visibility: hidden или opacity: 0 считаются видимыми, поскольку они по-прежнему занимают место в макете. См. ответ Педро Рейнхо и документация jQuery о :visible селекторе. - person awe; 16.10.2013
comment
вам нужно пройти вверх по DOM, чтобы проверить родителей узла, иначе это бесполезно. - person vsync; 22.04.2014

Из Как определить состояние переключенного элемента?


Вы можете определить, свернут ли элемент или нет, используя селекторы :visible и :hidden.

var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');

Если вы просто воздействуете на элемент в зависимости от его видимости, вы можете просто включить :visible или :hidden в выражение селектора. Например:

 $('#myDiv:visible').animate({left: '+=200px'}, 'slow');
person user574889    schedule 13.01.2011
comment
интересно, почему ни в одном ответе не упоминается случай, когда элемент перемещается из видимого окна, например _1 _... Думаю, это крайний случай - person jazzcat; 08.05.2017

Часто, проверяя, видно ли что-то или нет, вы сразу же идете дальше и делаете с этим что-то еще. Цепочка 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" });
person Simon_Weaver    schedule 25.07.2009
comment
Нет причин извлекать узел DOM из фрагмента, использованного в примере, а затем снова искать его. Лучше просто сделать: var $ button = $ ('# btnUpdate'); А затем в выражениях If просто используйте $ button вместо $ (button). Имеет преимущество кеширования объекта jQuery. - person LocalPCGuy; 22.04.2012
comment
вот простой пример jquerypot.com/ - person Ketan Savaliya; 29.04.2018

Селектор :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, не могут воспользоваться преимуществами повышения производительности, обеспечиваемого собственным методом DOM querySelectorAll(). Чтобы добиться максимальной производительности при использовании :visible для выбора элементов, сначала выберите элементы с помощью селектора на чистом CSS, а затем используйте .filter(":visible").

Кроме того, если вас беспокоит производительность, проверьте Теперь вы видите меня… показать / скрыть выступление (04.05.2010). И используйте другие методы для отображения и скрытия элементов.

person Pedro Rainho    schedule 25.11.2011

Как работает видимость элементов и 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();
    });
    
person webvitaly    schedule 24.04.2012
comment
Еще одно различие между visibility:hidden и opacity:0 заключается в том, что элемент по-прежнему будет реагировать на события (например, щелчки) с помощью opacity:0. Я научился этому трюку, создавая настраиваемую кнопку для загрузки файлов. - person urraka; 29.06.2012
comment
также, если вы скрываете ввод с непрозрачностью: 0, он все равно выбирается с помощью клавиши табуляции - person YangombiUmpakati; 12.12.2017

Это работает для меня, и я использую show() и hide(), чтобы сделать мой div скрытым / видимым:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}
person Abiy    schedule 06.07.2011

Вы также можете сделать это с помощью обычного 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;
}

Примечания:

  1. Работает везде

  2. Работает для вложенных элементов

  3. Работает с CSS и встроенными стилями

  4. Не требует каркаса

person Matt Brock    schedule 16.07.2012
comment
Работает немного иначе, чем jQuery; он считает visibility: hidden видимым. - person alex; 20.09.2012
comment
Достаточно легко изменить приведенный выше код, чтобы имитировать (возможно, глупое) поведение jQuery. . . . . function isRendered (o) {if ((o.nodeType! = 1) || (o == document.body)) {return true;} if (o.currentStyle && o.currentStyle [display]! = none) {return isRendered ( o.parentNode);} else if (window.getComputedStyle) {if (document.defaultView.getComputedStyle (o, null) .getPropertyValue (display)! = none) {return isRendered (o.parentNode);}} return false;} - person Matt Brock; 26.09.2012
comment
Конечно, я просто добавил это для пользы пользователей, которые использовали это без сканирования кода. :) - person alex; 27.09.2012

Я бы использовал класс CSS .hide { display: none!important; }.

Чтобы скрыть / показать, я вызываю .addClass("hide")/.removeClass("hide"). Для проверки видимости использую .hasClass("hide").

Это простой и понятный способ проверять / скрывать / отображать элементы, если вы не планируете использовать методы .toggle() или .animate().

person Evgeny Levin    schedule 03.02.2012
comment
.hasClass('hide') не проверяет, скрыт ли предок родителя (что также сделало бы его скрытым). Вы могли бы заставить это работать правильно, проверив .closest('.hide').length > 0, но зачем изобретать велосипед? - person nbrooks; 26.09.2012
comment
Предлагаемый вами вариант возвращается, если элемент отображается в html, мой вариант возвращается, если элемент был напрямую скрыт вашим механизмом кода / просмотра javascript. Если вы знаете, что родительские элементы никогда не должны быть скрыты - используйте .hasClass (), чтобы быть более строгим и предотвратить будущие ошибки. Если вы хотите проверить не только видимость, но и установленное состояние элемента - также используйте .hasClass (). В других случаях .closest () лучше. - person Evgeny Levin; 02.12.2012
comment
Почему бы вам просто не использовать .is (: visible)? - person dont_trust_me; 16.10.2018

Ссылка на демонстрацию

$('#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"/>

Источник (из моего блога):

Blogger Plug n Play - jQuery Инструменты и виджеты: как узнать, является ли элемент скрытым или видимым с помощью jQuery

person Code Spy    schedule 25.01.2013
comment
@Adrew, но эта ссылка показывает рабочий пример этой функции. Думаю, практический ответ может занять целую страницу текста :) - person Code Spy; 25.01.2013

Можно просто использовать атрибут hidden или visible, например:

$('element:hidden')
$('element:visible')

Или вы можете упростить то же самое с помощью is следующим образом.

$(element).is(":visible")
person ScoRpion    schedule 23.05.2012

ebdiv должен быть установлен в style="display:none;". Он работает как для отображения, так и для скрытия:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});
person Vaishu    schedule 13.06.2012

Другой ответ, который вам следует принять во внимание: если вы скрываете элемент, вы должны использовать jQuery, но вместо того, чтобы фактически скрывать его, вы удаляете весь элемент, но копируете его HTML содержимое и тег в переменную jQuery, а затем все, что вам нужно сделать, это проверить, есть ли такой тег на экране, используя обычный if (!$('#thetagname').length).

person Lucas    schedule 21.04.2012

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

Во-первых, это кажется несколько нелогичным, хотя более внимательное рассмотрение документации jQuery дает соответствующую информацию:

Элементы можно считать скрытыми по нескольким причинам: [...] Их ширина и высота явно равны 0. [...]

Так что это действительно имеет смысл применительно к блочной модели и вычисленному стилю для элемента. Даже если ширина и высота не установлены явно равными 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 описанное поведение изменится! Элементы будут считаться видимыми, если у них есть поля макета, в том числе с нулевой шириной и / или высотой.

JSFiddle с jQuery 3.0.0-alpha1:

http://jsfiddle.net/pM2q3/7/

Затем тот же код JavaScript будет иметь следующий вывод:

console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false
person conceptdeluxe    schedule 06.05.2014

Это может сработать:

expect($("#message_div").css("display")).toBe("none");
person Maneesh Kumar    schedule 20.07.2012
comment
Что это за язык / диалект / библиотека? Я не знаком с этим синтаксисом в JS ... - person nbrooks; 26.09.2012

Пример:

$(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>

person Irfan DANISH    schedule 28.10.2013

Чтобы проверить, не видно ли, я использую !:

if ( !$('#book').is(':visible')) {
    alert('#book is not visible')
}

Или следующее - это также sam, сохраняющий селектор jQuery в переменной, чтобы повысить производительность, когда он вам нужен несколько раз:

var $book = $('#book')

if(!$book.is(':visible')) {
    alert('#book is not visible')
}
person Matthias Wegtun    schedule 04.06.2013
comment
Как вы определили, что сохранение селектора в переменной действительно быстрее? - person Ilia; 21.06.2013
comment
Привет, @Ilia Rostovtsev. jsperf.com/caching-jquery-selectors Здесь вы можете запустить тест. В любом случае приятно иметь его в кэше, чтобы к нему можно было получить доступ быстрее - person Matthias Wegtun; 21.06.2013
comment
Это подходит, если вы хотите использовать одну переменную во всем процессе вместо вызова и вызова одного и того же объекта. - person Kenneth Palaganas; 25.08.2013

Используйте переключение классов, а не редактирование стиля. . .

Использовать классы, предназначенные для скрытия элементов, легко и это один из самых эффективных методов. Переключение класса, «скрытого», со стилем Display, равным «none», будет работать быстрее, чем редактирование этого стиля напрямую. Я довольно подробно объяснил это в вопросе о переполнении стека Отображение / скрытие двух элементов в одном блоке.


Лучшие практики и оптимизация JavaScript

Вот действительно поучительный видеоролик Google Tech Talk, сделанный фронтенд-инженером Google Николасом Закасом:

person Lopsided    schedule 18.07.2013

Пример использования видимой проверки для активированного блокировщика рекламы:

$(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 - это идентификатор, который блокирует блокировщик рекламы. Поэтому, проверяя его, если он виден, вы можете определить, включен ли блокировщик рекламы.

person Roman Losev    schedule 27.04.2015

В конце концов, ни один из примеров мне не подходит, поэтому я написал свой.

Тесты (без поддержки Internet Explorer filter:alpha):

а) Проверьте, не скрыт ли документ

б) Проверьте, имеет ли элемент нулевую ширину / высоту / непрозрачность или display:none / visibility:hidden во встроенных стилях

c) Проверьте, не скрыт ли центр (также потому, что это быстрее, чем проверка каждого пикселя / угла) элемента другим элементом (и всеми предками, например: overflow:hidden / scroll / один элемент над другим) или краями экрана.

г) Проверьте, имеет ли элемент нулевую ширину / высоту / непрозрачность или 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 на виртуальной машине) и 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
person Aleko    schedule 09.04.2014

Вам нужно проверить как ... Отображение, так и видимость:

if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
    // The element is not visible
} else {
    // The element is visible
}

Если мы проверим $(this).is(":visible"), jQuery автоматически проверит и то, и другое.

person Premshankar Tiwari    schedule 31.01.2014

Может ты сможешь сделать что-то вроде этого

$(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>

person Mathias Stavrou    schedule 07.04.2015

Просто проверьте видимость, проверив логическое значение, например:

if (this.hidden === false) {
    // Your code
}

Я использовал этот код для каждой функции. В противном случае вы можете использовать is(':visible') для проверки видимости элемента.

person pixellabme    schedule 11.08.2014

Поскольку Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout (как описано для jQuery: visible Selector) - мы можем проверить, действительно ли видны таким образом:

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;
    }
});
person Andron    schedule 19.03.2014

Но что, если CSS этого элемента выглядит следующим образом?

.element{
    position: absolute;left:-9999;    
}

Поэтому следует также рассмотреть этот ответ на вопрос о переполнении стека Как проверить, находится ли элемент за пределами экрана. .

person RN Kushwaha    schedule 23.08.2014

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

function checkUIElementVisible(element) {
    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}

Рабочий скрипт

person V31    schedule 29.08.2014

Также вот тернарное условное выражение для проверки состояния элемента, а затем для его переключения:

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });
person cssimsek    schedule 05.11.2013
comment
Или, знаете, просто избавьтесь от условного обозначения и скажите _1 _... :) - person nbrooks; 25.12.2013

Я искал это, и ни один из ответов не подходит для моего случая, поэтому я создал функцию, которая вернет false, если глаза не могут увидеть элемент.

jQuery.fn.extend({
  isvisible: function() {
    //
    //  This function call this: $("div").isvisible()
    //  Return true if the element is visible
    //  Return false if the element is not visible for our eyes
    //
    if ( $(this).css('display') == 'none' ){
        console.log("this = " + "display:none");
        return false;
    }
    else if( $(this).css('visibility') == 'hidden' ){
        console.log("this = " + "visibility:hidden");   
        return false;
    }
    else if( $(this).css('opacity') == '0' ){
        console.log("this = " + "opacity:0");
        return false;
    }   
    else{
        console.log("this = " + "Is Visible");
        return true;
    }
  }  
});
person lmcDevloper    schedule 01.06.2016
comment
Обратите внимание: если селектор возвращает пустой набор элементов, этот метод вернет истину, поэтому сначала проверьте длину, если вы ищете невидимые элементы: var items = jQuery('.selector'); if (items.length == 0 || !items.isVisible()) { alert('item is not visible'); } - person Ninjanoel; 07.12.2016
comment
А как насчет элементов, которые скрыты под другими элементами? - person Questionnaire; 24.02.2020

Как hide(), show() и toggle() присоединяет встроенный CSS (display: none или display: block) к элементу. Точно так же мы можем легко использовать тернарный оператор, чтобы проверить, является ли элемент скрытым или видимым, проверив отображение CSS.

ОБНОВЛЕНИЕ:

  • Вам также необходимо проверить, установлен ли элемент CSS на видимость: видимый или видимость: скрытый.
  • Элемент также будет виден, если для свойства отображения задано значение inline-block, block, flex.

Таким образом, мы можем проверить свойство элемента, которое делает его невидимым. Итак, они display: none и visibility: "hidden";

Мы можем создать объект для проверки свойства, отвечающего за скрытие элемента:

var hiddenCssProps = {
display: "none",
visibility: "hidden"
}

Мы можем проверить, просматривая каждое значение ключа в сопоставлении объектов, совпадает ли свойство элемента для ключа со значением скрытого свойства.

var isHidden = false;
for(key in hiddenCssProps) {
  if($('#element').css(key) == hiddenCssProps[key]) {
     isHidden = true;
   }
}

Если вы хотите проверить свойство, такое как высота элемента: 0 или ширина: 0 или более, вы можете расширить этот объект и добавить к нему дополнительные свойства и проверить.

person No one    schedule 05.11.2016

Есть несколько способов проверить, виден или скрыт элемент в jQuery.

Демонстрационный HTML-код для примера

<div id="content">Content</div>
<div id="content2" style="display:none">Content2</div>

Используйте переключатель фильтра видимости $('element:hidden') или $('element:visible')

  • $('element:hidden'): выбирает все скрытые элементы.

    Example:
       $('#content2:hidden').show();
    
  • $('element:visible'): выбирает все видимые элементы.

    Example:
       $('#content:visible').css('color', '#EEE');
    

Подробнее см. http://api.jquery.com/category/selectors/visibility-filter-selectors/

Использовать is() фильтрацию

    Example:
       $('#content').is(":visible").css('color', '#EEE');

    Or checking condition
    if ($('#content').is(":visible")) {
         // Perform action
    }

Подробнее читайте на http://api.jquery.com/is/.

person Arun Karnawat    schedule 13.12.2016

Просто проверьте, видим ли этот элемент, и он вернет логическое. jQuery скрывает элементы, добавляя к элементу display none, поэтому, если вы хотите использовать чистый JavaScript, вы все равно можете это сделать, например:

if (document.getElementById("element").style.display === 'block') {
  // Your element is visible; do whatever you'd like
}

Кроме того, вы можете использовать jQuery, поскольку кажется, что остальная часть вашего кода использует его, и у вас есть меньший блок кода. Что-то вроде приведенного ниже в jQuery делает для вас тот же трюк:

if ($(element).is(":visible")) {
    // Your element is visible, do whatever you'd like
};

Также использование метода css в jQuery может привести к тому же результату:

if ($(element).css('display') === 'block') {
    // Your element is visible, do whatever you'd like
}

Также в случае проверки видимости и отображения вы можете сделать следующее:

if ($(this).css("display") === "block" || $(this).css("visibility") === "visible") {
   // Your element is visible, do whatever you'd like
}
person Alireza    schedule 06.05.2017

Вы можете использовать это:

$(element).is(':visible');

Пример кода

$(document).ready(function()
{
    $("#toggle").click(function()
    {
        $("#content").toggle();
    });

    $("#visiblity").click(function()
    {
       if( $('#content').is(':visible') )
       {
          alert("visible"); // Put your code for visibility
       }
       else
       {
          alert("hidden");
       }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>

<p id="content">This is a Content</p>

<button id="toggle">Toggle Content Visibility</button>
<button id="visibility">Check Visibility</button>

person Abrar Jahin    schedule 02.05.2016

Вот как jQuery внутренне решает эту проблему:

jQuery.expr.pseudos.visible = function( elem ) {
    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};

Если вы не используете jQuery, вы можете просто использовать этот код и превратить его в свою собственную функцию:

function isVisible(elem) {
    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};

Какой isVisible вернет true, пока элемент виден.

person Oriol    schedule 12.04.2016

Я просто хочу уточнить, что в jQuery

Элементы можно считать скрытыми по нескольким причинам:

  • У них нет отображаемого значения CSS.
  • Это элементы формы с type = "hidden".
  • Их ширина и высота явно равны 0.
  • Элемент-предок скрыт, поэтому элемент не отображается на странице.

Элементы с видимостью: скрытый или непрозрачность: 0 считаются видимыми, поскольку они по-прежнему занимают место в макете. Во время анимации, скрывающей элемент, элемент считается видимым до конца анимации.

Источник: : скрытый селектор | Документация по jQuery API

if($('.element').is(':hidden')) {
  // Do something
}
person Sky Yip    schedule 06.12.2016

Это какой-то вариант, чтобы проверить, виден ли тег или нет

 // using a pure CSS selector  
   if ($('p:visible')) {  
      alert('Paragraphs are visible (checked using a CSS selector) !');  
   };  
  
   // using jQuery's is() method  
   if ($('p').is(':visible')) {  
      alert('Paragraphs are visible (checked using is() method)!');  
   };  
  
   // using jQuery's filter() method  
   if ($('p').filter(':visible')) {  
      alert('Paragraphs are visible (checked using filter() method)!');  
   };  
  
   // you can use :hidden instead of :visible to reverse the logic and check if an element is hidden  
   // if ($('p:hidden')) {  
   //    do something  
   // };  

person Sangeet Shah    schedule 24.08.2015

Вы можете просто добавить класс, когда он будет виден. Добавьте класс show. Затем проверьте, есть ли у него класс:

$('#elementId').hasClass('show');

Он возвращает истину, если у вас есть класс show.

Добавьте CSS следующим образом:

.show{ display: block; }
person Disapamok    schedule 04.04.2016

1 • решение jQuery

Методы определения видимости элемента в jQuery

<script>
if ($("#myelement").is(":visible")){alert ("#myelement is visible");}
if ($("#myelement").is(":hidden")){alert ("#myelement is hidden"); }
</script>

Цикл для всех visible дочерних элементов div элемента id 'myelement':

$("#myelement div:visible").each( function() {
 //Do something
});

Заглянул в источник jQuery

Вот как jQuery реализует эту функцию:

jQuery.expr.filters.visible = function( elem ) {
    return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};

2 • Как проверить, находится ли элемент за пределами экрана - CSS

Используя Element.getBoundingClientRect (), вы можете легко определить, находится ли ваш элемент в границах вашего окна просмотра (т.е. на экране или вне экрана):

jQuery.expr.filters.offscreen = function(el) {
  var rect = el.getBoundingClientRect();
  return (
           (rect.x + rect.width) < 0 
             || (rect.y + rect.height) < 0
             || (rect.x > window.innerWidth || rect.y > window.innerHeight)
         );
};

Затем вы можете использовать это несколькими способами:

// Returns all elements that are offscreen
$(':offscreen');

// Boolean returned if element is offscreen
$('div').is(':offscreen');

Если вы используете Angular, проверьте: Не использовать скрытые атрибут с Angular

person L Y E S - C H I O U K H    schedule 10.10.2018

Существует слишком много методов проверки скрытых элементов. Это лучший выбор (я только что порекомендовал вам):

Используя jQuery, создайте элемент «display: none» в CSS для скрытого.

Дело в том:

$('element:visible')

И пример использования:

$('element:visible').show();
person Abdul Aziz Al Basyir    schedule 20.03.2017

Просто проверьте атрибут display (или visibility в зависимости от того, какой вид невидимости вы предпочитаете). Пример:

if ($('#invisible').css('display') == 'none') {
    // This means the HTML element with ID 'invisible' has its 'display' attribute set to 'none'
}
person Antoine Auffray    schedule 08.08.2017

Вы можете использовать

$( "div:visible" ).click(function() {
  $( this ).css( "background", "yellow" );
});
$( "button" ).click(function() {
  $( "div:hidden" ).show( "fast" );
});

Документация по API: visible Selector

person Wolfack    schedule 01.12.2016

Если вы хотите проверить, отображается ли элемент на странице, в зависимости от видимости его родителя, вы можете проверить, равны ли width и height элемента 0.

jQuery

$element.width() === 0 && $element.height() === 0

Ваниль

element.clientWidth === 0 && element.clientHeight === 0

Or

element.offsetWidth === 0 && element.offsetHeight === 0

person Profesor08    schedule 15.08.2018

Решение jQuery, но оно все же немного лучше для тех, кто хочет изменить текст кнопки:

$(function(){
  $("#showHide").click(function(){
    var btn = $(this);
    $("#content").toggle(function () {
      btn.text($(this).css("display") === 'none' ? "Show" : "Hide");
    });
   });
 });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="showHide">Hide</button>
<div id="content">
  <h2>Some content</h2>
  <p>
  What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
  </p>
</div>

person Muhammad    schedule 12.09.2018

Используя скрытый выбор, вы можете сопоставить все скрытые элементы

$('element:hidden')

Используя видимый выбор, вы можете сопоставить все видимые элементы

$('element:visible')
person Hasee Amarathunga    schedule 23.09.2020

Честно говоря, этот вопрос предшествует этому ответу.

Я добавляю это не для того, чтобы критиковать ОП, а чтобы помочь тем, кто все еще задает этот вопрос.

Правильный способ определить, является ли что-то видимым, - это обратиться к вашей модели представления;

Если вы не знаете, что это значит, вы собираетесь отправиться в путешествие открытий, которое значительно упростит вашу работу.

Вот обзор модель-представление-представление-модель. архитектура (MVVM).

KnockoutJS - это связывающая библиотека, которая позволит вам опробовать этот материал, не изучая всю структуру.

А вот код JavaScript и DIV, которые могут быть, а могут и не быть видимыми.

<html>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
<script>
    var vm = {
        IsDivVisible: ko.observable(true);
    }
    vm.toggle = function(data, event) {
      // Get current visibility state for the div
      var x = IsDivVisible();
      // Set it to the opposite
      IsDivVisible(!x);
    }
    ko.applyBinding(vm);
</script>
<div data-bind="visible: IsDivVisible">Peekaboo!</div>
<button data-bind="click: toggle">Toggle the div's visibility</button>
</body>
</html>

Обратите внимание, что функция переключения не обращается к DOM, чтобы определить видимость div; он обращается к модели представления.

person Peter Wone    schedule 25.03.2017

Расширенная функция проверки видимости элемента, отсутствия отображения или даже уровня непрозрачности

Он возвращает false, если элемент не виден.

function checkVisible(e) {
    if (!(e instanceof Element)) throw Error('not an Element');
    const elementStyle = getComputedStyle(e);
    if (elementStyle.display === 'none' || elementStyle.visibility !== 'visible' || elementStyle.opacity < 0.1) return false;
    if (e.offsetWidth + e.offsetHeight + e.getBoundingClientRect().height +
        e.getBoundingClientRect().width === 0) {
        return false;
    }
    const elemCenter   = {
        x: e.getBoundingClientRect().left + e.offsetWidth / 2,
        y: e.getBoundingClientRect().top + e.offsetHeight / 2
    };
    if (elemCenter.x < 0 || elemCenter.y < 0) return false;
    if (elemCenter.x > (document.documentElement.clientWidth || window.innerWidth)) return false;
    if (elemCenter.y > (document.documentElement.clientHeight || window.innerHeight)) return false;
    let pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);
    do {
        if (pointContainer === e) return true;
    } while (pointContainer = pointContainer.parentNode);
    return false;
}
person Brane    schedule 15.02.2020

Вы можете использовать класс CSS, когда он виден или скрыт, переключая класс:

.show{ display :block; }

Установите свой jQuery toggleClass(), addClass() или removeClass();.

В качестве примера,

jQuery('#myID').toggleClass('show')

Приведенный выше код добавит show класс css, если элемент не имеет show, и удалит, если он имеет класс show.

И когда вы проверяете, виден он или нет, вы можете следовать этому коду jQuery,

jQuery('#myID').hasClass('show');

Приведенный выше код вернет логическое значение (true), если элемент #myID имеет наш класс (show) и false, если у него нет класса (show).

person Disapamok    schedule 26.09.2017

Вы можете использовать функцию jQuery is(), чтобы проверить видимый или скрытый выбранный элемент. Этот метод просматривает элементы DOM, чтобы найти совпадение, которое удовлетворяет переданному параметру. Он вернет истину, если есть совпадение, в противном случае вернет ложь.

<script>
    ($("#myelement").is(":visible"))? alert("#myelement is visible") : alert("#myelement is hidden");
</script>
person Aravinda Meewalaarachchi    schedule 18.07.2019

Пытаться

content.style.display != 'none'

function toggle() {
  $(content).toggle();
  let visible= content.style.display != 'none'
  console.log('visible:', visible);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button onclick="toggle()">Show/hide</button>
<div id="content">ABC</div>

person Kamil Kiełczewski    schedule 12.06.2019

Ты можешь сделать это:

isHidden = function(element){
    return (element.style.display === "none");
};

if(isHidden($("element")) == true){
    // Something
}
person Community    schedule 22.12.2017

Вместо того, чтобы писать event для каждого element, сделайте следующее:

$('div').each(function(){
  if($(this).css('display') === 'none'){
    $(this).css({'display':'block'});
  }
});

Также вы можете использовать его на входах:

$('input').each(function(){
  if($(this).attr('type') === 'hidden'){
    $(this).attr('type', 'text');
  }
});
person Community    schedule 29.07.2018

Приведенный ниже код проверяет, скрыт ли элемент в jQuery или видимый

// You can also do this...

        $("button").click(function(){
            // show hide paragraph on button click
            $("p").toggle("slow", function(){
                // check paragraph once toggle effect is completed
                if($("p").is(":visible")){
                    alert("The paragraph  is visible.");
                } else{
                    alert("The paragraph  is hidden.");
                }
            });
        });
person Ankush Kumar    schedule 10.12.2019

Вы также можете:

   hideShow(){
  $("#accordionZiarat").hide();
  // Checks CSS content for display:[none|block], ignores visibility:[true|false]
  if ($("#accordionZiarat").is(":visible")) {
    $("#accordionZiarat").hide();
  }

  
  else if ($("#accordionZiarat").is(":hidden")) {
    $("#accordionZiarat").show();
  }

  else{

  }
person Mojtaba Nava    schedule 02.09.2020

person    schedule
comment
Потому что: not (': hidden') не то же самое, что is (': visible'). Visible работает с прозрачностью css, а не с JQuery show () / hide (). Кроме того, нет дополнительной цитаты. Каждый набор играет роль в этом небольшом коде. - person Kareem; 01.09.2015
comment
1) и :visible, и :hidden проверяют видимость элемента CSS и предка, а не только display: none, как вы сейчас предлагаете. 2) кавычки внутри псевдоселектора не требуются, если селектор содержит только : и буквенно-цифровые символы (например, :not(:hidden) совпадает с not(':hidden') (только немного быстрее) и 3) как вы станете лучше, если вы не можете согласиться с тем, что иногда на самом деле можете ошибаться? :) - person Gone Coding; 01.09.2015