发布于2021-03-07 22:23 阅读(733) 评论(0) 点赞(13) 收藏(3)
当 <style>
标签有 scoped
属性时,它的 CSS 只作用于当前组件中的元素,不会影响到子组件(非根结点)的样式。
使用
scoped
后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件有作用域的 CSS 和子组件有作用域的 CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。
在编译组件的时候,如果当前组件内style标签上有scoped属性,那么会在当前所有标签上添加一个【data-v-hash】属性,而当前样式表内的所有末尾选择器后面也会加上该属性,那么久使得当前组件内的样式只会作用于当前组件内的元素。
值得注意的是,当父组件,子组件同时使用scoped属性时,子组件最外层的标签既会被加上当前组件的hash值,又会加上父级组件的hash值
若父组件样式添加scoped,父组件的所有标签则添加hash:
<div data-v-b45036b2></div>
各自带有自己组件的hash,子组件除了有自己的hash之外,还带上了父组件的hash,子组件最外层标签:
<div data-v-b45036b2 data-v-384b136e ></div>
以下是父组件的节点:
- <div class="wrap">
- <child></child>
- </div>
以下是child子组件的节点:
- <template>
- <div>
- <span class="child">test</span>
- </div>
- </template>
父组件CSS:
- <style scoped>
- .wrap .child {
- color: red;
- }
- </style>
以上css代码编译之后为:
.wrap .my_text[data-v-b45036b2] {color: red;}
可见,编译之后的css中,子组件的节点带上的是父组件的hash,hash值对应不上,所以控制不到子组件的样式
难道父组件写上scoped,就没办法控制子组件(非根结点)的样式了吗,那么以上问题要如何解决呢
可以在一个组件中同时使用有作用域和无作用域的样式,把要控制子组件样式的代码写在全局中:
- <style>
- / * 全局样式 */
- .wrap .child {
- color: red;
- }
- </style>
-
- <style scoped>
- /* 本地样式 */
-
- </style>
这种形式比较累赘,不够优雅,有没有办法可以在本地样式中控制子组件的样式呢
父组件的CSS用以下写法:
- <style scoped>
- .wrap >>> .child {
- color: red;
- }
- </style>
以上代码编译之后
.wrap[data-v-b45036b2] .my_text {color: red;}
这样只需要注意css的权重就可以覆盖子组件内的样式了
有些像 Sass、Less、Scss 之类的预处理器无法正确解析
>>>
。这种情况下你可以使用/deep/
操作符取而代之——这是一个>>>
的别名,同样可以正常工作。
父组件代码只需把>>> 替换成deep即可:
- <style scoped>
- .wrap /deep/ .child {
- color: red;
- }
- </style>
以上代码编译之后:
.wrap[data-v-b45036b2] .my_text {color: red;}
在增加了scoped属性的组件当中,每个标签都会带上形如 【data-v-hash】的属性,父组件和子组件的hash值不一样
按照普通的写法,编译之后的代码hash值对不上,所以父组件不能控制子组件(非根结点)的样式(控制子组件根结点的样式是可以的,前言有说到)
解决办法可以在样式中使用 /deep/ 或者>>>,使得父组件样式的作用深度更深
原文链接:https://blog.csdn.net/weixin_39357177/article/details/114371187
作者:天使的翅膀
链接:http://www.qianduanheidong.com/blog/article/33524/e17e6b050eb04ea208f0/
来源:前端黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 前端黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-3
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!