在使用原生框架开发小程序时遇到一个问题,在 app.wxss 中定义的全局样式在自定义组件中不生效。后来发现是由于小程序组件样式隔离的配置导致的。

太长不看版

在组件的 json 文件中添加如下配置,全局样式即可生效。

// component.json
"styleIsolation": "apply-shared"

如果偏好在 js 文件中进行配置,或版本号 < 2.10.1,也可以写在 js 文件中,效果相同。

// component.js
Component({
  options: {
    styleIsolation: 'apply-shared'
  }
})

如果版本号 < 2.6.5,可以使用如下配置代替 styleIsolation: 'apply-shared'

// component.js
Component({
  options: {
    addGlobalClass: true
  }
})

组件样式隔离

组件的 styleIsolation 有三个可选值:

  • isolated:默认值,组件内外的样式互不影响
  • apply-shared:接收外部(包括父页面和全局)的样式,但组件内的样式不影响外部
  • shared:接收外部样式,同时组件内的样式会共享到页面

demo 试验

为了更直观,写了一个 demo 进行了简单试验。

定义一个组件comp,并在页面 index 中引入组件:

<!-- comp.wxml -->
<view class="test1 testbox">comp1</view>
<view class="test2 testbox">comp2</view>
<view class="test3 testbox">comp3</view>

<!-- index.wxml -->
<comp />
<view class="test3 testbox">index3</view>

然后在全局、页面、组件中分别定义 test1, test2, test3 的颜色为红、绿、蓝色(省略了 testbox 的样式):

/* app.wxss */
.test1 {
  background-color: lightpink;
}

/* components/index.wxss */
.test2 {
  background-color: lightgreen;
}

/* components/comp.wxss */
.test3 {
  background-color: lightblue;
}

之后对组件的 styleIsolation 属性进行不同取值,结果如下:

可以看到,默认模式 isolated下,父页面和全局样式都不生效;apply-shared 模式下,页面和全局样式能作用到组件中;shared 模式下组件样式还会反过来作用到父页面上。

优先级

另外,经过测试,对于相同的选择器,样式的优先级为 组件样式 > 页面样式 > 全局样式,对于组件来说这基本符合直觉。不过如果组件应用了 shared,那么其中样式也会覆盖页面中的样式,这就有点奇怪。

综上,个人建议除非特殊需要,否则最好慎用 shared 模式,并且尽量减少选择器冲突和相互覆盖,以免造成不必要的灵异事故。对于需要共享的样式,可以根据情况抽取到全局或采用引入 css 文件的方式实现。

页面的隔离配置

由于小程序的页面实际上也是组件,所以同样可以设置 styleIsolation 属性,并且与自定义组件不同的是页面的默认取值为 share,因此页面中默认可以应用全局样式。

另外,对于页面还额外增加了三个属性取值。虽然文档中有各自的描述,但我经过试验后感到十分迷惑,完全没有搞懂各自的确切作用和区别;甚至还有页面设置为 isolated / page-isolated 之后页面自己的样式都失效了这种神秘 bug,可能是实现上还存在问题。所以建议不要随便更改页面的 styleIsolation 配置,感兴趣的可以点击文末链接自行研究试验。

只有一个还算比较确定的选项,配置 page-shared 之后,页面(以及其中的组件)将屏蔽 app.wxss 中的全局样式,并且其他方面的影响应该较小,如果有需要可以尝试。

参考资料

微信官方文档 · 小程序

到此这篇关于小程序自定义组件全局样式不生效的解决方法的文章就介绍到这了,更多相关小程序组件全局样式不生效内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

小程序自定义组件全局样式不生效的解决方法的更多相关文章

  1. 微信小程序“圣诞帽”的实现思路详解

    这两天朋友圈被圣诞帽刷屏,下面通过本文给大家分享微信小程序“圣诞帽”的实现思路详解,需要的朋友参考下吧

  2. 小程序实现图片裁剪上传

    这篇文章主要为大家详细介绍了小程序实现图片裁剪上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. php实现小程序支付完整版

    这篇文章主要为大家详细介绍了php实现小程序支付完整版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. 微信小程序的宿主环境实现代码

    这篇文章主要介绍了微信小程序的宿主环境,包括scroll-view 组件的基本使用,text 组件的基本使用及rich-text 组件的基本使用,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

  5. 微信小程序使用ucharts在小程序中加入横屏展示功能的全过程

    这篇文章主要给大家介绍了关于微信小程序使用ucharts在小程序中加入横屏展示功能的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友可以参考下

  6. 微信小程序实现页面导航的方法详解

    这篇文章主要为大家详细介绍一下微信小程序实现页面导航的几种方法以及帮助大家掌握如何使用页面之间的导航跳转,感兴趣的可以了解一下

  7. 微信小程序开发WXML模板语法基础教程

    这篇文章主要介绍了微信小程序模板语法,WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构,需要的朋友们下面随着小编来一起学习学习吧

  8. 微信小程序访问mysql数据库流程详解

    日常我们在开发小程序的时候,总是希望把数据提交回数据库进行存储,那在小程序中该如何访问数据库呢?本篇我们就介绍一下具体的思路

  9. 微信小程序视频弹幕发送功能的实现

    这篇文章主要介绍了微信小程序视频弹幕发送功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. JavaScript实现微信小程序打卡时钟项目实例

    这篇文章主要为大家介绍了JavaScript实现微信小程序打卡时钟项目实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部