使用jQuery(或只是JavaScript),如何检测元素的继承背景颜色?
例如:
<div style="background-color: red">
<p id="target">I'd like to know that the background-color here is red</p>
</div>
然而:
$('#target').css('background-color') == rgba(0,0,0,0)
和
$('#target').css('backgroundColor') == rgba(0,0,0,0)
我要求一般解决方案。 $('#target').parent().css('background-color')
可以在这种情况下工作,但不是全部。
答案 0 :(得分:9)
这可以通过在循环中使用parent()
来实现,直到您到达body
标记:
我已根据您的代码设置了一个快速jsfiddle网站,其中包含一些演示。
修改强>:
很好的抓住了。在进行一些测试后,似乎IE7将返回'transparent'
而不是rgba(0,0,0,0)
值。我在IE7,Chrome 7和Firefox 3.6.1.2中测试过Here's an updated link。使用此方法的另一个警告:Chrome / Firefox将返回rgb(255,0,0)
; IE返回'red'
。
答案 1 :(得分:4)
#target
没有要阅读的背景色,因为background-color
未被继承。
你可以编写一些不断攀爬DOM树的javascript来搜索背景颜色声明,直到它找到一个。但是不能保证这会得到实际包含你的#target的元素的背景颜色。
顺便说一句。 css()
方法获取计算样式,因此它可以为您提供正确的读数。
答案 2 :(得分:4)
您可以使用window.getComputedStyle()
来获取继承的值。
警告:您必须在css或内联中手动声明继承。
#target{
background-color: inherit;
}
工作示例:
let bgc = window.getComputedStyle($('#target')[0],null).getPropertyValue("background-color");
console.log(bgc);
#target{
background-color: inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div style="background-color: red">
<p id="target">I'd like to know that the background-color here is red</p>
</div>
答案 3 :(得分:2)
Hacky-Recursive answer
jQuery.fn.InheritedBackgroundColor = function(){
jQuery(this).parents().each( function(){
var bc = jQuery(this).css("background-color");
if( bc == "transparent" ){
return jQuery(this).InheritedBackgroundColor();
}
else{
return bc;
}
});
}
$(document).ready(function(){
if( $("#target").InheritedBackgroundColor() == rbga(255,0,0,0) ){
alert("Win!");
}
else{
alert("FAIL!");
}
});
答案 4 :(得分:2)
以下是那些讨厌浏览器不一致的人的答案。
正如所解释的,你需要测试这个元素是否具有透明背景,如果是,则遍历DOM,直到找到设置了background-color
的父元素 - 但这意味着测试每个浏览器选择的任何字符串返回。
Firefox,IE和其他人返回transparent
,Chrome / safari / webkit浏览器等返回rgba(0, 0, 0, 0)
...我个人不相信那里不会有其他一些例外,现在或将来。
如果你不喜欢信任浏览器给你的字符串(你不应该),那么你不必:只测试一个空元素的background-color
。
这是一个JSBIN实例的例子。 (要在旧IE上测试,请从网址中删除“编辑”)
用法:在某处plonk此代码(它作为jQuery插件工作)...
(function($) {
// Get this browser's take on no fill
// Must be appended else Chrome etc return 'initial'
var $temp = $('<div style="background:none;display:none;"/>').appendTo('body');
var transparent = $temp.css('backgroundColor');
$temp.remove();
jQuery.fn.bkgcolor = function( fallback ) {
function test( $elem ) {
if ( $elem.css('backgroundColor') == transparent ) {
return !$elem.is('body') ? test( $elem.parent() ) : fallback || transparent ;
} else {
return $elem.css('backgroundColor');
}
}
return test( $(this) );
};
})(jQuery);
...然后你可以得到任何元素的'继承'背景颜色:
var backgroundColor = $('#someelement').bkgcolor();
或者,如果您要在此处或此元素后面的任何位置设置background-color
(例如,匹配叠加层),则需要应用后备而不是“透明”,请将其作为参数发送:
var backgroundColor = $('#someelement').bkgcolor('#ffffff');
答案 5 :(得分:-1)
这是解决这个问题的一种优雅方式(对不起,我更喜欢CoffeeScript)。它从自我开始,但你总是可以使用$el.parents().each ->
。
findClosestBackgroundColor = ($el) ->
background = 'white'
$.merge($el, $el.parents()).each ->
bg = $(this).css('background-color')
if bg isnt 'transparent' and !/rgba/.test(bg)
background = bg
return false
background
DEMO:使用coffeescript.org将其编译为javascript,并在包含jQuery的任何页面的控制台中运行它。