SFC CSS Features â
Scoped CSS â
āϝāĻāύ āĻāĻāĻāĻŋ <style>
āĻā§āϝāĻžāĻā§ scoped
āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻĨāĻžāĻā§, āϤāĻāύ āĻāϰ CSS āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻāϞāĻŋāĻŽā§āύā§āĻāĻā§āϞāĻŋāϤ⧠āĻĒā§āϰāϝā§āĻā§āϝ āĻšāĻŦā§āĨ¤ āĻāĻāĻŋ āĻļā§āϝāĻžāĻĄā§ āĻĄā§āĻŽā§ āĻĒāĻžāĻāϝāĻŧāĻž āϏā§āĻāĻžāĻāϞ āĻāύāĻā§āϝāĻžāĻĒāϏā§āϞā§āĻļāύā§āϰ āĻ
āύā§āϰā§āĻĒāĨ¤ āĻāĻāĻŋ āĻāĻŋāĻā§ āϏāϤāϰā§āĻāϤāĻžāϰ āϏāĻžāĻĨā§ āĻāϏā§, āĻāĻŋāύā§āϤ⧠āĻā§āύ⧠āĻĒāϞāĻŋāĻĢāĻŋāϞā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧ āύāĻžāĨ¤ āĻāĻāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāϤ⧠PostCSS āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ
āϰā§āĻāύ āĻāϰāĻž āĻšāϝāĻŧ:
vue
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŽāϧā§āϝā§:
vue
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
Child Component Root Elements â
scoped
āĻāϰ āϏāĻžāĻĨā§, āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϏā§āĻāĻžāĻāϞ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āϞāĻŋāĻ āĻšāĻŦā§ āύāĻžāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻāĻāĻŋ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϰā§āĻ āύā§āĻĄ āĻĒā§āϝāĻžāϰā§āύā§āĻāϏ āϏā§āĻā§āĻĒāĻĄ CSS āĻāĻŦāĻ āĻāĻžāĻāϞā§āĻĄ āϏā§āĻā§āĻĒāĻĄ CSS āĻāĻāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž āĻā§āϝāĻĢā§āĻā§āĻā§āĻĄ āĻšāĻŦā§āĨ¤ āĻāĻāĻŋ āĻĄāĻŋāĻāĻžāĻāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϝāĻžāϤ⧠āĻĒā§āϝāĻžāϰā§āύā§āĻ āϞā§āĻāĻāĻā§āϰ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻāĻžāĻāϞā§āĻĄ āϰā§āĻ āĻāϞāĻŋāĻŽā§āύā§āĻāĻāĻŋāĻā§ āϏā§āĻāĻžāĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
Deep Selectors â
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ scoped
style-āĻ āĻāĻāĻāĻŋ āϏāĻŋāϞā§āĻā§āĻāϰāĻā§ "deep" āĻšāϤ⧠āĻāĻžāύ, āĻ
āϰā§āĻĨāĻžā§ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰā§, āĻāĻĒāύāĻŋ :deep()
pseudo-class āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<style scoped>
.a :deep(.b) {
/* ... */
}
</style>
āĻāĻĒāϰ⧠āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāĻŦā§:
css
.a[data-v-f3f3eg9] .b {
/* ... */
}
TIP
v-html
āĻĻāĻŋāϝāĻŧā§ āϤā§āϰāĻŋ DOM āĻāύā§āĻā§āύā§āĻ āϏā§āĻā§āĻĒāĻĄ āϏā§āĻāĻžāĻāϞ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻšāϝāĻŧ āύāĻž, āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻāĻāύāĻ āĻĄā§āĻĒ āϏāĻŋāϞā§āĻā§āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤāĻžāĻĻā§āϰ āϏā§āĻāĻžāĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
Slotted Selectors â
āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§, āϏā§āĻā§āĻĒāĻĄ āϏā§āĻāĻžāĻāϞāĻā§āϞāĻŋ <slot/>
āĻĻā§āĻŦāĻžāϰāĻž āϰā§āύā§āĻĄāĻžāϰ āĻāϰāĻž āĻāύā§āĻā§āύā§āĻāĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰ⧠āύāĻž, āĻāĻžāϰāĻŖ āϏā§āĻā§āϞāĻŋāĻā§ āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻŽāĻžāϞāĻŋāĻāĻžāύāĻžāϧā§āύ āĻŦāϞ⧠āĻŽāύ⧠āĻāϰāĻž āĻšāϝāĻŧāĨ¤
vue
<style scoped>
:slotted(div) {
color: red;
}
</style>
Global Selectors â
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻā§āϞā§āĻŦāĻžāϞāĻŋ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāϤ⧠āĻāĻžāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϝāĻŧāĻŽ, āĻāĻĒāύāĻŋ āĻ
āύā§āϝ <style>
āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠:global
pseudo-class āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ (āύā§āĻā§ āĻĻā§āĻā§āύ):
vue
<style scoped>
:global(.red) {
color: red;
}
</style>
Mixing Local and Global Styles â
āĻāĻĒāύāĻŋ āĻāĻāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āϏā§āĻā§āĻĒāĻĄ āĻāĻŦāĻ āύāύ-āϏā§āĻā§āĻĒāĻĄ āϏā§āĻāĻžāĻāϞ āĻāĻāϝāĻŧāĻ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<style>
/* global styles */
</style>
<style scoped>
/* local styles */
</style>
Scoped Style Tips â
āϏā§āĻā§āĻĒāĻĄ āϏā§āĻāĻžāĻāϞ āĻā§āϞāĻžāϏā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻĻā§āϰ āĻāϰ⧠āύāĻžāĨ¤ āĻŦā§āϰāĻžāĻāĻāĻžāϰāĻā§āϞāĻŋ āϝā§āĻāĻžāĻŦā§ āĻŦāĻŋāĻāĻŋāύā§āύ CSS āϏāĻŋāϞā§āĻā§āĻāϰāĻā§ āϰā§āύā§āĻĄāĻžāϰ āĻāϰ⧠āϤāĻžāϰ āĻāĻžāϰāĻŖā§,
p { color: red }
āϏā§āĻā§āĻĒ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ āύā§āĻāĻā§āĻŖ āϧā§āϰ āĻšāĻŦā§ (āĻ āϰā§āĻĨāĻžā§ āϝāĻāύ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āϏāĻŋāϞā§āĻā§āĻāϰā§āϰ āϏāĻžāĻĨā§ āĻŽāĻŋāϞāĻŋāϤ āĻšāϝāĻŧ)āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻā§āϞāĻžāϏ āĻŦāĻž āĻāĻāĻĄāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϝā§āĻŽāύ.example { color: red }
, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āĻāĻžāϰā§āĻā§ā§āĻžāϞāĻŋ āϏā§āĻ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ āĻšāĻŋāĻāĻāĻŋ āĻŽā§āĻā§ āĻĢā§āϞāĻŦā§āύāĨ¤āϰāĻŋāĻāĻžāϰā§āϏāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻĄāĻŋāϏā§āύā§āĻĄā§āϝāĻžāύā§āĻ āϏāĻŋāϞā§āĻā§āĻāϰāĻĻā§āϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧠āϏāϤāϰā§āĻ āĻĨāĻžāĻā§āύ! āϏāĻŋāĻāϏāĻāϏ āύāĻŋāϝāĻŧāĻŽā§āϰ āĻāύā§āϝ āϏāĻŋāϞā§āĻā§āĻāϰ
.a .b
āĻāϰ āϏāĻžāĻĨā§, āϝāĻĻāĻŋ.a
āĻāϰ āϏāĻžāĻĨā§ āĻŽā§āϞ⧠āĻāĻŽāύ āĻāϞāĻŋāĻŽā§āύā§āĻā§ āϰāĻŋāĻāĻžāϰāϏāĻŋāĻ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āϏā§āĻ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϏāĻŦ.b
āύāĻŋāϝāĻŧāĻŽ āĻ āύā§āϝāĻžāϝāĻŧā§ āĻŽāĻŋāϞāĻŦā§āĨ¤
CSS Modules â
āĻāĻāĻāĻŋ <style module>
āĻā§āϝāĻžāĻ CSS Module āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻĢāϞāĻžāĻĢāϞ⧠CSS āĻā§āϞāĻžāϏāĻā§āϞāĻŋāĻā§ $style
-āĻāϰ āĻ
āϧā§āύ⧠āĻāĻāĻāĻŋ āĻ
āĻŦāĻā§āĻā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻĒā§āϰāĻāĻžāĻļ āĻāϰā§:
vue
<template>
<p :class="$style.red">This should be red</p>
</template>
<style module>
.red {
color: red;
}
</style>
āϏāĻāĻāϰā§āώ āĻāĻĄāĻŧāĻžāϤ⧠āĻĢāϞāϏā§āĻŦāϰā§āĻĒ āĻā§āϞāĻžāϏāĻā§āϞāĻŋ āĻšā§āϝāĻžāĻļ āĻāϰāĻž āĻšāϝāĻŧ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦāϰā§āϤāĻŽāĻžāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ CSS āϏā§āĻā§āĻĒ āĻāϰāĻžāϰ āĻāĻāĻ āĻāĻĢā§āĻā§āĻ āĻ āϰā§āĻāύ āĻāϰā§āĨ¤
āĻāϰāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻžāϰ āĻāύā§āϝ CSS āĻŽāĻĄāĻŋāĻāϞ āϏā§āĻĒā§āĻ āĻĻā§āĻā§āύ āϝā§āĻŽāύ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽ āĻāĻŦāĻ compositionāĨ¤
Custom Inject Name â
āĻāĻĒāύāĻŋ module
āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻāĻā§ āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻĻāĻŋāϝāĻŧā§ āĻāύāĻā§āĻāĻļāύ āĻāϰāĻž āĻā§āϞāĻžāϏ āĻ
āĻŦāĻā§āĻā§āĻā§āϰ āĻĒā§āϰā§āĻĒāĻžāϰā§āĻāĻŋ āĻā§ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<template>
<p :class="classes.red">red</p>
</template>
<style module="classes">
.red {
color: red;
}
</style>
Usage with Composition API â
āĻāύāĻā§āĻāĻļāύ āĻāϰāĻž āĻā§āϞāĻžāϏāĻā§āϞāĻŋ setup()
āĻāĻŦāĻ <script setup>
-āĻ useCssModule
API āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻžāϏā§āĻāĻŽ āĻāύāĻā§āĻāĻļāύ āύāĻžāĻŽ āϏāĻš <style module>
āĻŦā§āϞāĻā§āϰ āĻāύā§āϝ, useCssModule
āĻĒā§āϰāĻĨāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻŽā§āϝāĻžāĻāĻŋāĻ module
āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻā§āϝāĻžāϞā§āĻā§ āϰāĻŋāϏāĻŋāĻ āĻāϰā§:
js
import { useCssModule } from 'vue'
// inside setup() scope...
// default, returns classes for <style module>
useCssModule()
// named, returns classes for <style module="classes">
useCssModule('classes')
- Example
vue
<script setup lang="ts">
import { useCssModule } from 'vue'
const classes = useCssModule()
</script>
<template>
<p :class="classes.red">red</p>
</template>
<style module>
.red {
color: red;
}
</style>
v-bind()
in CSS â
SFC <style>
āĻā§āϝāĻžāĻāĻā§āϞāĻŋ v-bind
CSS āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠CSS āĻā§āϝāĻžāϞā§āĻā§āϞāĻŋāĻā§ āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻ
āĻŦāϏā§āĻĨāĻžāϝāĻŧ āϞāĻŋāĻā§āĻ āĻāϰāϤ⧠āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§:
vue
<template>
<div class="text">hello</div>
</template>
<script>
export default {
data() {
return {
color: 'red'
}
}
}
</script>
<style>
.text {
color: v-bind(color);
}
</style>
āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ <script setup>
āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰā§, āĻāĻŦāĻ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰ⧠(āĻā§āϰā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻŦā§āϤ āĻāϰāĻž āĻāĻŦāĻļā§āϝāĻ):
vue
<script setup>
import { ref } from 'vue'
const theme = ref({
color: 'red',
})
</script>
<template>
<p>hello</p>
</template>
<style scoped>
p {
color: v-bind('theme.color');
}
</style>
āĻāĻāĻā§ā§āĻžāϞ āĻā§āϝāĻžāϞ⧠āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļ āĻāϰāĻž CSS āĻāĻžāϏā§āĻāĻŽ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋāϤ⧠āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāĻŦā§, āϤāĻžāĻ CSS āĻāĻāύāĻ āϏā§āĻā§āϝāĻžāĻāĻŋāĻāĨ¤ āĻāĻžāϏā§āĻāĻŽ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āĻāύāϞāĻžāĻāύ āϏā§āĻāĻžāĻāϞā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϰā§āĻ āĻāϞāĻŋāĻŽā§āύā§āĻā§ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻž āĻšāĻŦā§ āĻāĻŦāĻ āϏā§āϰā§āϏ āĻā§āϝāĻžāϞ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšāϞ⧠āϰāĻŋā§ā§āĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻšāĻŦā§āĨ¤
GitHub-āĻ āĻāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