내 시도는 다음과 같습니다.
(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이고 오버플로가 숨겨지지 않은 경우). 그 작업을 수행하는 것은 훨씬 더 복잡 할 것입니다.