Ви не можете прийняти існуюче значення кольору і застосувати до нього альфа-канал. А саме, ви не можете прийняти існуюче значення шістнадцятки, наприклад #f0f0f0
, надати йому альфа-компонент і використовувати отримане значення з іншим властивістю.
Однак користувацькі властивості дозволяють перетворити ваше шістнадцяткове значення в триплет RGB для використання rgba()
, зберігати це значення у користувальницькій властивості (включаючи коми!), Замінювати це значення за var()
допомогою rgba()
функції на потрібне значення альфа, і воно буде просто працюй:
: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>
Це здається майже надто гарним, щоб бути правдою. 1 Як це працює?
Магія полягає в тому, що значення користувацьких властивостей підміняються так, як це відбувається при заміні var()
посилань на значення властивості, перш ніж обчислюється значення цього властивості. Це означає , що, наскільки призначені для користувача властивості стурбовані значення --color
в вашому прикладі не є значення кольору на всіх , поки в var(--color)
вираженні з'являється де - то , що очікує значення кольору (і тільки в цьому контексті). З розділу 2.1 специфікації змінних css:
Дозволений синтаксис для власних властивостей надзвичайно дозвільний. Виробництво <declaration-value> відповідає будь-якій послідовності одного або декількох лексем, якщо послідовність не містить <bad-string-token>, <bad-url-token>, unmatched <) - token>, <] - токен>, або <} - маркер>, або лексеми верхнього рівня <semicolon-token> або лексеми <delim-token> зі значенням "!".
Наприклад, наведене нижче дійсне спеціальне властивість:
--foo: if(x > 5) this.width = 10;
Хоча це значення, очевидно, марно як змінна, оскільки воно буде недійсним у будь-якій нормальній властивості, воно може читатись і діяти на JavaScript.
І розділ 3 :
Якщо властивість містить одну або більше функцій var (), і ці функції є синтаксично дійсними, граматика всієї власності повинна вважатись дійсною під час розбору. Він перевіряється лише синтаксисом під час обчисленого значення після того, як функції var () були замінені.
Це означає, що 240, 240, 240
наведене вище значення заміщається безпосередньо у rgba()
функції перед обчисленням декларації. Отже це:
#element {
background-color: rgba(var(--color), 0.8);
}
який спочатку не здається дійсним CSS, оскільки rgba()
очікує не менше чотирьох числових значень, розділених комами, стає таким:
#element {
background-color: rgba(240, 240, 240, 0.8);
}
що, звичайно, цілком відповідає CSS.
Зробивши його на крок далі, ви можете зберігати альфа-компонент у його власному власному властивості:
:root {
--color: 240, 240, 240;
--alpha: 0.8;
}
і замінити його з тим же результатом:
#element {
background-color: rgba(var(--color), var(--alpha));
}
Це дозволяє вам мати різні альфа-значення, які можна обміняти на ходу.
1 Ну, це якщо ви запустите фрагмент коду в браузері, який не підтримує власні властивості.