CSS Vue 中使用的变量
CSS variables use in Vue
是否可以在 Vue 中使用纯 CSS 变量而无需 link 任何样式表或使用 SASS/PostCSS?不确定为什么我无法让它以最基本的形式工作。
<template>
<div id="test">
TEST
</div>
</template>
<style scoped>
:root {
--var-txt-color: #c1d32f;
}
#test {
color: var(--var-txt-color);
}
</style>
由于样式表的 scoped
属性,这将无法按预期工作。上面的例子编译成:
[data-v-4cc5a608]:root {
--var-txt-color: #f00;
}
而且,如您所知,它不会针对实际的 :root
元素。
可以通过以下方式解决:
未使用此样式表的 scoped
属性。请注意,它可能会导致样式与 :root
元素的其他变量声明发生冲突。
使用当前组件的包装元素作为根。如果我们这样声明变量:
.test {
--var-txt-color: #c1d32f;
color: var(--var-txt-color);
}
.test-child-node {
background-color: var(--var-txt-color);
}
然后它将可以为同一组件的其他元素重用变量。但是,如果是这种情况,则在不删除 scoped
的情况下无法在子组件中使用声明的变量。
我知道你强调了 "without having to link any stylesheet",但我 运行 遇到了同样的问题,有一个简单的选择 - 只使用一个外部 css 文件并将其包含在你的 App.vue,那么您就可以在其他任何地方访问变量,也可以使用范围样式。
variables.css
:root {
--font-family: "Roboto", "Helvetica", "Arial", sans-serif;
--primary-color: #333a4b;
}
App.vue
<style>
@import './assets/styles/variables.css';
</style>
LandingView.vue
<style scoped>
#landing-view {
font-family: var(--font-family);
font-weight: 300;
line-height: 1.5em;
color: var(--primary-color);
}
</style>
为什么不直接使用这个?
<style scoped>
* {
--var-txt-color: #c1d32f;
}
</style>
生成的CSS为:
*[data-v-d235d782] {
--var-txt-color: #c1d32f;
}
这对我有用。
我刚刚发现它看起来也有效,使用“deep selector”
>>> {
--var-txt-color: #c1d32f;
}
生成的 CSS 是:
[data-v-d235d782] {
--var-txt-color: #c1d32f;
}
我觉得我更喜欢这个方法
一种解决方法是在非作用域 style
元素下定义它们,如下所示。但是这里要注意的一件事是,这些变量也会暴露给其他 Vue
组件。
<style>
:root {
--var-txt-color: #c1d32f;
}
</style>
<style scoped>
#test {
color: var(--var-txt-color);
}
</style>
好了,现在你可以使用CSS变量注入了。
<template>
<div>
<div class="text">hello</div>
</div>
</template>
<script>
export default {
data() {
return {
color: 'red',
font: {
weight: '800'
}
}
}
}
</script>
<style>
.text {
color: v-bind(color);
font-weight: v-bind('font.weight');
}
</style>
这些样式也是响应式和作用域化的。不会有任何意外的继承问题。 Vue 为您管理 CSS 变量。
你可以看看 RFC here。
迟到的答案 - 这是一个使用 css 从标准 vue 结构派生的变量的工作示例。
<template>
<div>
<component :is="'style'">
:root {
--color: {{ color }};
--text-decoration: {{ textDecoration }};
--font-size: {{ fontSize }};
}
</component>
<p>example</p>
</div>
</template>
<script>
export default {
props:{
color: {
type: String,
default: '#990000'
}
},
data: function () {
return {
textDecoration: 'underline'
}
},
computed: {
fontSize: function (){
return Math.round(Math.random() * (5 - 1) + 1) + 'em';
}
}
}
</script>
<style>
p{
color: var(--color);
text-decoration: var(--text-decoration);
font-size: var(--font-size);
}
</style>
从头开始...
- Vue 必须有 1 个根元素,所以我需要一个 div 标签来包含示例 p 标签。但是,您可以只使用 component-is-style 标签并去掉 div 和 p 标签。注意需要额外的引号 "'style'".
- 正常的 vue 样式标签可以根据需要确定范围或不确定范围。
是否可以在 Vue 中使用纯 CSS 变量而无需 link 任何样式表或使用 SASS/PostCSS?不确定为什么我无法让它以最基本的形式工作。
<template>
<div id="test">
TEST
</div>
</template>
<style scoped>
:root {
--var-txt-color: #c1d32f;
}
#test {
color: var(--var-txt-color);
}
</style>
由于样式表的 scoped
属性,这将无法按预期工作。上面的例子编译成:
[data-v-4cc5a608]:root {
--var-txt-color: #f00;
}
而且,如您所知,它不会针对实际的 :root
元素。
可以通过以下方式解决:
未使用此样式表的
scoped
属性。请注意,它可能会导致样式与:root
元素的其他变量声明发生冲突。使用当前组件的包装元素作为根。如果我们这样声明变量:
.test { --var-txt-color: #c1d32f; color: var(--var-txt-color); } .test-child-node { background-color: var(--var-txt-color); }
然后它将可以为同一组件的其他元素重用变量。但是,如果是这种情况,则在不删除 scoped
的情况下无法在子组件中使用声明的变量。
我知道你强调了 "without having to link any stylesheet",但我 运行 遇到了同样的问题,有一个简单的选择 - 只使用一个外部 css 文件并将其包含在你的 App.vue,那么您就可以在其他任何地方访问变量,也可以使用范围样式。
variables.css
:root {
--font-family: "Roboto", "Helvetica", "Arial", sans-serif;
--primary-color: #333a4b;
}
App.vue
<style>
@import './assets/styles/variables.css';
</style>
LandingView.vue
<style scoped>
#landing-view {
font-family: var(--font-family);
font-weight: 300;
line-height: 1.5em;
color: var(--primary-color);
}
</style>
为什么不直接使用这个?
<style scoped>
* {
--var-txt-color: #c1d32f;
}
</style>
生成的CSS为:
*[data-v-d235d782] {
--var-txt-color: #c1d32f;
}
这对我有用。
我刚刚发现它看起来也有效,使用“deep selector”
>>> {
--var-txt-color: #c1d32f;
}
生成的 CSS 是:
[data-v-d235d782] {
--var-txt-color: #c1d32f;
}
我觉得我更喜欢这个方法
一种解决方法是在非作用域 style
元素下定义它们,如下所示。但是这里要注意的一件事是,这些变量也会暴露给其他 Vue
组件。
<style>
:root {
--var-txt-color: #c1d32f;
}
</style>
<style scoped>
#test {
color: var(--var-txt-color);
}
</style>
好了,现在你可以使用CSS变量注入了。
<template>
<div>
<div class="text">hello</div>
</div>
</template>
<script>
export default {
data() {
return {
color: 'red',
font: {
weight: '800'
}
}
}
}
</script>
<style>
.text {
color: v-bind(color);
font-weight: v-bind('font.weight');
}
</style>
这些样式也是响应式和作用域化的。不会有任何意外的继承问题。 Vue 为您管理 CSS 变量。
你可以看看 RFC here。
迟到的答案 - 这是一个使用 css 从标准 vue 结构派生的变量的工作示例。
<template>
<div>
<component :is="'style'">
:root {
--color: {{ color }};
--text-decoration: {{ textDecoration }};
--font-size: {{ fontSize }};
}
</component>
<p>example</p>
</div>
</template>
<script>
export default {
props:{
color: {
type: String,
default: '#990000'
}
},
data: function () {
return {
textDecoration: 'underline'
}
},
computed: {
fontSize: function (){
return Math.round(Math.random() * (5 - 1) + 1) + 'em';
}
}
}
</script>
<style>
p{
color: var(--color);
text-decoration: var(--text-decoration);
font-size: var(--font-size);
}
</style>
从头开始...
- Vue 必须有 1 个根元素,所以我需要一个 div 标签来包含示例 p 标签。但是,您可以只使用 component-is-style 标签并去掉 div 和 p 标签。注意需要额外的引号 "'style'".
- 正常的 vue 样式标签可以根据需要确定范围或不确定范围。