# 单文件组件样式特性
# <style scoped>
当 <style>
标签带有 scoped
attribute 的时候,它的 CSS 只会应用到当前组件的元素上。
<style scoped>
.example {
color: red;
}
</style>
1
2
3
4
5
2
3
4
5
转换为:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
vue 通过 data-v-f3f3eg9 属性寻找到匹配的样式
# 深度选择器
处于 scoped
样式中的选择器如果想要做更“深度”的选择,也即:影响到子组件,可以使用 :deep()
这个伪类(旧时为 /deep/
):
<style scoped>
.a :deep(.b) {
/* ... */
}
</style>
1
2
3
4
5
2
3
4
5
上面的代码会被编译成:
.a[data-v-f3f3eg9] .b {
/* ... */
}
1
2
3
2
3
# 插槽选择器
默认情况下,作用域样式不会影响到 <slot/>
渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。使用 :slotted
伪类以确切地将插槽内容作为选择器的目标:
<template>
<div>
<slot></slot>
</div>
</template>
<style scoped>
:slotted(div) {
color: red;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 全局选择器
如果想让其中一个样式规则应用到全局,比起另外创建一个 <style>
,可以使用 :global
伪类来实现 (看下面的代码):
<style scoped>
:global(.red) {
color: red;
}
</style>
1
2
3
4
5
2
3
4
5
# <style module>
<style module>
标签会被编译为 CSS Modules 并且将生成的 CSS 类作为 $style
对象的键暴露给组件:
<template>
<p :class="$style.red">
This should be red
</p>
</template>
<style module>
.red {
color: red;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
对生成的类做 hash 计算以避免冲突,实现了和 scope CSS 一样将 CSS 仅作用于当前组件的效果。
# 自定义注入名称
也可以通过给 module
attribute 一个值来自定义注入的类对象的 property 键:
<template>
<p :class="classes.red">red</p>
</template>
<style module="classes">
.red {
color: red;
}
</style>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 动态 CSS :V-bind
单文件组件的 <style>
标签可以通过 v-bind
这一 CSS 函数将 CSS 的值关联到动态的组件状态上:
<template>
<div class="text">hello</div>
</template>
<script>
export default {
data() {
return {
color: 'red'
}
}
}
</script>
<style>
.text {
/*注意:当使用<script setup>时, v-bind('color') 中的属性需要括起来*/
color: v-bind(color);
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20