Màu sắc của hộp bán trong suốt xếp chồng lên nhau phụ thuộc vào đơn đặt hàng?


84

Tại sao màu cuối cùng của hai hộp nửa mờ xếp chồng lên nhau lại phụ thuộc vào thứ tự?

Làm thế nào tôi có thể làm cho nó để tôi có được cùng một màu trong cả hai trường hợp?

.a {
  background-color: rgba(255, 0, 0, 0.5)
}

.b {
  background-color: rgba(0, 0, 255, 0.5)
}
<span class="a"><span class="b">          Color 1</span></span>
<span class="b"><span class="a">Different Color 2</span></span>


7
Tôi không biết câu trả lời cho câu hỏi, nhưng điều tương tự cũng xảy ra trong photoshop và đó là thứ mà tôi đã chấp nhận trong nhiều năm chỉ là một phần của lý thuyết màu máy tính. Tôi sẽ nhìn xung quanh để xem liệu tôi có thể tìm thấy thêm thông tin nào không.
YAHsaves

11
Đối với những gì đáng giá của nó, điều tương tự cũng xảy ra trong cuộc sống thực đối với bất kỳ thứ gì không trong suốt 100% và được chiếu sáng từ phía trước. Nhiều ánh sáng hơn từ vật thể phía trước đến mắt bạn, do đó màu sắc của nó có ảnh hưởng lớn hơn đến màu cuối cùng ngay cả khi cả hai đều có độ trong suốt 50%.
jpa

4
@YAHsaves: Trung bình của 0 và 100 là 50 (bước 1). Giá trị trung bình của 50 và 150 là 100 (bước 2). So sánh điều này với: giá trị trung bình của 150 và 0 là 75 (bước 1). Mức trung bình của 75 và 100 là 87,5 (bước 2). Vấn đề là ba số không được tính đúng trọng số. Trung bình cần được tính toán dựa trên tất cả các số cùng một lúc; bạn không thể chỉ tính toán đệ quy từng bước trung bình. (Lưu ý rằng phép tính trung bình về cơ bản là phép tính độ trong suốt 50%. Phép tính thay đổi đối với các mức độ minh bạch khác nhau, nhưng nguyên tắc vẫn giống nhau)
Flater

2
Bài học kinh nghiệm: với 'mix-blend-mode: nhân', tôi sẽ có được màu độc lập với thứ tự xếp chồng - đó là những gì tôi đang tìm kiếm ban đầu! Tôi nghĩ câu trả lời @Moffens hữu ích nhất cho bất kỳ người dùng nào khác gặp phải vấn đề tương tự. Nhưng những lời giải thích của Temani Afif thực sự áp dụng cho câu hỏi của tôi và mô tả lý do tại sao HTML hoạt động theo cách khác (nó bắt chước sự truyền ánh sáng vật lý qua các lá bán trong suốt), vì vậy dấu tích màu xanh lá cây thuộc về anh ta.
rmv

Câu trả lời:


101

Đơn giản bởi vì trong cả hai trường hợp, sự kết hợp của các màu không giống nhau do độ mờ của lớp trên cùng ảnh hưởng như thế nào đến màu của lớp dưới cùng .

Đối với trường hợp đầu tiên, bạn thấy 50% màu xanh lam và 50% trong suốt ở lớp trên cùng. Qua phần trong suốt, bạn nhìn thấy 50% màu đỏ ở lớp dưới cùng (vì vậy chúng ta chỉ thấy 25% tổng số màu đỏ ). Logic tương tự cho trường hợp thứ hai ( 50% màu đỏ25% màu xanh lam ); do đó bạn sẽ thấy các màu khác nhau bởi vì đối với cả hai trường hợp, chúng ta không có tỷ lệ giống nhau.

Để tránh điều này, bạn cần có tỷ lệ giống nhau cho cả hai màu của bạn.

Dưới đây là một ví dụ để minh họa rõ hơn và chỉ ra cách chúng ta có thể có được cùng một màu:

Ở lớp trên cùng (khoảng bên trong) chúng ta có 0.25độ mờ (vì vậy chúng ta có 25% màu đầu tiên và 75% trong suốt) sau đó đối với lớp dưới cùng (khoảng ngoài) chúng ta có 0.333độ mờ (vì vậy chúng ta có 1/3 75% = 25% màu và phần còn lại là trong suốt). Chúng ta có tỷ lệ như nhau trong cả hai lớp (25%) nên chúng ta thấy cùng một màu ngay cả khi chúng ta đảo ngược thứ tự các lớp.

.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>

