Просто тому, що в обох випадках поєднання кольорів неоднакове через те, як непрозорість верхнього шару впливає на колір нижнього шару.
У першому випадку ви бачите 50% синього та 50% прозорого у верхньому шарі. Через прозору частину ви бачите 50% червоного кольору в нижньому шарі (отже, ми бачимо лише 25% червоного ). Така ж логіка для другого випадку ( 50% червоного та 25% синього ); таким чином ви побачите різні кольори, оскільки в обох випадках ми не маємо однакової пропорції.
Щоб цього уникнути, потрібно мати однакову пропорцію для обох кольорів.
Ось приклад, щоб краще проілюструвати і показати, як ми можемо отримати однаковий колір:
У верхньому шарі (внутрішній проліт) ми маємо 0.25
непрозорість (отже, ми маємо 25% першого кольору і 75% прозорого), тоді для нижнього шару (зовнішній проліт) ми маємо 0.333
непрозорість (отже, маємо 1/3 від 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%, а другий - менше 50% один:
.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)
.
Зрозуміло, що якщо ми переключимо два шари, це factor
не зміниться (це залишиться незмінним), але ми чітко бачимо, що пропорція кожного кольору зміниться, оскільки ми не маємо однакового множника.
У нашому початковому випадку обидві непрозорість такі, що 0.5
ми матимемо:
ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor
Як пояснювалося вище, верхній колір має частку 50% ( 0.5
), а нижній - 25% ( 0.5*(1-0.5)
), тому перемикання шарів також змінить ці пропорції; таким чином ми бачимо інший кінцевий колір.
Тепер, якщо розглянути другий приклад, ми матимемо:
ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor
У цьому випадку ми маємо, 0.25 = 0.333*(1 - 0.25)
тому перемикання двох шарів не матиме ефекту; таким чином колір залишиться незмінним.
Ми також можемо чітко визначити тривіальні випадки:
- Коли верхній шар має
opacity:0
формулу, дорівнюєColorF = ColorB
- Коли верхній шар має
opacity:1
формулу, дорівнюєColorF = ColorT