これが私の試みです:
(function ($) {
$.fn.contrastingText = function () {
var el = this,
transparent;
transparent = function (c) {
var m = c.match(/[0-9]+/g);
if (m !== null) {
return !!m[3];
}
else return false;
};
while (transparent(el.css('background-color'))) {
el = el.parent();
}
var parts = el.css('background-color').match(/[0-9]+/g);
this.lightBackground = !!Math.round(
(
parseInt(parts[0], 10) + // red
parseInt(parts[1], 10) + // green
parseInt(parts[2], 10) // blue
) / 765 // 255 * 3, so that we avg, then normalize to 1
);
if (this.lightBackground) {
this.css('color', 'black');
} else {
this.css('color', 'white');
}
return this;
};
}(jQuery));
それを使用するには:
var t = $('#my-el');
t.contrastingText();
これにより、テキストが適切に黒または白になります。アイコンを実行するには:
if (t.lightBackground) {
iconSuffix = 'black';
} else {
iconSuffix = 'white';
}
次に、各アイコンは のようになります'save' + iconSuffix + '.jpg'
。
これは、コンテナーがその親をオーバーフローしている場合には機能しないことに注意してください (たとえば、CSS の高さが 0 で、オーバーフローが非表示になっていない場合)。それを機能させるには、はるかに複雑になります。