> 文章列表 > vue3 css相关知识与动态style

vue3 css相关知识与动态style

vue3 css相关知识与动态style

scoped

当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素,和 Shadow DOM 中的样式封装类似。

<style scoped lang="scss">
</style>

注意 :

  • 作用域样式并没有消除对 class 的需求。由于浏览器渲染各种各样 CSS 选择器的方式,p { color: red } 结合作用域样式使用时 (即当与 attribute 选择器组合的时候) 会慢很多倍。如果你使用 class 或者 id 来替代,例如 .example { color: red },那你几乎就可以避免性能的损失。

  • 小心递归组件中的后代选择器!对于一个使用了 .a .b 选择器的样式规则来说,如果匹配到 .a 的元素包含了一个递归的子组件,那么所有的在那个子组件中的 .b 都会匹配到这条样式规则。

全局选择器

 让其中某一个样式应用全局 :global 伪类实现

<style scoped >
:global(.b){
/* 样式 */
}
</style>// 混合使用
<style  >
/* 全局样式 */
</style>
<style scoped >
/* 局部样式 */
</style>

 :deep

深度选择器:处于scoped 的样式中的选择器如果想做更深度的选择,使用:deep()这个伪类

<style scoped lang="scss">
.a:deep(.b){
/* 样式 */
}
</style>

插槽选择器

默认情况下,作用域样式不会影响到 <slot/> 渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。使用 :slotted 伪类以明确地将插槽内容作为选择器的目标

<style scoped>
:slotted(div) {color: red;
}
</style>

module

一个 <style module> 标签会被编译为 CSS Modules 并且将生成的 CSS class 作为 $style 对象暴露给组件( CSS 仅作用于当前组件的效果。)

<template><p :class="$style.red">This should be red</p>
</template><style module>
.red {color: red;
}
</style>

你可以通过给 module attribute 一个值来自定义注入 class 对象的属性名:

<template><p :class="classes.red">red</p>
</template><style module="classes">
.red {color: red;
}
</style>

与组合式 API 一同使用

可以通过 useCssModule API 在 setup() 和 <script setup> 中访问注入的 class。对于使用了自定义注入名称的 <style module> 块,useCssModule 接收一个匹配的 module attribute 值作为第一个参数:

import { useCssModule } from 'vue'// 在 setup() 作用域中...
// 默认情况下, 返回 <style module> 的 class
useCssModule()// 具名情况下, 返回 <style module="classes"> 的 class
useCssModule('classes')

动态Style

// setup语法糖版本
<template><div class="home" ><button @click="changeColor">改变颜色</button></div>
</template><script setup>
import { ref,reactive} from 'vue'
// 也可以做成响应式
let bgColor = ref('aliceblue');
let bgObjColor = reactive({color:'green'
});
const changeColor = () => {bgColor.value = 'yellow'
}
</script><style scoped lang="scss">
.home {background-color: v-bind(bgColor);
`/*  background-color: v-bind(bgObjColor.color);*/
}
</style>// setup在内部
<template><div class="home" ></div>
</template><script>
import { defineAsyncComponent} from 'vue';
export default defineComponent({name: "Home",setup(props) {return {bgColor:'aliceblue'};}
})
</script> <style scoped lang="scss">
.home {background-color: v-bind(bgColor);
}
</style>

单文件组件 CSS 功能 | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/api/sfc-css-features.html#css-modules