在使用scoped遇到的一些问题

场景

在子组件中用到了ele-uiel-scrollbar(自定义滚动的隐藏组件,官方无文档说明,可以在其他地方搜到使用方法),如图:

(忽略图里的null)

style样式如下:
ele-ui自带样式

此处期望修改为X轴无滚动条,Y轴显示自定义滚动条:
期望效果

直接修改样式

然而直接在子组件里添加代码下方代码,并未生效(子组件style添加了scoped属性)。同时在控制台styles中并未找到对应样式设置。

.el-scrollbar__wrap {
  overflow-y: scroll;
  overflow-x: hidden;
}

然后尝试将此段代码添加到公共样式中,生效。

问题

scoped究竟有何作用?el-scrollbar在子组件里使用,子组件中设置el-scrollbar__wrap的样式却无效?如何解决这个问题?

求解

官方文档,有作用域的 CSS

  • <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。
  • 通过 v-html 创建的 DOM 内容不受作用域内的样式影响,但是你仍然可以通过深度作用选择器来为他们设置样式。
  • 有些像 Sass之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 操作符取而代之——这是一个>>> 的别名,同样可以正常工作。

在上面场景中,el-scrollbar虽然是在子组件中使用,但是el-scrollbar__wrap却是动态生成的DOM元素,如果要在子组件中设置需要使用深度作用选择器>>>(或/deep/) 。此处子组件style设置了lang="scss",上述代码修改如下:

/* .el-scrollbar 为原有的DOM元素 */
.el-scrollbar {
  &/deep/ .el-scrollbar__wrap {
    overflow-y: scroll;
    overflow-x: hidden;
  }
}

同时删除了公共样式中相关样式设置。然后运行,达成预期。

当然文档里同样说明在一个组件中可以同时使用有作用域和无作用域的样式。另一种方案则是此组件中另写个全局样式标签,并将需要设置的样式放入其中。(并不能感觉和最初有啥区别,都是设置全局)

其它

scoped属性可以理解为组件样式的私有化,其设置的样式只对当前组件有效,即只对组件中的DOM元素有效(包括组件中用到的子组件的根元素)。
有组件About.vue如下:

<template>
  <div class="about">
    <h1>This is an about page</h1>
    <!-- 组件c-div -->
    <c-div class="cdiv"></c-div>
  </div>
</template>
<script>
import Cdiv from "@/views/Cdiv";
export default {
  data() {
    return {};
  },
  components: {
    "c-div": Cdiv
  }
};
</script>

<style lang="scss" scoped>
h1 {
  color: red;
}
.cdiv {
  width: 100px;
  height: 100px;
  margin: 0 auto;
  border: 1px solid #000;
  h3 {
    color: red;
  }
}
</style>

下面的是子组件Cdiv.vue

<template>
  <div class="about">
    <h3>这是组件C</h3>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  },
  components: {}
};
</script>

<style lang="scss" scoped>
h3 {
  color: blue;
}
</style>

在不使用深度作用选择器的情况下,About.vue样式可以影响到c-div,却不会影响c-div下面的子元素

在浏览器下查看DOM结构,不难发现scoped设置组件样式私有化,是通过给DOM元素添加对应属性(如data-v-039c5b43),并在对应样式中添加对应属性选择器,由于不同组件之间的属性是不同的,因此可以实现样式私有化控制。

通过PostCSS对内容进行转换

Cdiv.vuestyle标签的scoped移除,并添加插槽:

    <c-div class="cdiv">
      <h3>about</h3>
    </c-div>
依然没有影响到c-div组件中的子元素


在没有使用深度作用选择器的情况下,属性会添加到样式直接作用的具体元素,无论是子组件的子元素,还是后续动态添加的元素都无法在PostCSS转换的时候被添加对应属性(还不存在),因此scoped对子元素或动态添加的元素无效。深度作用选择器有点像属性委托,将被直接作用到的子元素的的属性委托到其父元素上,如解决方案中修改后的样子:
属性添加到.el-scrollbar上而不是添加到其子元素上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345