likes
comments
collection
share

揭开困扰我多日的scoped和深度选择的真面目!

作者站长头像
站长
· 阅读数 27

对于scoped和深度选择器,想必大家已经有一个基本的认知了,无非就是一个防止渗透,一个强行渗透,但在某些乱七八糟的情况下,例如多层组件嵌套,带有后代选择器的渗透。这时候我们难免会犯一些迷糊,绕来绕去,不明怪象所以。

所以,此文将扒开这两个东西的原理。

首先,先来说几个概念,当我们给一个组件的style标签加上scoped属性后,该组件内的所有显式DOM和样式选择器都会被打上一个该组件专属的形似 “[data-v-800f5ac4]” 的烙印。

打上烙印又怎么样呢,对DOM来说,无甚影响,不过好看或难看一点罢了,但对于css选择器来说,你一旦打上烙印,在选择的时候,就必须指定要那头身上有烙印的“猪”,没有我就不干,就不生效,即便你们也只是差了一个烙印而已。

DOM的烙印是什么样,自不必多说,如下图:

揭开困扰我多日的scoped和深度选择的真面目!

重头戏在样式的烙印,有两种情况,

第一种:单选择器,直接打在选择器之后

<style scoped>
.avatar-uploader{
  font-size: large;
}
</style>

揭开困扰我多日的scoped和深度选择的真面目!

第二种:多后代选择器,你可以把它们理解成一家子,拖家带口的,就打在他们的小儿子(最后的选择器)上

<style scoped>
.avatar-uploader .avatar-uploader-icon .inner {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>

揭开困扰我多日的scoped和深度选择的真面目!

深度选择器原理

清楚了烙印长什么样,打在什么地方,下面就该请出我们的重磅选手“深度选择器”了。 由于这位选手酷爱川剧变脸,我们就以 “::v-deep” 来说吧,其他形式就照猫画虎。 它的作用,就不说了,看完原理自会明白,开门见山

::v-deep的原理,就是把烙印前置,对,就是不讲武德,硬把后一个人的烙印烙在前一个人身上,来看效果

<style scoped>
.avatar-uploader .avatar-uploader-icon ::v-deep .inner {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>

揭开困扰我多日的scoped和深度选择的真面目!

简单说,就是,你对谁深度选择,他就把锅(烙印)甩(烙)给前一个人,如果前面没人怎么办,那就甩给它前面的空气,

<style scoped>
::v-deep .avatar-uploader .avatar-uploader-icon .inner {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>

揭开困扰我多日的scoped和深度选择的真面目!

看到这里,相信大家对原理都清楚了,但是怎么用呢, 就拿上面最近的这个样式例子来说吧,这样的选择器是怎么选择的呢,带有烙印的任意元素下的类名1下的类名2下的类名3,那么以此类推上一个样式例子的选择过程就是,类名1下的带有烙印的类名2下的类名3。就是这样顺次找,但凡有一个找不到,您的样式就白写了。为什么呢,您说您雇主是谁都不跟我说清楚,就让我干活,我这这这找谁说理去,

由此衍生出的各种应用场景以及出现的怪象,我就不一一列举了,明白了这个原理,剩下就是万变不离其宗了。

大家如果还有具体疑问,欢迎评论区讨论和指正,第一次写博客,多有不当之处,还望您各位海涵!

转载自:https://juejin.cn/post/7235823681074102331
评论
请登录