Một lưu ý nhỏ, nền trắng cũng ảnh hưởng đến việc hiển thị màu sắc. Tỷ lệ của nó là 50% sẽ tạo ra kết quả hợp lý là 100% (25% + 25% + 50%).

Bạn cũng có thể nhận thấy rằng sẽ không thể có tỷ lệ giống nhau cho cả hai màu của chúng tôi nếu lớp trên cùng có độ mờ lớn hơn 0.5vì lớp đầu tiên sẽ có nhiều hơn 50% và nó sẽ vẫn nhỏ hơn 50% cho lớp thứ hai một:

Trường hợp nhỏ thường gặp là khi lớp trên cùng có opacity:1màu trên cùng với tỷ lệ 100%; do đó nó có màu đục .


Để có lời giải thích chính xác và chính xác hơn, đây là công thức được sử dụng để tính toán màu sắc mà chúng ta thấy sau khi kết hợp cả hai lớp ref :

ColorF = (ColorT*opacityT + ColorB*OpacityB*(1 - OpacityT)) / factor

ColorF là màu cuối cùng của chúng tôi. ColorT / ColorB lần lượt là màu trên và dưới. opacityT / opacityB tương ứng là độ mờ trên cùng và dưới cùng được xác định cho mỗi màu:

Các factorđược xác định bởi công thức này OpacityT + OpacityB*(1 - OpacityT).

Rõ ràng là nếu chúng ta chuyển đổi hai lớp, factornó sẽ không thay đổi (nó sẽ vẫn là một hằng số) nhưng chúng ta có thể thấy rõ rằng tỷ lệ của mỗi màu sẽ thay đổi vì chúng ta không có cùng một hệ số.

Đối với trường hợp ban đầu của chúng tôi, cả hai độ sáng đều 0.5như vậy, chúng tôi sẽ có:

ColorF = (ColorT*0.5 + ColorB*0.5*(1 - 0.5)) / factor

Giống như đã giải thích ở trên, màu trên cùng có tỷ lệ 50% ( 0.5) và màu dưới cùng có tỷ lệ 25% ( 0.5*(1-0.5)) vì vậy việc chuyển đổi các lớp cũng sẽ chuyển đổi các tỷ lệ này; do đó chúng ta thấy một màu cuối cùng khác .

Bây giờ nếu chúng ta xem xét ví dụ thứ hai, chúng ta sẽ có:

ColorF = (ColorT*0.25 + ColorB*0.333*(1 - 0.25)) / factor

Trong trường hợp này, chúng ta có thể 0.25 = 0.333*(1 - 0.25)chuyển đổi hai lớp sẽ không có tác dụng; do đó màu sắc sẽ được giữ nguyên.

Chúng tôi cũng có thể xác định rõ ràng các trường hợp nhỏ:

  • Khi lớp trên cùng có opacity:0công thức bằngColorF = ColorB
  • Khi lớp trên cùng có opacity:1công thức bằngColorF = ColorT

23
@ChrisHappy tôi không giải quyết được vấn đề;) tôi đang giải thích .. lời giải thích đôi khi tốt hơn cách sửa chữa
Temani Afif

Sự cố vẫn xảy ra ngay cả khi bạn lấy các div ra khỏi nhau và định vị: tuyệt đối chúng xếp chồng lên nhau.
YAHsaves

1
@YAHsaves vấn đề sẽ xảy ra ngay cả khi chúng tôi sử dụng nhiều nền hoặc bất kỳ thứ gì làm cho hai màu ở trên nhau (sử dụng vị trí tuyệt đối hoặc không);)
Temani Afif

5
Nếu bạn muốn thêm TLDR, thì chúng sẽ là phép nhân thay vì cộng.
Caramiriel

2
@Caramiriel: "đa nhân" sẽ vẫn không giải thích tại sao phép toán không giao hoán.
Eric Duminil

41

Bạn có thể sử dụng thuộc tính css, mix-blend-mode : multiply ( hỗ trợ trình duyệt hạn chế )

.a {
  background-color: rgba(255, 0, 0, 0.5);
  mix-blend-mode: multiply;
}

.b {
  background-color: rgba(0, 0, 255, 0.5);
  mix-blend-mode: multiply;
}

.c {
  position: relative;
  left: 0px;
  width: 50px;
  height: 50px;
}

.d {
  position: relative;
  left: 25px;
  top: -50px;
  width: 50px;
  height: 50px;
}
<span class="a"><span class="b">          Color 1</span></span>
<span class="b"><span class="a">Different Color 2</span></span>

