Использование attr для установки встроенных переменных css, которые работают с CSP

#css #content-security-policy #css-variables

#css #content-security-policy #css-переменные

Вопрос:

Я думал, как я могу использовать переменные css без использования встроенных стилей. Я подумал, что могу использовать это:

 [data-color] {
    --color: attr(data-color color, green);
}
* {
    color: var(--color, blue);
}  
 <div data-color="red">hello</div>  

Кажется, что attr работает только в псевдоселекторах (и, вероятно, только для content: свойства), но страница MDN attr гласит:

Функция attr() CSS используется для извлечения значения атрибута выбранного элемента и использования его в таблице стилей. Его также можно использовать для псевдоэлементов, и в этом случае возвращается значение атрибута исходного элемента псевдоэлемента.

Есть даже демо, но оно не работает в Chrome на Linux, так что для меня это бесполезно. Это даже не работает в Firefox на Linux.

Есть ли какой-либо другой способ использовать переменные css без встроенных стилей и без записи dynamic <style></style> и nonce?

Ответ №1:

Пока нет. По той же ссылке вы можете прочитать:

Примечание: Функция attr() может использоваться с любым свойством CSS, но поддержка свойств, отличных от содержимого, является экспериментальной, а поддержка параметра типа или единицы измерения является редкой.

По-прежнему ни один браузер не поддерживает свойства attr() for, отличные от content, а также не поддерживает type-or-unit .

Стоит отметить, что вы можете использовать attr() внутри переменной CSS, но ее нужно использовать позже с контентом. Переменные CSS — это только промежуточное звено, поэтому мы оцениваем поддержку не на основе переменной, а на основе свойства, которое будет использовать переменную.

 [data-color] {
  --color: attr(data-color);
}

*::before {
  content: var(--color, "default");
  color:blue;
}  
 <div data-color="red">hello</div>  

Комментарии:

1. Спасибо, вероятно, просто content: var(attr(data-color), "default"); attr не расширяется внутри --color: и используется непосредственно как строка в содержимом внутри var.

Ответ №2:

Интересное использование свойства CSS attr, но, как указано в вопросе, поддержка его за пределами свойства псевдоэлемента скудна, см., Например https://developer.mozilla.org/en-US/docs/Web/CSS/attr

На самом деле это немного хуже, потому что, если у вас есть:

 * {
    color: var(--color, blue);
}
[data-color] {
    --color: green;
    --color: attr(data-color);
}  
 <div data-color="red">hello</div>  

аналогично вопросу, но выделено более явно. Предупреждение --color: attr(data-color) не помечается и игнорируется, а используется зеленый. Вместо этого принимается и —color устанавливается в строку. Это как если бы браузер вроде как распознал attr и что он должен что-то с ним делать, но на самом деле не делает этого полностью.

Ответ №3:

Для всех, кто все еще хочет управлять переменными CSS в HTML, вы можете сделать это так:

 * {
    color: var(--color, blue);
}  
 <div style="--color: red">hello</div>
<div>hello</div>  

Комментарии:

1. вы прочитали вопрос? Is there any other way to use css variables without inline styles and without writing dynamic <style></style> and nonce? Мне это нужно, потому что CSP, который должен проверять каждый CSS.

2. Мой плохой, не видел эту часть

3. Подсказка заключается в заголовке that work with CSP inline style, который требуется для создания допустимого одноразового номера, я хотел избежать этого.

4. Извините:/ Я создаю вопрос, потому что хотел обрабатывать CSS var из HTML, и мой вопрос был удален, потому что похож на ваш (даже если я уже прочитал его и не нашел то, что искал). И после этого я нашел этот трюк… Поэтому я хотел поделиться этим со всеми (если кому-то это понадобится в будущем). Извините, если это не работает для вашего случая :/

5. О, очень жаль. Он был удален или закрыт? Потому что вы должны отредактировать вопрос, чтобы было более ясно, что это не ответ на ваш вопрос. Со мной иногда случается, и мне нужно уточнить, почему мой вопрос отличается.