解决方案
下面是一些香草 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 中的演示
解释
该解决方案通过检查特定元素的解析值来工作。如果背景是透明的,它将从元素的父元素重新开始,直到找到定义的颜色或到达顶部。
有两个主要概念需要熟悉:
- 如何设置背景颜色?
- 解析值如何工作?
根据 MDN,background-color
具有初始值并且transparent
不是继承属性。这意味着即使父 div 应用了颜色,任何未设置样式的子 div 也将具有background-color
of transparent
。大多数浏览器会将其转换为 rgb 颜色空间,因此将返回alpha 通道/透明度设置为rgba(0,0,0,0)
的值。0%
这种区别可能看起来微不足道,但重要的是要了解页面上的大多数div 可能是透明的。它们不绘制任何颜色,它们只是不掩盖父元素。如果继承了背景值,则具有透明度的颜色将堆叠并在子元素上变得更强
根据 MDN,解析值是浏览器返回的值,.getComputedStyle()
其中包括计算值和使用值。使用解析的值有助于处理特殊值,如inherit
,initial
等,并将任何相对值转换为绝对值。Plus 还提供了一致的 API,用于从属性获取样式信息与通过样式表应用的样式信息。
所以window.getComputedStyle()
不用于确定背景中出现的颜色;它只是为了获取 div 的实际值。然后我们将遍历 DOM 树,直到找到一个实际值。
延伸阅读