どちらの場合も、色の組み合わせは、不透明度のどのように同じ原因ではないという理由だけで、トップ層はの色に影響下の層を。
最初のケースでは、最上層に50%の青と50%の透明が表示されます。透明な部分を通して、最下層に赤い色の50%が表示されます(したがって、合計で赤の25%しか表示されません)。第二のケース(のために同じ論理赤色の50%および青25% )。したがって、どちらの場合も同じ比率ではないため、異なる色が表示されます。
これを回避するには、両方の色で同じ比率にする必要があります。
これは、同じ色を取得する方法をわかりやすく説明するための例です。
最上層(内側のスパン)には0.25
不透明度があり(つまり、最初の色の25%、透明度の75%)、最下層(外側のスパン)には0.333
不透明度があります(つまり、 75%=色の25%で、残りは透明です)。両方のレイヤーで同じ比率(25%)であるため、レイヤーの順序を逆にしても同じ色が表示されます。
.a {
background-color: rgba(255, 0, 0, 0.333)
}
.b {
background-color: rgba(0, 0, 255, 0.333)
}
.a > .b {
background-color: rgba(0, 0, 255, 0.25)
}
.b > .a {
background-color: rgba(255, 0, 0, 0.25)
}
<span class="a"><span class="b"> Color 1</span></span>
<span class="b"><span class="a">Different Color 2</span></span>
ちなみに、白い背景も色のレンダリングに影響を与えています。その比率は50%であり、論理的な結果は100%(25%+ 25%+ 50%)になります。
また0.5
、最初のレイヤーの不透明度が50%を超え、2番目のレイヤーの不透明度が50%未満のままであるため、トップレイヤーの不透明度が大きい場合、両方の色の比率を同じにすることができないことに気付くかもしれません。1:
.a {
background-color: rgba(255, 0, 0, 1)
}
.b {
background-color: rgba(0, 0, 255, 1)
}
.a > .b {
background-color: rgba(0, 0, 255, 0.6)
}
.b > .a {
background-color: rgba(255, 0, 0, 0.6)
}
<span class="a"><span class="b"> Color 1</span></span>
<span class="b"><span class="a">Different Color 2</span></span>
一般的な些細なケースは、トップレイヤーがopacity:1
100%の割合でトップカラーを作成している場合です。したがって、それは不透明な色です。
ここでは、より正確で精密な説明については、我々は両方の層の組み合わせ後に表示色を計算するために使用される式であるREFを:
ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor
ColorFが最終的な色です。ColorT / ColorBは、それぞれトップカラーとボトムカラーです。 opacityT / opacityBは、それぞれ、各色に対して定義された上部と下部の不透明度です。
factor
この式で定義されますOpacityT + OpacityB*(1 - OpacityT)
。
2つのレイヤーを切り替えてfactor
も変化しないことは明らかですが(一定のままです)、同じ乗数がないため、各色の比率が変化することがはっきりとわかります。
最初のケースでは、両方の不透明度がある0.5
ため、次のようになります。
ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor
上で説明したように、上の色は50%(0.5
)の割合で、下の色は25%(0.5*(1-0.5)
)の割合であるため、レイヤーを切り替えるとこれらの比率も切り替わります。したがって、最終的な色が異なります。
ここで、2番目の例を検討すると、次のようになります。
ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor
この場合0.25 = 0.333*(1 - 0.25)
、2つのレイヤーを切り替えても効果はありません。したがって、色は同じままになります。
また、些細なケースを明確に特定することもできます。
- 最上層が
opacity:0
式を持っているときは等しいColorF = ColorB
- 最上層が
opacity:1
式を持っているときは等しいColorF = ColorT