Po prostu dlatego, że w obu przypadkach kombinacja kolorów nie jest taka sama ze względu na to, jak krycie górnej warstwy wpływa na kolor dolnej warstwy.
W pierwszym przypadku widać 50% niebieskiego i 50% przezroczystości w górnej warstwie. Przez przezroczystą część widać 50% koloru czerwonego w dolnej warstwie (więc w sumie widzimy tylko 25% czerwieni ). Ta sama logika w drugim przypadku ( 50% czerwieni i 25% niebieskiego ); w ten sposób zobaczysz różne kolory, ponieważ w obu przypadkach nie mamy takich samych proporcji.
Aby tego uniknąć, musisz mieć takie same proporcje dla obu kolorów.
Oto przykład, aby lepiej zilustrować i pokazać, jak możemy uzyskać ten sam kolor:
W górnej warstwie (wewnętrzna rozpiętość) mamy 0.25
krycie (więc mamy 25% pierwszego koloru i 75% przezroczystości), a dla dolnej warstwy (zewnętrzna rozpiętość) mamy 0.333
krycie (więc mamy 1/3 75% = 25% koloru, a pozostała część jest przezroczysta). Mamy taki sam udział w obu warstwach (25%), więc widzimy ten sam kolor, nawet jeśli odwrócimy kolejność warstw.
.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>
Na marginesie, białe tło ma również wpływ na renderowanie kolorów. Jego proporcja wynosi 50%, co daje logiczny wynik 100% (25% + 25% + 50%).
Możesz również zauważyć, że nie będzie możliwe uzyskanie takiej samej proporcji dla obu kolorów, jeśli górna warstwa ma krycie większe niż 0.5
dlatego, że pierwsza będzie miała więcej niż 50%, a pozostanie mniej niż 50% dla drugiej jeden:
.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>
Typowym trywialnym przypadkiem jest sytuacja, w której wierzchnia warstwa opacity:1
tworzy kolor wierzchni w 100%; dlatego jest to nieprzezroczysty kolor.
Aby uzyskać dokładniejsze i bardziej precyzyjne wyjaśnienie, oto wzór używany do obliczenia koloru, który widzimy po połączeniu obu warstw, ref :
ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor
ColorF to nasz ostateczny kolor. ColorT / ColorB to odpowiednio górny i dolny kolor. krycieT / krycieB to odpowiednio górne i dolne krycia zdefiniowane dla każdego koloru:
factor
Definiuje się w niniejszym wzorze OpacityT + OpacityB*(1 - OpacityT)
.
Oczywiste jest, że jeśli zmienimy dwie warstwy factor
, nie zmieni się (pozostanie stała), ale wyraźnie widać, że proporcje dla każdego koloru ulegną zmianie, ponieważ nie mamy tego samego mnożnika.
W naszym początkowym przypadku oba zmętnienia są 0.5
więc:
ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor
Jak wyjaśniono powyżej, górny kolor ma udział 50% ( 0.5
), a dolny ma udział 25% ( 0.5*(1-0.5)
), więc przełączanie warstw również zmieni te proporcje; w ten sposób widzimy inny ostateczny kolor.
Teraz, jeśli weźmiemy pod uwagę drugi przykład, będziemy mieli:
ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor
W tym przypadku mamy 0.25 = 0.333*(1 - 0.25)
więc zamianę dwóch warstw bez efektu; w ten sposób kolor pozostanie taki sam.
Możemy również wyraźnie zidentyfikować trywialne przypadki:
- Gdy warstwa wierzchnia ma
opacity:0
formułę równąColorF = ColorB
- Gdy warstwa wierzchnia ma
opacity:1
formułę równąColorF = ColorT