Селекторы видимости

Селекторы видимости в jQuery позволяют выбирать элементы DOM на основе их отображения на странице: видимы они пользователю или скрыты. Такие селекторы особенно полезны при работе с динамическим контентом, анимациями и фильтрацией элементов. Основные селекторы видимости — :visible и :hidden.


:visible

Селектор :visible выбирает все элементы, которые отображаются на странице. Элемент считается видимым, если:

  • У него не установлено свойство display: none.
  • У него не установлено свойство visibility: hidden (в сочетании с opacity: 0 учитывается, хотя формально элемент занимает место).
  • Элемент имеет размеры больше нуля по ширине и высоте.

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

// Выбирает все видимые абзацы
$("p:visible").css("color", "blue");

// Проверка видимости конкретного элемента
if ($("#menu").is(":visible")) {
    console.log("Меню отображается");
}

Особенность :visible в том, что она учитывает реальные размеры элемента. Если элемент имеет height: 0 и width: 0, он будет считаться скрытым, даже если display не равен none.


:hidden

Селектор :hidden является противоположностью :visible и выбирает элементы, которые не отображаются на странице. Сюда попадают элементы, у которых:

  • display: none
  • visibility: hidden
  • Размеры равны нулю (width: 0, height: 0)

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

// Скрывает все скрытые элементы (на случай динамического отображения)
$("div:hidden").fadeIn(400);

// Проверка скрытого состояния
if ($("#popup").is(":hidden")) {
    console.log("Попап скрыт");
}

Эффективно использовать :hidden для добавления анимаций и постепенного отображения контента.


Комбинирование селекторов видимости

Селекторы видимости могут сочетаться с другими селекторами для точного выбора элементов:

// Все видимые элементы списка с классом active
$("ul li.active:visible").addClass("highlight");

// Все скрытые изображения в контейнере
$("#gallery img:hidden").fadeIn(300);

Такая комбинация повышает точность операций, особенно в сложных DOM-структурах.


Методы работы с видимостью

Помимо селекторов, jQuery предоставляет методы для управления видимостью элементов:

  • show() — делает элемент видимым.
  • hide() — скрывает элемент.
  • toggle() — переключает состояние видимости.
  • fadeIn(), fadeOut(), fadeToggle() — анимации появления/исчезновения.
  • slideDown(), slideUp(), slideToggle() — анимации скольжения.

Примеры:

// Скрывает все видимые блоки с классом .content
$(".content:visible").hide();

// Переключает видимость скрытых элементов
$(".item:hidden").toggle();

Методы show() и hide() меняют CSS-свойство display, а методы анимации (fadeIn, slideDown) постепенно изменяют свойства opacity или height, создавая плавный эффект.


Особенности и ограничения

  1. Скрытые элементы в DOM: Элементы с display: none полностью исключаются из визуального потока, поэтому :visible их не выберет.
  2. Влияние родительских элементов: Если родитель скрыт (display: none), все вложенные элементы считаются скрытыми, даже если у них нет собственного свойства display: none.
  3. Inline-стили vs CSS: jQuery проверяет вычисленные стили, а не только атрибуты style. Элемент с visibility: hidden в CSS будет считаться скрытым.
  4. Производительность: Использование :visible и :hidden на больших документах может быть ресурсоёмким, особенно при комбинировании с другими сложными селекторами. В таких случаях рекомендуется сначала сузить выборку по классам или тегам.

Практические сценарии

  • Фильтрация форм: показывать только видимые поля для проверки заполнения.
  • Динамические списки: подсветка видимых элементов при скролле или фильтрации.
  • Анимация интерфейса: плавное раскрытие скрытых блоков.
  • Управление всплывающими окнами и модальными формами: проверка состояния видимости перед выполнением действия.

Проверка видимости через .is()

Метод .is() позволяет определить, видим ли конкретный элемент, используя селекторы :visible и :hidden:

if ($("#notification").is(":visible")) {
    $("#notification").fadeOut(200);
}

if ($("#tooltip").is(":hidden")) {
    $("#tooltip").fadeIn(200);
}

В отличие от фильтров, .is() возвращает булево значение, что удобно для условий.


Резюме особенностей

  • :visible — выбирает элементы, реально отображаемые на странице.
  • :hidden — выбирает скрытые элементы по любому критерию.
  • Методы show(), hide(), toggle() управляют видимостью через CSS.
  • Анимации (fade, slide) добавляют плавный переход между состояниями.
  • Родительские элементы влияют на видимость дочерних элементов.
  • Проверка видимости через .is() позволяет работать с отдельными элементами в условиях и логике интерфейса.

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