Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.01.2021, 22:33
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Получить переменную CSS из таблицы стилей.
Возникла такая проблема.
Есть таблица стилей. Нет (пока, не созданы еще) элементов, к которым эти стили применяются. В стилях есть переменные css.
Можно ли как-нибудь получить значения переменных (исключая разбор текста правил вручную).

Пример того, что имеется в виду
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
  <meta name="viewport" content="width=device-width, initial-scale=1.0" >
  
<style id=stv>
#el{
	width: 100px;
	height: 50vh;
}
.cl {
	width: 300px;
	height: 100em;
	color: rgb(255,220,220);
	--var1: 100px;
}
</style>

 </head>
 <body>
<script>
let getStyle = (st, sel, name) => {
	const rules = st.sheet.cssRules
	for (let i=0; i<rules.length; i++) {
		if (sel == rules[i].selectorText) {
			return rules[i].style[name]
		}
	}
}

let st = document.getElementById('stv')

console.log('#el', 'width:',  getStyle(st, '#el', 'width')) //  100px 
console.log('.cl', 'color:',  getStyle(st, '.cl', 'color'))  //  rgb(255,220,220)
console.log('.cl', '--var1:',  getStyle(st, '.cl', '--var1')) //  undefined ???
</script>
</body>
</html>


Значение свойств типа 'width', 'color' получить просто
Вот как бы получить значение --var1?
Ответить с цитированием
  #2 (permalink)  
Старый 12.01.2021, 23:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от voraa
исключая разбор текста правил вручную

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" >
<style id=stv>
#el{
    width: 100px;
    height: 50vh;
}
.cl {
    width: 300px;
    height: 100em;
    color: rgb(255,220,220);
    --var1: 100px;
}
</style>
 </head>
 <body>
<script>
let getStyle = (st, sel, name) => {
    const rules = st.sheet.cssRules
    for (let i=0; i<rules.length; i++) {
        if (sel == rules[i].selectorText) {
            const reg = new RegExp(`(?<=${name}:\\s+)([^;]+)`);
            return rules[i].cssText.match(reg)[0]
        }
    }
}
let st = document.getElementById('stv')
console.log('#el', 'width:',  getStyle(st, '#el', 'width')) //  100px
console.log('.cl', 'color:',  getStyle(st, '.cl', 'color'))  //  rgb(255,220,220)
console.log('.cl', '--var1:',  getStyle(st, '.cl', '--var1')) //  undefined ???
</script>
</body>
</html>

Последний раз редактировалось рони, 12.01.2021 в 23:23.
Ответить с цитированием
  #3 (permalink)  
Старый 13.01.2021, 07:25
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,709

Проблема решена.
Про то, как делать правильно я даже не вспомнил. Наверно из-за хронической лени
Так все работает
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
  <meta name="viewport" content="width=device-width, initial-scale=1.0" >
   
<style id=stv>
#el{
    width: 100px;
    height: 50vh;
}
.cl {
    width: 300px;
    height: 100em;
    color: rgb(255,220,220);
    --var1: 100px;
}
</style>
 
 </head>
 <body>
<script>
let getStyle = (st, sel, name) => {
    const rules = st.sheet.cssRules
    for (let i=0; i<rules.length; i++) {
        if (sel == rules[i].selectorText) {
            return rules[i].style.getPropertyValue(name)
        }
    }
}
 
let st = document.getElementById('stv')
 
console.log('#el', 'width:',  getStyle(st, '#el', 'width')) //  100px
console.log('.cl', 'color:',  getStyle(st, '.cl', 'color'))  //  rgb(255,220,220)
console.log('.cl', '--var1:',  getStyle(st, '.cl', '--var1')) //  100px !!!
</script>
</body>
</html>


style[name] - дает только обычные свойства
getPropertyValue(name) дает все, и обычные и переменные.
Но лишних 15 знаков написать - это тяжко бывает.

Последний раз редактировалось voraa, 13.01.2021 в 07:30.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получить сумму последнего столбца таблицы Юсуф Events/DOM/Window 9 27.04.2020 22:08
Получить значение в переменную MC-XOBAHCK Общие вопросы Javascript 8 26.09.2017 14:19
Получить значение CSS sanhai Events/DOM/Window 6 12.06.2010 12:32
Как получить атрибут из CSS файла ? sionus Events/DOM/Window 1 04.01.2010 09:39
Не могу получить высоту из css asci Общие вопросы Javascript 5 30.03.2009 13:31