Решение
Вот некоторые ванильные js, которые получат эффективный цвет фона для данного элемента:
function getInheritedBackgroundColor(el) {
// get default style for current browser
var defaultStyle = getDefaultBackground() // typically "rgba(0, 0, 0, 0)"
// get computed color for el
var backgroundColor = window.getComputedStyle(el).backgroundColor
// if we got a real value, return it
if (backgroundColor != defaultStyle) return backgroundColor
// if we've reached the top parent el without getting an explicit color, return default
if (!el.parentElement) return defaultStyle
// otherwise, recurse and try again on parent element
return getInheritedBackgroundColor(el.parentElement)
}
function getDefaultBackground() {
// have to add to the document in order to use getComputedStyle
var div = document.createElement("div")
document.head.appendChild(div)
var bg = window.getComputedStyle(div).backgroundColor
document.head.removeChild(div)
return bg
}
Затем вы можете назвать это так:
var myEl = document.getElementById("a")
var bgColor = getInheritedBackgroundColor(myEl)
Демо в jsFiddle
Объяснение
Решение работает путем проверки разрешенного значения для определенного элемента. Если фон прозрачен, он начнется снова с родительского элемента, пока не найдет определенный цвет или не достигнет вершины.
Есть два основных понятия, с которыми следует ознакомиться:
- Как устанавливается background-color?
- Как работают разрешенные значения?
Согласно MDN, background-color
имеет начальный значение transparent
и не унаследованное свойство. Это означает, что даже если к родительскому div применен цвет, любой нестилизованный дочерний div будет иметь background-color
из transparent
. Большинство браузеров преобразуют это в цветовое пространство rgb, поэтому возвращают значение rgba(0,0,0,0)
с альфа-каналом/прозрачностью, установленными на 0%
.
Это различие может показаться тривиальным, но важно понимать, что большинство разделов на странице, вероятно, прозрачны. Они не окрашивают никакие цвета, они просто не маскируют родительские элементы. Если бы фоновые значения были унаследованы, цвета с прозрачностью складывались и усиливались на дочерних элементах
Согласно MDN, разрешенные значения это то, что браузер возвращает из .getComputedStyle()
, включая вычисленные значения и используемые значения. Использование разрешенного значения помогает обрабатывать специальные значения, такие как inherit
, initial
и т. д., и превращает любые относительные значения в абсолютные значения. Плюс также предоставляет согласованный API для получения информации о стилях из атрибутов по сравнению с теми, которые применяются через таблицы стилей.
Таким образом, window.getComputedStyle()
не используется для определения цвета фона; это просто, чтобы получить фактическое значение для div. А затем мы пройдемся по дереву DOM, пока не найдем фактическое значение.
Дальнейшее чтение
person
KyleMit
schedule
29.06.2020