Scoped CSS
Scoped CSS 规范是 web 组件产生不污染其他组件, 也不被其他组件污染的 CSS 规范.
vue 组件中的 style 标签标有 scoped 属性时表明 style 里的 CSS 样式只适用于当前组件元素
它是通过使用 PostCSS 来改变以下内容实现的:
- <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>
混合使用全局属性和局部属性
- <style>
- /* global styles */
- </style>
- <style scoped>
- /* local styles */
- </style>
关于子组件的根元素
使用了 scoped 属性之后, 父组件的 style 样式将不会渗透到子组件中, 然而子组件的根节点元素会同时被设置了 scoped 的父 CSS 样式和设置了 scoped 的子 CSS 样式影响, 这么设计的目的是父组件可以对子组件根元素进行布局.
.vue 模板中的样式是根据需要按需加载, 访问一个页面该组件中的样式就会追加到 head 标签中, 如果父子组件中都对某个子组件根节点元素进行了控制, 则父组件里的样式会被后来的覆盖.
深选择器
如果想对设置了 scoped 的子组件里的元素进行控制可以使用'>>>'或者'deep'
- <template>
- <div id="app">
- <gHeader></gHeader>
- </div>
- </template>
- <style lang="css" scoped>
- .gHeader /deep/ .name{ // 第一种写法
- color:red;
- }
- .gHeader>>> .name{ // 二种写法
- color:red;
- }
- </style>
- <div class="gHeader">
- <div class="name"></div>
- </div>
一些预处理程序例如 Sass 不能解析 >>> 属性, 这种情况下可以用 deep, 它是 >>> 的别名, 工作原理相同.
动态生成的内容
使用 v-html 动态创建的 DOM 内容, 不受设置 scoped 的样式影响, 但你依然可以使用深选择器进行控制
下面给大家补充下 vue 中使用 v-HTML 加载的富文本, CSS 中定义样式不生效
如题, 使用 v-HTML 加载一段富文本, 富文本里包含图片, 在手机上图片宽度可能会溢出
- <div v-HTML="htmlContent" class="rich"></div>
- <style scope>
- .rich>>> img{ display:block; max-width: 100%}
- </style>
注意: 这里的 >>> 需要使用 CSS 语法, 写在 Less 里会报错
总结
来源: https://www.jb51.net/article/149801.htm