Bạn không thể lấy một giá trị màu hiện có và áp dụng kênh alpha cho nó. Cụ thể, bạn không thể lấy một giá trị hex hiện có, chẳng hạn như #f0f0f0
, cung cấp cho nó một thành phần alpha và sử dụng giá trị kết quả với một thuộc tính khác.
Tuy nhiên, các thuộc tính tùy chỉnh cho phép bạn chuyển đổi giá trị hex của mình thành bộ ba RGB để sử dụng rgba()
, lưu trữ giá trị đó trong thuộc tính tùy chỉnh (bao gồm dấu phẩy!), Thay thế giá trị đó bằng var()
một rgba()
hàm bằng giá trị alpha mong muốn của bạn và nó sẽ chỉ làm việc
:root {
/* #f0f0f0 in decimal RGB */
--color: 240, 240, 240;
}
body {
color: #000;
background-color: #000;
}
#element {
background-color: rgba(var(--color), 0.8);
}
<p id="element">If you can see this, your browser supports custom properties.</p>
Điều này dường như quá tốt để trở thành sự thật. 1 Nó hoạt động như thế nào?
Điều kỳ diệu nằm ở chỗ các giá trị của các thuộc tính tùy chỉnh được thay thế như khi thay thế các var()
tham chiếu trong một giá trị thuộc tính, trước khi giá trị của thuộc tính đó được tính toán. Điều này có nghĩa là liên quan đến các thuộc tính tùy chỉnh, giá trị --color
trong ví dụ của bạn hoàn toàn không phải là giá trị màu cho đến khi một var(--color)
biểu thức xuất hiện ở đâu đó có giá trị màu (và chỉ trong ngữ cảnh đó). Từ phần 2.1 của thông số css-biến:
Cú pháp được phép cho các thuộc tính tùy chỉnh là rất dễ dàng. Việc sản xuất <kê khai-giá trị> khớp với bất kỳ chuỗi nào của một hoặc nhiều mã thông báo, miễn là chuỗi đó không chứa <bad-string-token>, <bad-url-token>, chưa từng có <) - mã thông báo>, <] - mã thông báo> hoặc <} - mã thông báo> hoặc mã thông báo <semicolon-token> cấp cao nhất hoặc mã thông báo <delim-token> có giá trị "!".
Ví dụ: dưới đây là một thuộc tính tùy chỉnh hợp lệ:
--foo: if(x > 5) this.width = 10;
Mặc dù giá trị này rõ ràng là vô dụng như một biến, vì nó sẽ không hợp lệ trong bất kỳ thuộc tính thông thường nào, nó có thể được đọc và hành động bằng JavaScript.
Và phần 3 :
Nếu một thuộc tính chứa một hoặc nhiều hàm var () và các hàm đó có hiệu lực về mặt cú pháp, thì ngữ pháp của toàn bộ thuộc tính phải được coi là hợp lệ tại thời điểm phân tích. Nó chỉ được kiểm tra cú pháp tại thời điểm giá trị được tính toán, sau khi các hàm var () đã được thay thế.
Điều này có nghĩa là 240, 240, 240
giá trị bạn thấy ở trên được thay thế trực tiếp vào rgba()
hàm trước khi khai báo được tính toán. Vậy đây:
#element {
background-color: rgba(var(--color), 0.8);
}
lúc đầu dường như không phải là CSS hợp lệ vì rgba()
hy vọng không ít hơn bốn giá trị số được phân tách bằng dấu phẩy, sẽ trở thành:
#element {
background-color: rgba(240, 240, 240, 0.8);
}
trong đó, tất nhiên, là CSS hoàn toàn hợp lệ.
Tiến thêm một bước nữa, bạn có thể lưu trữ thành phần alpha trong thuộc tính tùy chỉnh của riêng mình:
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
và thay thế nó, với cùng một kết quả:
#element {
background-color: rgba(var(--color), var(--alpha));
}
Điều này cho phép bạn có các giá trị alpha khác nhau mà bạn có thể trao đổi khi đang di chuyển.
1 Vâng, đó là, nếu bạn đang chạy đoạn mã trong trình duyệt không hỗ trợ các thuộc tính tùy chỉnh.