← Назад к вопросам

Как понять что элемент скрыт?

2.3 Middle🔥 141 комментариев
#HTML и CSS#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как понять что элемент скрыт

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

Основные способы скрытия элементов

display: none — удаляет элемент из layout

const isHidden = window.getComputedStyle(element).display === 'none';

visibility: hidden — скрывает элемент, но занимает место

const isHidden = window.getComputedStyle(element).visibility === 'hidden';

opacity: 0 — делает элемент прозрачным

const isHidden = parseFloat(window.getComputedStyle(element).opacity) === 0;

Проверка через размеры элемента

// Если размеры нулевые, элемент скрыт
function isElementVisible(element) {
  return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);
}

const element = document.querySelector('.box');
console.log(isElementVisible(element)); // true/false

Это работает для всех способов скрытия:

  • offsetWidth === 0 при display: none
  • getClientRects().length === 0 при вывода элемента из потока

Проверка видимости в viewport

function isInViewport(element) {
  const rect = element.getBoundingClientRect();
  return (
    rect.top < window.innerHeight &&
    rect.bottom > 0 &&
    rect.left < window.innerWidth &&
    rect.right > 0
  );
}

Современный способ: IntersectionObserver

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      console.log('Элемент видим');
    } else {
      console.log('Элемент вне viewport');
    }
  });
});

observer.observe(element);

IntersectionObserver — это наиболее эффективный способ определения видимости, он не требует постоянного слушания скролла.

Комплексная проверка

function isFullyHidden(element) {
  // Проверка display
  if (getComputedStyle(element).display === 'none') return true;
  
  // Проверка visibility
  if (getComputedStyle(element).visibility === 'hidden') return true;
  
  // Проверка opacity
  if (parseFloat(getComputedStyle(element).opacity) === 0) return true;
  
  // Проверка размеров
  if (element.offsetHeight === 0 || element.offsetWidth === 0) return true;
  
  // Проверка родителя
  if (element.parentElement) {
    return isFullyHidden(element.parentElement);
  }
  
  return false;
}

Практический пример: lazy loading изображений

function setupLazyImages() {
  const images = document.querySelectorAll('[data-src]');
  
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        img.removeAttribute('data-src');
        observer.unobserve(img);
      }
    });
  });
  
  images.forEach(img => observer.observe(img));
}

Выбор подхода

  • getComputedStyle() — для проверки CSS свойств (display, visibility, opacity)
  • offsetHeight/offsetWidth — для быстрой проверки, скрыт ли элемент
  • getBoundingClientRect() — для проверки видимости на экране
  • IntersectionObserver — лучший выбор для эффективной работы с видимостью (рекомендуется)