<div class="c a"></div>
<div class="d b"></div>

<div class="c b"></div>
<div class="d a"></div>


6
Chỉ cần về bất kỳ chế độ hòa trộn màu nào từ danh sách này là "giao hoán" sẽ thực hiện thủ thuật.
Salman A

Điều thú vị là tính năng này hoạt động với Chrome nhưng không hoạt động với Edge (kể từ bản cập nhật Windows 10 mới nhất).
Hong Ooi

3
@rmv tại sao bạn lại mong đợi bất cứ điều gì khác ngoài lớp phủ / bình thường? Màu sắc được mong đợi là gì nếu bạn đặt một hộp màu xanh lam mờ trước hộp màu đỏ? Nó sẽ có màu xanh lam thay vì màu đỏ hoặc chức năng của màu xanh lam và màu đỏ.
Salman A

1
@Moffen Câu trả lời hoàn hảo, nhưng bạn có thể vui lòng thêm giải thích cho lý do tại sao điều này hoạt động và tại sao mã gốc không?
Bergi

1
@rmv: Điều mà chế độ trộn "bình thường" bắt chước gần nhất là trộn sơn. Ví dụ: nếu bạn lấy một ít sơn trắng, thay một nửa bằng sơn đỏ và sau đó thay một nửa sơn hồng bằng sơn xanh, bạn sẽ có được màu tím xanh (25% trắng, 25% đỏ, 50% màu xanh da trời). Nếu bạn bắt đầu với cùng một màu sơn trắng nhưng trước tiên thay một nửa bằng màu xanh lam và sau đó một nửa kết quả bằng màu đỏ, bạn sẽ nhận được màu tím đỏ (25% trắng, 25% xanh lam, 50% đỏ).
Ilmari Karonen

22

Bạn đang trộn ba màu theo thứ tự sau:

  • rgba(0, 0, 255, 0.5) over (rgba(255, 0, 0, 0.5) over rgba(255, 255, 255, 1))
  • rgba(255, 0, 0, 0.5) over (rgba(0, 0, 255, 0.5) over rgba(255, 255, 255, 1))

Và bạn nhận được kết quả khác nhau. Điều này là do màu nền trước được pha trộn với màu nền bằng cách sử dụng chế độ hòa trộn bình thường 1,2 không phải là chế độ giao hoán 3 . Và vì nó không có tính chất giao hoán, hoán đổi màu nền trước và màu nền sẽ tạo ra kết quả khác nhau.

1 Chế độ hòa trộn là một chức năng chấp nhận màu nền trước và màu nền, áp dụng một số công thức và trả về màu kết quả.

2 Với hai màu, nền và nền trước, chế độ hòa trộn bình thường chỉ trả về màu nền trước.

3 Một phép toán có tính chất giao hoán nếu việc thay đổi thứ tự của các toán hạng không làm thay đổi kết quả, ví dụ phép cộng là giao hoán (1 + 2 = 2 + 1) và phép trừ không phải là (1 - 2 ≠ 2 - 1).

Giải pháp là sử dụng một chế độ hòa trộn có tính chất giao hoán: một chế độ trả về cùng một màu cho cùng một cặp màu theo bất kỳ thứ tự nào (ví dụ: chế độ hòa trộn nhân, nhân cả hai màu và trả về màu kết quả; hoặc chế độ hòa trộn tối, trả về màu đậm hơn của hai).


Để có sự hoàn chỉnh, đây là công thức để tính màu tổng hợp:

αs x (1 - αb) x Cs + αs x αb x B(Cb, Cs) + (1 - αs) x αb x Cb

với:

Cs: giá trị màu của màu nền trước
αs: giá trị alpha của màu nền trước
Cb: giá trị màu của màu nền
αb: giá trị alpha của màu nền
B: chức năng hòa trộn


8

Để giải thích về những gì xảy ra, hãy xem câu trả lời của Temani Afif.
Là một giải pháp thay thế, bạn có thể lấy một khoảng, aví dụ, định vị nó và cung cấp cho nó một chỉ số z thấp hơn nếu nó ở bên trong b. Sau đó, cách xếp chồng sẽ luôn giống nhau: bđược vẽ trên ađầu dòng đầu tiên và ađược vẽ bên dưới btrong dòng thứ hai.

.a {
  background-color: rgba(255, 0, 0, 0.5);
}

.b {
  background-color: rgba(0, 0, 255, 0.5);
}

.b .a {position:relative; z-index:-1;}
<span class="a"><span class="b">     Color 1</span></span>
<span class="b"><span class="a">Same Color 2</span></span>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.