Я рассмотрю этот ответ , где я подробно излагаю, как рассчитывается цвет между двумя слоями, чтобы написать следующий скрипт.
/* Utility function that you can easily find in the net */
function extractRgb (css) {
return css.match(/[0-9.]+/gi)
}
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
/**/
var c = window.getComputedStyle(document.getElementById('box')).backgroundColor;
c = extractRgb(c);
for(var i=0;i<3;i++)
c[i] = parseInt(c[i]*c[3] + 255*(1 - c[3])); /* Check the linked answer for details */
console.log(rgbToHex(c[0],c[1],c[2]) )
#box {
width: 100px;
height: 100px;
margin: 10px;
background-color: rgba(0, 0, 0, 0.3);
}
<div id="box"></div>
Сценарий может быть легко улучшен, но основная идея заключается в формуле, используемой для вычисления результата между двумя цветами:
ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor
ColorF
- наш последний цвет. ColorT
/ ColorB
- соответственно верхний и нижний цвета. opacityT
/ opacityB
- соответственно верхняя и нижняя непрозрачности, определенные для каждого цвета:
Коэффициент определяется по этой формуле OpacityT + OpacityB*(1 - OpacityT)
.