当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。vue使用PostCSS方式对style进行转义,它会给节点添加唯一的戳,保证样式的作用域。
贴上官方给的例子:
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
转换结果:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
通过 v-html 创建的 DOM 内容不受作用域内的样式影响。就是scoped属性产生的影响,推测原因是转化过程在代码运行前就完成了,但是v-html内容却是动态的,导致样式无效。解决方案也很简单,就是使用深度作用选择器>>>
。这个css选择器的支持程度差异很大,而且标准也一直在变,可能Sass,less等预处理器不识别直接报错。官方给的方案是
使用 /deep/ 操作符取而代之——这是一个 >>> 的别名,同样可以正常工作。
div /deep/ span {
font-size: 12px;
}
如果使用less还可以使用less的选择器变量来解决问题。
@deep: ~">>>";
div @{deep} span {
font-size: 12px;
}