想给message box中的icon 图标设置个颜色,老是不生效,原因在这:
文章转自:element-ui 自定义message-box 自定义样式不生效 | 码农家园
背景:这是小伙伴今天在开发中遇到的问题,使用jsx语法自定义一个msgbox,自定义msgbox自然需要自定义样式,然后就遇到了自定义customClass不生效的问题。
下面上jsx的一个写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | this.$msgbox({ title: '确认', message: h('div', { style: 'text-align: center' }, [ h('p', { class: 'content-title' }, '请确认是否为XX'), h('div', { class: 'content-message' }, 'XXXXXX'), h('div', { class: 'content-message' }, 'XXXXXXXXXXXXXXXXXXXXXXXXX') ]), customClass: 'return-visit-message-box', showCancelButton: true, confirmButtonText: '是', cancelButtonText: '否', }).then(() => { this.checkPrescriptionType() }).catch(() => { this.$message.info('XXXXXXXXXXXXXX') }) |
先分析下不生效的原因
1、this.$msgbox($alert等等),是通过element-ui的方法在body下渲染出来一个class="el-message-box__wrapper"的div。如果你看过源码就知道,这div根本就不是一个vue组件,只是使用js操作dom 生成的一些节点元素。所以不具备vue组件的一些特性:如在渲染templage模板时,不会在节点上添加data-v-xxxxxx 之类的属性,而scoped 正是运用data-v-xxxxxx属性找到对应的元素实现局部样式控制的。所以不生效是必然的。
2、/deep/不生效,deep 不过是css样式上加上了属性选择器[data-v-xxxxxx] 本质上还是从vue组件的角度来实现的样式注入,前面分析过了 message-box 本身就不是一个vue组件,所以也是不能生效的。
解决方法:
1、scoped不生效,那么只能将样式放全局,在当前组件加上一段不带scoped的style,或者放到全局样式表中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <style> .el-message-box.return-visit-message-box { width: 355px; padding-bottom: 0; .el-message-box__header { display: flex; justify-content: space-between; align-items: center; padding-top: 10px; background: rgba(241,243,245,1); .el-message-box__title { font-size:16px; font-weight:500; color:rgba(51,51,51,1); } .el-message-box__headerbtn { position: unset; } } .el-message-box__content { padding-top: 20px; .content-title { font-size:16px; font-weight:500; color:rgba(51,51,51,1); line-height:22px; margin-bottom: 16px; } .content-message { font-size: 12px; font-weight: 400; color: #666666; line-height: 17px; } } .el-message-box__btns { padding: 20px 20px 20px; .el-button { padding: 9px 27px; } } } </style> |