vue中修改子组件样式
一、问题叙述
项目里需要新添加一个表单页面,里面就只是几个select,这个几个select是原本封装好的组件,有自己原本的样式,而这次的原型图却没有和之前的样式统一起来,需要微调一下,这里就涉及到父组件修改子组件的样式。不想混用本地和全局样式,所以选择了>>>,但是并不起作用,就换成/deep/,其实到这里我也没有继续深入这个知识点,因为在浏览器里预览后已经实现了原型图的样式,直到打包在手机上测试,发现问题,在手机上浏览并没有将样式修改过来。如下图:


问题:①为什么使用>>>不起作用?②为什么我使用了/deep/却没有成功的在手机上将样式修改过来?
二、相关知识点
㈠关于vue中使用scoped属性
在vue组件中,在style标签中添加scoped属性,这样在这里定义的css只作用于当前组件中的元素,可使组件之间的样式不会相互污染,使样式私有化。比如在父组件内使用子组件,父组件的样式不会渗透到子组件中。
Ⅰ、在加上scoped后,会为DOM节点自动添加一个唯一的属性(data-v-f3f3eg9后面这串数字像是独一无二的hash值),以保证其唯一性。同时在相应的css选择器末尾,也加上了当前组件的data-v-f3f3eg9属性,来使其私有化。
如Vue Loader中所给出的代码示例:
<template>
<div class="example">hi</div>
</template> <style scoped>
.example {
color: red;
}
</style>
转化后:
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template> <style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
㈡关于深度作用选择器:/deep/(>>>)
使用了scoped后,尽管实现组件样式的私有化,但在我们实际的项目中,在很多地方使用重复的子组件或其他的样式库时,在个别地方需要微调样式,这个时候不能直接改子组件样式,而且在父组件里的样式又不能渗透到子组件去。这个时候文档中有一句话:
不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。
所以还是有办法解决刚才那个问题的,当我们希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符,编译后会在相应的选择器后面增加独有的属性;如下:
<style scoped>
.a >>> .b { /* ... */ }
</style>
上述代码将会编译成:
.a[data-v-f3f3eg9] .b { /* ... */ }
在这里需要注意的是,有些像 Sass 、scss之类的预处理器无法正确解析 >>>。这种情况下我们可以使用 /deep/ 或 ::v-deep 操作符来取代>>>,这是两个都是 >>> 的别名,同样可以正常工作。如下:
<style lang='scss' scoped>
.a {
/deep/ .b{
/* ... */
}
}
</style>
三、问题解决
①为什么使用>>>不起作用?
因为这个项目使用的scss,所以无法正常解析>>>,所以在父组件没有渗透下去。
.pop-content {
.input-wrapper >>> .form-item {
.form-label {
/*...*/
}
在浏览器查看转换的结果发现,还是原本组件的样式,我新定义的并没有出现。如下图:

②为什么我使用了/deep/却没有成功的在手机上将样式修改过来?
因为引用的这个子组件里还包裹了一层子组件,我使用了两个/deep/,不理解/deep/的实现原理,自以为每一个组件都要渗透一次。
/*错误代码:写了两次/deep */
.pop-content {
/deep/ .input-wrapper /deep/ .form-item {
...
}
}
转换后在浏览器看到的代码,发现第二个是无法转换的。
.pop-content[data-v-b93cf8e0] .input-wrapper /deep/ .form-item {}
/*修改后的代码*/
.pop-content {
.input-wrapper /deep/ .form-item {
}
} /*编译转换后的代码*/
.pop-content .input-wrapper[data-v-b93cf8e0] .form-item
③随之而来第三个问题,我只写一个/deep/的话,我写在哪个位置呢,是不是写在哪都行,它们之间有什么区别。
ⅰ尝试一:将/deep/写在input-wrapper后面
.pop-content {
.input-wrapper /deep/ .form-item {
padding: 0.4rem 2rem 0.3rem 1.5rem;
.form-label {
-webkit-box-flex:;
-ms-flex: 0 0 8rem;
flex: 0 0 50%;
font-size: 15px;
color: black;
position: relative;
}
}
转换后的样式代码:原本的样式已经失效了,并在input-wrapper后面添加了相应唯一的data-v属性值。

ⅱ尝试二:将/deep/写在pop-content后面
.pop-content {
/deep/ .input-wrapper .form-item {
padding: 0.4rem 2rem 0.3rem 1.5rem;
.form-label {
-webkit-box-flex:;
-ms-flex: 0 0 8rem;
flex: 0 0 50%;
font-size: 15px;
color: black;
position: relative;
}
}
转换后的样式代码:原本的样式已经失效了,并在pop-content后面添加了相应唯一的data-v属性值。

ⅲ尝试三:将/deep/写在form-item或者form-label后面,均不起作用。看了一下DOM结构,我觉得可能是因为这样做的css的优先级并没有比原来的高,所以没法改变。还有就是这个子组件内部的组件嵌套也比较复杂,所以从最外面的父组件看不出,所以对/deep/位置的放置对其优先级的影响还是比较大的。大致这样理解。
vue中修改子组件样式的更多相关文章
- vue父组件中修改子组件样式
1. 使用全局样式 <style> /* 全局样式 */ </style> <style scoped> /* 本地样式 */ </style> 2. ...
- vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题
Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...
- vue中修改第三方组件的样式不生效
问题 在使用element-ui时,有时候想要修改组件内的样式,但不成功,例如 <div class="test"> <el-button>按钮</e ...
- vue中修改第三方组件的样式并不造成污染
vue引用了第三方组件, 需要在组件中局部修改第三方组件的样式, 而又不想去除scoped属性造成组件之间的样式污染. 此时只能通过>>>,穿透scoped. 但是,在sass中存在 ...
- Vue 中的 子组件 给 父组件 传值
子组件的某一个事件(sendData)内部,通过this.$emit('事件名', 传递的值)传递数据父组件在调用子组件的地方,绑定了子组件自定义的 事件名(change-data) 定义父组件的地方 ...
- Vue less使用scope时渗入修改子组件样式
@deep: ~'>>>'; .wrap { @{deep} .component1 { width: 120px; } }
- vue中修改Element ui样式不起作用
公司做的一个后台系统,由于Elemen ui是响应式的,在小屏笔记本中,一行两列的表单会自动变成一行一列,这样就很不美观了,由于是后台系统,当时也没考虑适配问题. 老总 地表最强的电脑 运行了一下,当 ...
- 如何在vue中修改动态标签中的样式和修改组件库样式
vue中修改动态标签中的样式和修改组件库样式 因为vue中的标签在渲染的时候,都会给标签加上id 所以你想在<style lang="scss" scoped>直接修改 ...
- Vue的父子组件v-model双向绑定,父组件修改子组件中绑定的v-model属性
先来看下实现的效果,父组件中有个文本框,在点击下面按钮时弹出抽屉,抽屉里也有个文本框,文本框里的初始值要和父组件的文本框同步,并且修改抽屉里的文本框值时 父组件里的文本框值也要跟着改变 网上有大概三种 ...
随机推荐
- You don't have permission to access / on this server问题的解决.
vhosts.conf配置文件中虚拟主机的配置如下,Options Indexes FollowSymLinks 后面添加 ExecCGI <VirtualHost 192.168.10.82: ...
- Win8MetroC#数字图像处理--2.2图像二值化函数
原文:Win8MetroC#数字图像处理--2.2图像二值化函数 [函数代码] /// <summary> /// Binary process. /// </summary> ...
- LINQ查询表达式---------join子句
LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...
- 关于SetLocaleInfo()
原文:关于SetLocaleInfo() 此函数用于设置系统的一些本地信息, 非常有用. 比如日期格式为'yyyy/mm/dd'时, 稍微不注意,有些程序语句会报错. 以下资料网络收集: 1. Set ...
- WP8.1使用HttpClient类
Uri uri = new Uri("http://www.cnsos.net/weburl/index.htm", UriKind.Absolute); HttpClient m ...
- Tensorflow初级篇
第二章 Tensorflow主要依赖两个工具:Protocol Buffer和Bazel Protocol. Protocol Buffer是一个结构数据序列化的的工具,在Tensorflow中大部分 ...
- 使用Boost的DLL库管理动态链接库
Boost 1.61新增了一个DLL库,跟Qt中的QLibrary类似,提供了跨平台的动态库链接库加载.调用等功能.http://www.boost.org/users/history/version ...
- Delphi中用MessageBox()API函数做倒计时对话框(使用Hook安装CBTHookCallback,计时器更改文字,SetWindowText API真正修改文字,引用未知函数)good
API有隐藏的MessageBoxTimeOut函数可以做计时对话框,缺点是不能显示还剩下多少秒关闭. const IDTIMEDOUT = 32000; function MessageBoxTim ...
- Windows下获取逻辑cpu数量和cpu核数量(用GetLogicalProcessorInformation,从XP3才开始有的API)
代码可在Windows NT下正常运行 具体API说明请参照如下文档: GetLogicalProcessorInformation 点击打开链接 点击打开链接 点击打开链接 typedef BOOL ...
- iOS密码框实现(二)取消确定按钮
由于将确定按钮去掉了,所以需要重新修改下代码,当输入第四个数字时,自动进入房间. iOS 密码框效果图: 实现方式: 首先声明一个block初始化方法,因为这只是个框框,并不需要处理网 ...