#javascript #webkit #css-variables
Вопрос:
В chrome / chromium я хотел бы перечислить все переменные CSS (имена и значения переменных), применяемые к элементу HTML. Следующий код работает в Firefox, но не поддерживается в браузерах webkit. Есть ли возможный обходной путь?
let style = getComputedStyle(document.body);
for (let i = 0; i < style.length; i ) {
let prop = style[i]
if(prop.includes("--")){
let val = style.getPropertyValue(prop)
document.body.innerHTML = "Works in Firefox but not in Chromium:<br>"
document.body.innerHTML = prop " " val
}
}
:root{
--c:lime;
}
body{
background:var(--c);
}
Комментарии:
1. github.com/w3c/csswg-drafts/issues/1316 может быть, это будет полезно?
2.
style.getPropertyValue('--c') // lime
работает в Chrome и Firefox.3. @evolutionxbox Поучительно, спасибо! И да,
getPropertyValue
работает, но в моем случае я не знаю имен переменных, мне нужно их восстановить.4. Как насчет css-tricks.com/… ?
5. @evolutionxbox, Которые действительно решают мою проблему! Спасибо. Я отвечу на свой пост.
Ответ №1:
Это решает проблему:
const isSameDomain = (styleSheet) => {
if (!styleSheet.href) {
return true;
}
return styleSheet.href.indexOf(window.location.origin) === 0;
};
const isStyleRule = (rule) => rule.type === 1;
const getCSSCustomPropIndex = () =>
[...document.styleSheets].filter(isSameDomain).reduce(
(finalArr, sheet) =>
finalArr.concat(
[...sheet.cssRules].filter(isStyleRule).reduce((propValArr, rule) => {
const props = [...rule.style]
.map((propName) => [
propName.trim(),
rule.style.getPropertyValue(propName).trim()
])
.filter(([propName]) => propName.indexOf("--") === 0);
return [...propValArr, ...props];
}, [])
),
[]
);
document.body.innerHTML = getCSSCustomPropIndex()
html {
--c: lime;
}
body {
background:var(--c);
}
Спасибо @evolutionxbox за указание решения.