Как проверить, является ли элемент прозрачным (непрозрачным) из-за какого-либо родительского элемента?

#javascript #html #css

#javascript #HTML #css — код

Вопрос:

Возьмем следующий пример:

 const nested = document.querySelector("#nested")
const opacity = getComputedStyle(nested).opacity
console.log(opacity) 
 #parent{
  width: 100px;
  height: 100px;
  background: red;
  opacity: .2;
}

#nested {
  background: green;
} 
 <div id="parent">
  <div>
    <div>
      <div id="nested">nested</div>
    </div>
  </div>
</div> 

Как вы можете видеть #nested , он прозрачен, потому #parent что имеет opacity значение .2 , которое ожидается.

Вопрос

Как я могу проверить, является ли #nested он прозрачным (= непрозрачность меньше 1) из-за какого-то родительского элемента? getComputedStyle к сожалению, не работает, как показано в примере выше.

(В моем случае родительский элемент, который объявляет opacity значение, не может быть легко доступен с помощью селекторов, потому что он не уникален. Таким образом, я был бы признателен за решение без прямого доступа к родительскому элементу по идентификатору (или аналогичному), а скорее просто работая с вложенным элементом.)

Комментарии:

1. getComputedStyle всегда будет возвращаться 1 , так как прозрачность находится на родительском элементе. Чтобы узнать родительский элемент, используйте closest() метод.

2. @s.kuznetsov closest() на самом деле хороший намек! Но мне любопытно, сможете ли вы это выяснить, не зная, какой родитель вообще объявляет opacity значение (так что вы не знаете, что это #parent ).

3. Вам нужно проверить всех родителей и найти ближайшего родителя, чьи страхи меньше 1. Это можно попробовать с помощью цикла for .

4. Я боялся этого и надеялся, что будет лучшее решение.. :/

Ответ №1:

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

Поиск элемента начинается с дочернего элемента, цикла for() , поэтому это не вызовет никакой нагрузки.

 let nested = document.querySelector("#nested")

function findOpacityElement(el) {
  for (; el amp;amp; el !== document; el = el.parentNode) {
    if (getComputedStyle(el).opacity < 1) {
      console.log(el);
      console.log(getComputedStyle(el).opacity);
    } else {}
  }
};

findOpacityElement(nested); 
 #parent{
  width: 100px;
  height: 100px;
  background: red;
  opacity: .2;
}

#nested {
  background: green;
} 
 <div id="parent">
  <div>
    <div>
      <div id="nested">nested</div>
    </div>
  </div>
</div> 

Комментарии:

1. Спасибо, чувак! 🙂 у вас просто небольшая опечатка во втором классе css: #parent должно быть #parent2

2. @ysfaran, Упс. Я забыл удалить это, когда тестировал код. Теперь я это исправил. Рад помочь 🙂