Просто потому, что в обоих случаях комбинация цветов не одинакова из-за того, как непрозрачность верхнего слоя влияет на цвет нижнего слоя.
В первом случае вы видите 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