Есть ли способ интерполировать CSS-переменные с помощью url()?

Я хочу хранить свои фоновые URL-адреса в пользовательских свойствах (переменные CSS) и использовать их со свойством background. Тем не менее, я не мог найти способ интерполировать строку при использовании ее в качестве параметра в url(),

Вот мой пример кода:

:root {
    --url: "https://download.unsplash.com/photo-1420708392410-3c593b80d416";
}

body {
    background: url(var(--url));
}

Я знаю, что это легко сделать в Sass или LESS, используя функцию интерполяции, но мне интересно, есть ли способ сделать это без какого-либо препроцессора.

4 ответа

Вы можете выполнить интерполяцию с большинством функций CSS, в том числе rgba() (см. пример здесь). Фактически, интерполяция является одной из основных особенностей пользовательских свойств.

Но вы не можете сделать это с url(), как url(var(--url)) анализируется не как url( маркер функции с последующим var(--url) с последующим ), но один url() токен, который является недействительным, потому что var(--url) обрабатывается как сам URL, а URL без кавычек в url() токены не могут содержать скобок, если они не экранированы. Это означает, что замена никогда не происходит, потому что парсер никогда не видит var() выражения в значении свойства - действительно, ваш background декларация полностью недействительна.

Если вы ничего не поняли, это нормально. Просто знайте, что вы не можете использовать var() интерполяция с url() по наследственным причинам.

Хотя проблема, описанная в вопросе, связана с наследием url() токен, вы не можете сделать это, создав URL-токены из нескольких var() Выражения либо, в случае, если вы хотели попробовать что-то вроде --uo: url(; --uc: ); или же --uo: url("; --uc: ");, а также background: var(--uo) var(--url) var(--uc);, Это связано с тем, что пользовательские свойства не могут содержать несоответствующие разделители строк или части url() токены (называемые неверными URL-токенами).

Если вы хотите указать URL-адрес в пользовательском свойстве, вам нужно выписать весь url() выражение, и заменить это все выражение:

:root {
  --url: url("https://download.unsplash.com/photo-1420708392410-3c593b80d416");
}

body {
  background: var(--url);
}

Или используйте JavaScript вместо var() выполнить интерполяцию.

Вы не можете интерполировать переменные css с URL-адресом, но вы можете реализовать функцию URL-адреса как часть вашей переменной следующим образом:

      :root {
    --url: url("https://download.unsplash.com/photo-1420708392410-3c593b80d416");
}

body {
    background: var(--url);
}

в HTML может быть:

      <div class="css_class_setting_background" style=" --url: url("https://download.unsplash.com/photo-1420708392410-3c593b80d416");"> </div>

Это работает в большинстве современных браузеров.

вот решение, которое работает в vue3

      <script setup>
const backImage = ref("url(/img/imImage.webp)")
</script>

<style>
div {
  background-image: v-bind(backImage );
}
</style>

У меня была та же проблема в проекте с Cordova, поэтому я использовал:

```
header{
  --bg-header: url(../img/header_home.png) left center/cover no-repeat;
  background: var(--bg-header,
      url("../img/header_home.png") left center/cover no-repeat
  );
}
```

Соответственно, если вы используете url("") с двойными кавычками в объявлении --var, значение не будет работать.

Другие вопросы по тегам