scope的原理和样式穿透


1. scope的作用

默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。

导致组件之间样式冲突的根本原因是:

(1)单页面应用程序中,所有组件的 DOM 结构,都是基于唯一的 index.html 页面进行呈现的
(2)每个组件中的样式,都会影响整个 index.html 页面中的 DOM 元素

为了解决这个问题有了scope

在vue文件中的 style 标签上,有一个特殊的属性:scoped。当一个 style 标签拥有 scoped 属性时,它的 CSS 样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组件元素。通过该属性,可以使得组件之间的样式不互相污染。如果一个项目中的所有 style 标签全部加上了scoped,相当于实现了样式的模块化。

2. scope的原理

给页面元素添加自定义属性,且修改css为属性选择器

h1[data-v-123f24]{
    background:red;
}
<h1 data-v-123f24>Vue会编译成这样,这样其它组件的标签没有自定义属性就不会被影响</h1>

3. 样式穿透的使用

scope导致当前的样式选择器附加属性选择器[data-v-123f24],当前Vue页面的元素附加这个特定属性[data-v-123f24]。

这会造成了一个问题:Vue页面所使用的组件中的元素(除了根元素)并没有这个属性[data-v-123f24],无法应用期望的样式。

所以有了样式穿透,有好几种写法,会这种就够了:

父选择器 /deep/.u-upload__wrap{
	display: flex;
	justify-content: center;
	.u-upload__wrap__preview{
		margin-right: 0px;
	}
}

其它写法:

如果你使用的是css,没有使用css预处理器,则可以使用>>>,/deep/,::v-deep。
如果你使用的是less或者node-sass,那么可以使用/deep/,::v-deep都可以生效。
如果你使用的是dart-sass,那么就不能使用/deep/,而是使用::v-deep才会生效。

4. 样式穿透的原理

用了样式穿透后,在deep之后的选择器最后就不会加上标识,组件自然能应用样式。


文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录