Я разрабатываю приложение в электронном виде, поэтому у меня есть доступ к переменным CSS. Я определил цветовую переменную в vars.css
:
:root {
--color: #f0f0f0;
}
Я хочу использовать этот цвет main.css
, но с некоторой непрозрачностью:
#element {
background: (somehow use var(--color) at some opacity);
}
Как бы я поступил так? Я не использую какой-либо препроцессор, только CSS. Я бы предпочел полностью CSS-ответ, но я приму JavaScript / jQuery.
Я не могу использовать, opacity
потому что я использую фоновое изображение, которое не должно быть прозрачным.
css
colors
css-variables
JoshyRobot
источник
источник
Ответы:
Вы не можете взять существующее значение цвета и применить к нему альфа-канал. А именно, вы не можете принять существующее шестнадцатеричное значение, такое как
#f0f0f0
, присвоить ему альфа-компонент и использовать полученное значение с другим свойством.Тем не менее, пользовательские свойства позволяют вам преобразовать ваше шестнадцатеричное значение в триплет RGB для использования с ним
rgba()
, сохранить это значение в пользовательском свойстве (включая запятые!), Заменить это значение сvar()
помощьюrgba()
функции с желаемым альфа-значением, и оно будет просто работать:Это кажется слишком хорошим, чтобы быть правдой. 1 Как это работает?
Волшебство заключается в том, что значения пользовательских свойств подставляются как есть при замене
var()
ссылок в значении свойства, прежде чем вычисляется значение этого свойства. Это означает, что в отношении пользовательских свойств значение--color
в вашем примере вообще не является значением цвета, пока не появитсяvar(--color)
выражение где-то, ожидающее значение цвета (и только в этом контексте). Из раздела 2.1 спецификации css-переменных:И раздел 3 :
Это означает, что
240, 240, 240
значение, которое вы видите выше, подставляется непосредственно вrgba()
функцию до вычисления объявления. Итак, это:который на первый взгляд не выглядит допустимым CSS, потому что
rgba()
ожидает не менее четырех числовых значений, разделенных запятыми, становится следующим:что, конечно же, является совершенно правильным CSS.
Сделав еще один шаг вперед, вы можете сохранить альфа-компонент в его собственном пользовательском свойстве:
и подставим его с тем же результатом:
Это позволяет вам иметь различные альфа-значения, которые вы можете менять на лету.
1 Хорошо, если вы запускаете фрагмент кода в браузере, который не поддерживает пользовательские свойства.
источник
.element2 { background-color: rgba(var(--red), var(--low-opacity); }
. Таким образом, вы можете полностью использовать использование переменных :)."240, 240, 240"
не может быть изменено с помощью палитры цветов. Это огромная ошибка, когда вам нужно найти правильные цвета для вашего графического интерфейса.var(--hex-color)99
конвертируется в два токена#333333 99
(обратите внимание на пробел для разделения токенов), что явно не то, что вам нужно. Пользовательские свойства изначально были определены для копирования токенов, а не строк, и это конечный результат. Это слишком поздно, чтобы исправить это сейчас.Я знаю, что OP не использует препроцессор, но мне бы помогли, если бы здесь ответом была следующая информация (я пока не могу комментировать, иначе я бы прокомментировал ответ @BoltClock.
Если вы используете, например, scss, ответ выше не даст результатов, потому что scss пытается скомпилировать стили с помощью специфичной для scss функции rgba () / hsla (), которая требует 4 параметра. Однако rgba () / hsla () также являются нативными функциями css, поэтому вы можете использовать интерполяцию строк, чтобы обойти функцию scss.
Пример (действует в sass 3.5.0+):
Обратите внимание, что интерполяция строк не будет работать для функций scss, не относящихся к CSS, например
lighten()
, потому что полученный код не будет функциональным CSS. Это все равно будет действительным scss, так что вы не получите ошибки при компиляции.источник
@function rgb($args...) { @return #{'rgb(#{$args})'}; }
@function rgba($args...) { @return #{'rgba(#{$args})'}; }
@function hsl($args...) { @return #{'hsl(#{$args})'}; }
@function hsla($args...) { @return #{'hsla(#{$args})'}; }
`` ``rgba
является синонимом вrgb
течение достаточно долгого времени .. Следовательно, вам разрешено отбрасывать «а».RGB
), который затем игнорируется sass. Например:color: RGB(var(--color_rgb), 0.5);
. От GitHub:root { @each $color, $value in $colors { --#{$color}_rgb: #{red($value), green($value), blue($value)}; } }
Я был в подобной ситуации, но , к сожалению , данные решения не работают для меня, так как переменные могут быть чем - либо от
rgb
доhsl
доhex
или даже названий цветов.Я решил эту проблему сейчас, применив
background-color
иopacity
к псевдо:after
или:before
элементу:Стили, возможно, придется немного изменить, в зависимости от элемента, к которому следует применить фон.
Также это может не работать для всех ситуаций, но, надеюсь, это поможет в некоторых случаях, когда другие решения не могут быть использованы.
Изменить: Я только что заметил, что это решение, очевидно, также влияет на цвет текста, так как он создает элемент перед целевым элементом и применяет к нему прозрачный фоновый цвет.
Это может быть проблемой в некоторых случаях.
источник
rgb
илиHSL
), но также позволяет избежать любого конфликта между собственными цветовыми функциями CSS и цветовыми функциями Sass. Смотрите ответ SimplyPhy ниже.:before
чтобы вы получили правильный порядок стека, не играя сz-index
.Это действительно возможно с CSS . Это немного грязно, и вам придется использовать градиенты. В качестве примера я кодировал небольшой фрагмент, обратите внимание, что для темного фона следует использовать непрозрачность черного, как для светлого - белого.
источник
где вы заменяете непрозрачность между 0 и 1
источник
rgba(var(--color), opacity)
немного. Тем более что ваше значение пользовательского свойства - это полная запись rgb (). Но также из-за ключевого слова "непрозрачность".SCSS / SASS
Преимущество: вы можете просто использовать шестнадцатеричные значения цвета вместо 8-битного для каждого канала (0-255).
Вот как я сделал это с первоначальной идеей: https://codyhouse.co/blog/post/how-to-combine-sass-color-functions-and-css-variables
Изменить: Вы также можете изменить альфа-функцию, чтобы просто использовать
#{$color-name}-rgb
и пропустить сгенерированные CSS-переменные * -r, * -g, * -b.результат
Использование:
Mixin и функции
Надеюсь, это сэкономит кому-то время.
источник
Вы можете установить конкретную переменную / значение для каждого цвета - оригинал и непрозрачность:
Если вы не можете использовать это, и вы в порядке с решением javascript, вы можете использовать это:
источник
Для использования rgba () с общей переменной css, попробуйте это:
источник
В CSS вы можете использовать значения rgba:
или просто установите непрозрачность:
источник
Если вы любите шестнадцатеричные цвета, как я, есть другое решение. Шестнадцатеричное значение составляет 6 цифр, после чего это альфа-значение. 00 - 100% прозрачность 99 - около 75%, затем он использует алфавит «a1-af», затем «b1-bf», оканчивающийся на «ff», который на 100% непрозрачен.
источник