Semplicemente perché in entrambi i casi la combinazione dei colori non è la stessa a causa di come l'opacità dello strato superiore influisce sul colore dello strato inferiore .
Per il primo caso, vedi il 50% di blu e il 50% di trasparente nello strato superiore. Attraverso la parte trasparente, vedi il 50% di colore rosso nello strato inferiore (quindi vediamo solo il 25% di rosso in totale). Stessa logica per il secondo caso ( 50% di rosso e 25% di blu ); quindi vedrai colori diversi perché per entrambi i casi non abbiamo la stessa proporzione.
Per evitare ciò è necessario avere la stessa proporzione per entrambi i colori.
Ecco un esempio per meglio illustrare e mostrare come possiamo ottenere lo stesso colore:
Nello strato superiore (lo span interno) abbiamo 0.25
dell'opacità (quindi abbiamo il 25% del primo colore e il 75% di trasparente) poi per lo strato inferiore (lo span esterno) abbiamo 0.333
opacità (quindi abbiamo 1/3 di 75% = 25% del colore e il restante è trasparente). Abbiamo la stessa proporzione in entrambi gli strati (25%) quindi vediamo lo stesso colore anche se invertiamo l'ordine degli strati.
.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>
Come nota a margine, lo sfondo bianco influisce anche sulla resa dei colori. La sua proporzione è del 50%, il che renderà il risultato logico del 100% (25% + 25% + 50%).
Potresti anche notare che non sarà possibile avere la stessa proporzione per entrambi i nostri colori se lo strato superiore ha un'opacità maggiore di 0.5
perché il primo avrà più del 50% e rimarrà inferiore al 50% per il secondo uno:
.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>
Il caso banale comune è quando lo strato superiore è avente opacity:1
che rende il colore superiore con una proporzione del 100%; quindi è un colore opaco .
Per una spiegazione più accurata e precisa ecco la formula utilizzata per calcolare il colore che vediamo dopo la combinazione di entrambi gli strati rif :
ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor
ColorF è il nostro colore finale. ColorT / ColorB sono rispettivamente i colori superiore e inferiore. opacityT / opacityB sono rispettivamente le opacità superiore e inferiore definite per ciascun colore:
Il factor
è definito da questa formula OpacityT + OpacityB*(1 - OpacityT)
.
È chiaro che se cambiamo i due livelli factor
non cambierà (rimarrà una costante) ma possiamo vedere chiaramente che la proporzione per ogni colore cambierà poiché non abbiamo lo stesso moltiplicatore.
Per il nostro caso iniziale, entrambe le opacità sono 0.5
così avremo:
ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor
Come spiegato sopra, il colore superiore ha una proporzione del 50% ( 0.5
) e quello inferiore ha una proporzione del 25% ( 0.5*(1-0.5)
), quindi cambiare gli strati cambierà anche queste proporzioni; quindi vediamo un colore finale diverso .
Ora se consideriamo il secondo esempio avremo:
ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor
In questo caso, il 0.25 = 0.333*(1 - 0.25)
passaggio dei due livelli non avrà alcun effetto; così il colore rimarrà lo stesso.
Possiamo anche identificare chiaramente i casi banali:
- Quando lo strato superiore ha
opacity:0
la formula è uguale aColorF = ColorB
- Quando lo strato superiore ha
opacity:1
la formula è uguale aColorF = ColorT