CSS3在微信小程序的使用 --var 换肤功能(1)

CSS3在微信小程序的使用 --var 换肤功能

需求

1:做的第三方小程序,所以要实现商户 换肤功能

想到了两种解决方案:

1)使用类名,根据不同的主题写一套样式

缺点:不利于颜色更新,工作量巨大,占用很大的空间,小程序本身就2Mb。耦合度太高,html和css混合了,耦合度太高。

2)使用Css3的 --var变量(认识很久,一直没有使用过)

这个变量和less scss里面的定义变量一样,css为了不冲突这些预编译的语法,使用的--var的用法。

通过不断的咨询,有人说IOS9不兼容var变量的方式,但是本身很老的机型,而且本人验证了IOS8可以完美兼容。我在官方推荐weUI找打大量的Css3使用例子。使用选择了第二种方式。

难点:

1)因为小程序没有全局修改tabbar的属性和方法,使用只有一个一个界面去修改,但是这很麻烦,显然不符合程序员偷懒的习惯。。。

解决办法:

所以我想起了VUE的路由拦截器,可惜的是,我通过百度,未能找到这种方法。但是官方没有,我们可以自己造呀。

https://segmentfault.com/a/1190000011044371?utm_source=tag-newest

2)js怎么去修改css,设置css变量

解决办法:

我们可以在每个页面的JS文件里面设置一个Style变量,然后绑定到页面上。具体看代码:

代码实现:

拦截器代码:intercept.js

/**
 * tabbar页面,只有这些页面才能修改tabbar
 */
let tabbar_list = ['pages/home/home', 'pages/classify/classify', 'pages/cart1/cart1', 'pages/mine/mine']
function intercept(pageObj) {
  /**
   * 不要问为什么写外面,因为直接挂载到App上面的,所以写外面获取的app是空
   */
  let app = getApp()
  if (pageObj.onShow) {
    var _onShow = pageObj.onShow;
  }
  //对onShow进行修饰
  pageObj.onShow = function () {
    let that = this
    if (app.globalData.style) {
      frameworkStyle.call(that)
      let { myStyle } = cssStrle()
      this.setData({
        myStyle: myStyle
      })
    }
    if (_onShow) {
      let currentInstance = getPageInstance();
      _onShow.call(currentInstance);
    }
  }

  return pageObj;
}

function getPageInstance() { // 获取去往的页面
  var pages = getCurrentPages(); // getCurrentPages小程序获取页面栈函数
  return pages[pages.length - 1];
}
/**
 * 修改小程序架构架构样式
 */
function frameworkStyle() {
  let app = getApp()
  //app.globalData   这个数据来自于接口
  wx.setNavigationBarColor({
    frontColor: '#ffffff',
    backgroundColor: app.globalData.style.background_color,
  })
  if (tabbar_list.indexOf(this.route) != -1) {
    wx.setTabBarStyle({
      frontColor: app.globalData.style.font_color,
      backgroundColor: app.globalData.style.background_color
    })
  }

}
/**
 * 修改css全局样式
 */
function cssStrle() {
  let app = getApp()
  let myStyle = `
    --background_color:${app.globalData.style.background_color};
    --font_color:${app.globalData.style.font_color};
    --frame_color:${app.globalData.style.frame_color};
  `
  return {
    myStyle
  }
}

module.exports = intercept

app.js

//引入
const intercept = require('./intercept.js')
//挂载到app上面
app({
intercept:intercept
})

页面使用

Page(app.intercept({

}))

wxss

background: var(--frame_color);

wxml

<view style="{{myStyle}}">
    <!--要写的内容-->
</view>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。