Почему Vue3 выбрал переменные CSS
Vue 3
Добавлена экспериментальная функция -«Переменные CSS, управляемые состоянием компонента в одном файле»
Увидев это, у меня возникли следующие вопросы?
-
CSS
Что такое переменные? -
Sass/Less
Разве в нем нет определения переменной, зачем вам его использовать?CSS
Переменная? - Текущий
Vue
не через:style
способ определения динамической привязкиCSS
,ТотCSS
В чем разница между переменными и этим способом? -
Vue 3
что ты сделал,SFC
(Однофайловый компонент) можно лучше использоватьCSS
Переменная
Эти вопросы обсуждаются ниже
Основы CSS-переменных
Переменные CSS — это не продукт фреймворка, а стандартная спецификация, определенная автором CSS.
CSS
переменная, также известная какCSS
Пользовательское свойство, содержащее значения, которые можно повторно использовать в документе. Значения устанавливаются пользовательскими тегами атрибутов (например:--main-color: black;
),Зависит отvar()
функция для получения значения (например:color: var(--main-color);
)
Зачем выбирать две линии соединения (--
)Выражать? из-за переменной?
одеялоSass
использованный,@
одеялоLess
использованный. Чтобы не конфликтовать, официальнаяCSS
Вместо этого переменные используют две линии соединения.
CSS
Простой пример переменной выглядит следующим образом:Базовый демонстрационный адрес переменной CSS
<div class="parent">
I am Parent
<div class="child">
I am Child
</div>
</div>
.parent {
/* 变量的作用域就是它所在的选择器的有效范围,所以.parent 读取不到 child 中的变量 */
color: var(--body-child);
/* 定义变量 */
--parent-color: blue;
}
.child {
/* 通过 var 读取变量 */
color: var(--parent-color);
--child-color: green;
}
Отображение результатов
прямо сейчас мы.parent
определить переменные в--parent-color: blue;
,существует.child
используется вcolor: var(--parent-color);
Следует отметить, что областью действия переменной является допустимая область действия селектора, в котором она находится, например.child
определено в--child-color: green;
, существует.parent
нечитаемо, только для.child
Элементы под элементом действительны
Если вы хотите иметь доступ к нему в документе HTML, вы можете определить его в классе:root
середина
В дополнение к основному использованию, есть следующие моменты, на которые следует обратить внимание.
-
CSS
Имена переменных чувствительны к регистру, т.е.--myColor
и--mycolor
разные -
var()
Параметр может использовать второй параметр для установки значения по умолчанию, когда переменная недействительна, будет использоваться значение по умолчанию. -
Переменные CSS позволяют JavaScript взаимодействовать с CSS.,существует
JS
мы можем работатьCSS
, при нормальной работеCSS
свойства такие же
// 获取一个 Dom 节点上的 CSS 变量
element.style.getPropertyValue("--my-var");
// 获取任意 Dom 节点上的 CSS 变量
getComputedStyle(element).getPropertyValue("--my-var");
// 修改一个 Dom 节点上的 CSS 变量
element.style.setProperty("--my-var", jsVar + 4);
Здесь продемонстрировано самое простое использование, вы можете проверить деталиMDNДокументация
Использование переменных CSS в Vue 2
сказал выше,CSS
Переменные — это не продукт фреймворка, а нативныйCSS
стандартная спецификация. затем вVue 2
использовать непосредственно вCSS
Переменные определенно в порядке, и нет никаких ограничений.
Ключ в том, как мы делаемVue
Состояние в компоненте синхронизируется сCSS
В переменной это на самом деле очень просто, черезStyle 绑定
Вот и все.Демонстрационный адрес Vue 2
<template>
<!-- 如果要该组件都可以使用,则必须放置在根元素下 -->
<div class="hello" :style="styleVar">
<div class="child-1">I am Child 1</div>
<div class="child-2">I am Child 2</div>
<div @click="onClick">Change Red TO Blue</div>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String,
},
data() {
return {
styleVar: {
"--colorBlue": "blue",
"--colorRed": "red",
"--fontSize": "30px",
"--fontSizeTest": "30px",
},
};
},
methods: {
onClick() {
this.styleVar["--fontSizeTest"] = "40px";
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.child-1 {
color: var(--colorBlue);
font-size: var(--fontSize);
}
.child-2 {
color: var(--colorRed);
font-size: var(--fontSizeTest);
}
</style>
результат:
Нам просто нужно установить в корневом элементе компонента:style="styleVar"
(Если вы хотите, чтобы этот компонент был доступен, его необходимо разместить под корневым элементом), вы можете использовать его вVue 2.x
реализует состояние в компоненте иCSS
Привязка значения, и это отношение привязки является чувствительным, например, я определяю метод для измененияfont-size
Значение , может обновляться в режиме реального времени.
onClick() {
this.styleVar["--fontSizeTest"] = "40px";
},
Демонстрация эффекта:
:style против переменных CSS
Здесь есть проблема, существующаяVue
в состоянии пройти:style
способ определения динамической привязкиCSS
, например, я могу прямо написать выше.child-1
Следующий переплет делается посередине, и эффект такой же, как и выше.
<div class="child-1" :style="{ color: 'blue', fontSize: '30px' }">
I am Child 1
</div>
Тогда почему я должен использоватьCSS
Переменная? Есть ли смысл тратить столько хлопот?
Делаю вывод по двум причинам:
Причина первая:
Сложные веб-сайты будут иметь большое количествоCSS
код, часто со многими повторяющимися значениями. Когда состояние в компоненте используется в десятках мест, вам может понадобиться привязать много:style
. Во-первых, код будет казаться менее читаемым, а во-вторых, производительность должна быть хуже нативной, ведь изменения должны бытьVue
Директива привязана к каждому элементу (это еще не проверено)
пройти черезCSS
переменная, вы можете напрямую установить переменную в корневом элементе компонента, внутри компонента<style>
можно использовать непосредственно в
Причина 2: использование псевдоэлементов
Если вы используете его напрямую:style
Мы не можем стилизовать псевдоэлементы, иCSS
переменные могут
p::first-line {
color: var(--theme-secondary-color);
}
Использование переменных CSS в Vue 3
Несмотря на то чтоVue 2.x
можно использовать вCSS
переменная, но ее нужно передать с помощью привязки стиля, что выглядит не так элегантно, поэтомуVue 3
сделал некоторые оптимизации в
Добавлена привязка vars
<template>
<div class="text">hello</div>
</template>
<script>
export default {
data() {
return {
color: "red",
};
},
};
</script>
<style vars="{ color }">
.text {
color: var(--color);
}
</style>
существуетVue 3
серединаSFC
середина,style
Поддержка этикетокvars
Привязка, этот параметр принимает вставку пары ключ-значение объекта.CSS
переменные, как показано выше<style vars="{ color }">
. Вы можете увидеть эффектДемонстрационный адрес Vue 3
Эти переменные будут напрямую привязаны к корневому элементу компонента.В приведенном выше примере окончательный результат рендеринга выглядит следующим образом:
<div style="--color:red" class="text">hello</div>
Используйте с
когдаvars
и<style scoped>
При совместном использовании применяетсяCSS
Переменная будет начинаться с компонентаScoped id
В качестве префикса он также будет автоматически добавлен при доступеScoped id
Например, мы пишем так:
<style scoped vars="{ color }">
h1 {
color: var(--color);
}
</style>
После компиляции становится
h1 {
color: var(--6b53742-color);
}
Если мы хотим получить доступ к глобальному в этом случаеCSS
А переменные? То есть мы не хотим добавлятьScoped Id
, то напишите что-то вроде этого:
<style scoped vars="{ color }">
h1 {
color: var(--color);
font-size: var(--global:fontSize);
}
</style>
Это скомпилируется до следующего результата:
h1 {
color: var(--6b53742-color);
font-size: var(--fontSize);
}
Переменные VS CSS-переменные в Less/Sass
Я понимаю, что самый важный момент заключается в том, чтоCSS
после переменной может следоватьJavaScript
улучшенная коммуникация, эквивалентнаяCSS
иJavaScript
мост. существуетVue
Это до сих пор видно в
Также посмотрите пример переключения тем, если мы используемSass
переменные следующим образом:
$color-primary: blue;
$color-text: black;
$color-bg: white;
/* invert */
$color-primary-invert: red;
$color-text-invert: white;
$color-bg-invert: black;
.component {
color: $color-text;
background-color: $color-bg;
a {
color: $color-primary;
}
}
.component--dark {
color: $color-text-invert;
background-color: $color-bg-invert;
a {
color: $color-primary-invert;
}
}
У нас есть две темы, обычная тема и темная тема (dark
).Обратите внимание, что в темном режиме нам нужна новая переменная цвета, чтобы обновить старую переменную цвета.. Если этот параметр очень большой, мы будем очень огорчены.
СмотретьCSS
Если установлена переменная
:root, [data-theme="default"] {
--color-primary: blue;
/* color contrasts */
--color-bg: white;
--color-contrast-lower: hsl(0, 0%, 95%);
--color-contrast-low: hsl(240, 1%, 83%);
--color-contrast-medium: hsl(240, 1%, 48%);
--color-contrast-high: hsl(240, 4%, 20%);
--color-contrast-higher: black;
}
[data-theme] {
background-color: var(--color-bg);
color: var(--color-contrast-high);
}
[data-theme="dark"] {
--color-primary: red;
/* color contrasts */
--color-bg: black;
--color-contrast-lower: hsl(240, 6%, 15%);
--color-contrast-low: hsl(252, 4%, 25%);
--color-contrast-medium: hsl(240, 1%, 57%);
--color-contrast-high: hsl(0, 0%, 89%);
--color-contrast-higher: white;
}
В этом случае нам не нужно определять дополнительную переменную цвета, потому что нам просто нужно установить переменную CSS в правильное значение.
Причина вышеуказанных различий в использовании,Я понимаю, что переменные SASS находятся во время компиляции, что означает, что препроцессор анализируется перед выводом в браузер, а анализ браузером переменных CSS выполняется во время выполнения.
Кроме того, препроцессор иCSS
Переменные не конфликтуют, их комбинация может лучше улучшить наш открытый опыт.
Минусы - проблемы с совместимостью браузера
CSS
Текущая поддержка переменных не особенно хороша,IE
В настоящее время все они не поддерживаются, но, как упоминалось выше, я все еще оптимистично смотрю на его будущее.
Чтобы разобраться с его совместимостью, мы также можем написать следующее:
a {
color: #7F583F;
color: var(--primary);
}
Суммировать
Наконец, резюмируем несколько вопросов, поднятых в начале статьи:
-
CSS
Что такое переменные?-
CSS
переменная, также известная какCSS
Настраиваемое свойство, содержащее значение, которое можно повторно использовать в документе.
-
-
Текущий
Vue
не через:style
способ определения динамической привязкиCSS
,ТотCSS
В чем разница между переменной и этим?- Сложные веб-сайты будут иметь большое количество
CSS
код, часто со многими повторяющимися значениями - Использование псевдоэлементов
- Сложные веб-сайты будут иметь большое количество
-
Vue 3
что ты сделал,SFC
(Однофайловый компонент) можно лучше использоватьCSS
Переменная- новый
vars
связывать - и
<style scoped>
Используется вместе для расширения возможностей области видимости
- новый
-
Sass/Less
Разве в нем нет определения переменной, зачем его использовать?CSS
Переменная?-
CSS
после переменной может следоватьJavaScript
улучшенная коммуникация, эквивалентнаяCSS
иJavaScript
мост - Переменные SASS — это время компиляции, переменные CSS — это время выполнения
-