#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. О, очень жаль. Он был удален или закрыт? Потому что вы должны отредактировать вопрос, чтобы было более ясно, что это не ответ на ваш вопрос. Со мной иногда случается, и мне нужно уточнить, почему мой вопрос отличается.