Как проверить видимость элемента с помощью JavaScript? - PullRequest
16 голосов
/ 27 августа 2009

Меня интересует способ проверить, есть ли у элемента display: нет объяснения стиля (то есть style = "display: none"), есть класс, который имеет (или наследует) этот стиль, или один из его родителей скрытый (и мой элемент наследует это)

Вариант 1:

<body><div><span style="display:none;">Some hidden text</span></div>

или

<body><div style="display:none;"><span>Some hidden text</span></div>

Вариант 2:

SomeClass {   display:none;   }
<body><div class="SomeClass"><span>Some hidden text</span></div>

Спасибо

Ответы [ 5 ]

25 голосов
/ 27 августа 2009

Вы ищете одно решение для двух разных сценариев.

Первый сценарий - получение каскадного / вычисляемого стиля для свойства css. См. этот ответ , чтобы узнать, как это сделать.

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

Вы можете взять решение , изложенное здесь (и используется jQuery / Sizzle с 1.3.2 ), и просто прочитать размеры элемента:

var isVisible = element.offsetWidth > 0 || element.offsetHeight > 0;

Если он имеет размеры, то это видно в том смысле, что он занимает некоторое прямоугольное пространство (хотя и небольшое) в документе. Обратите внимание, что этот метод все еще имеет некоторые недостатки для определенных элементов в определенных браузерах, но в большинстве случаев должен работать.

5 голосов
/ 27 августа 2009

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

function isVisible(elem) {
  return elem.offsetWidth > 0 || elem.offsetHeight > 0;
}
1 голос
/ 27 августа 2009

Каждый случай будет нуждаться в отдельной проверке, и вам нужно знать идентификатор этого элемента. Сначала возьмите элемент (просто сделайте это, чтобы сделать код читабельным):

var MyElementName = document.getElementById("MyElementName");

Тогда сделайте ваши чеки:

Случай 1:

 if (MyElementName.style.display == "none")

Случай 2 , смотрит на родителя, сначала проверяет FF:

if ((MyElementName.previousSibling.nodeType == 3 )
    && (MyElementName.parentNode.nextSibling.style.display == "none"))

затем для других браузеров:

else (MyElementName.parentNode.style.display == "none")

Случай 3 , ищите применяемый класс CSS:

if (MyElementName.className = "SomeClass")
0 голосов
/ 07 сентября 2015

Приведенное выше решение учитывает этот сценарий "невидимости":

display:none;

но это не подходит для этого:

visibility: hidden;

Для того, чтобы включить тест на видимость: скрыто; скрипт можно изменить следующим образом ...

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

computedStyle = function(vElement) {
  return window.getComputedStyle?
         ?window.getComputedStyle(vElement,null)
         :vElement.currentStyle;                    //IE 8 and less
}

Во-вторых, создайте функцию для проверки видимости

isVisible = function(vElement) {
  return !(vElement.offsetWidth == 0 && vElement.offsetHeight == 0)
         && computedStyle(vElement).visibility != "hidden";  
}

Наконец, просто обращайтесь к функции isVisible там, где это необходимо, следующим образом:

if (isVisible(myElement)) {
  alert('You can see me!');
} else {
  alert('I am invisible ha ha!');
}

Просто обратите внимание, что текущие тесты isVisible () не учитывают ряд сценариев "невидимости" (однако я могу предположить, что тесты будут расширены, чтобы включить их). Вот несколько примеров:

  1. где элемент того же цвета, что и окружающий цвет
  2. где элемент виден, но физически за другим элементом, например. разные значения z-index

Также, вероятно, стоит отметить следующее относительно вышеупомянутой функции computedStyle ():

  1. Конечно, кроме проверки видимости, его можно использовать для многих других стилевых целей
  2. Я предпочел игнорировать: тестирование псевдо-стиля из-за нестабильной поддержки браузера, однако с незначительным изменением функции это можно было бы включить при желании.
0 голосов
/ 27 августа 2009

Это то, что вы пытаетесь сделать?

function SomeClass()
{
  if (document.getElementById("MY_DIV_ID").style.display == "none")
  {

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...