参考链接:
(1)微信小程序实现换肤功能
https://www.jb51.net/article/136445.htm
(2)微信小程序实现换肤功能
https://blog.csdn.net/qq_32262127/article/details/86249924
https://www.cgtblog.com/wx/3403.html
(3)vue换肤功能实例教程
https://www.php.cn/js-tutorial-385706.html

PC或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css;把当前皮肤类型存入本地;然后通过js读取并判断当前应该加载哪套css。

由于微信小程序没有操作wxss的api,所以实现的方式有点不一样,大致如下:

  • 1.需要换肤的wxss,正常的wxss。
  • 2.每个页面都引入换肤的wxss(因为换肤每个页面都需要改变)。
  • 3.在app.js的globalData里设置默认的皮肤类型。
  • 4.每个页面onload的时候,读取storage里的数据并设置当前皮肤类型的值。

一、例子1

  • 第一步:结构
  • 第二步:样式wxss
  • 第三步:js

(1)第一步:结构

<view class='page' id='{{SkinStyle}}'><view class='header'><view class='h-skin iconfont {{SkinStyle!=="normal"?"icon-moon":"icon-sun"}}' bindtap='bgBtn'></view>  </view>
</view>

备注:由于不能直接操作微信小程序的根节点page,要实现全屏背景色的修改,只能模仿一个高度宽度都是100%的div(view)。上面就是class为page的这个div(view)。

  • id=’{{SkinStyle}}’,设置id是为了根据当前皮肤类型,让皮肤的wxss样式的权重大于正常wxss样式的权重,这样有时候就没必要加上!important了。
  • 根节点page需要在wxss中设置width:100%;height:100%。然后设置class为page的div(view)宽高都是100%。这样就相当于有个能操作的根节点page了。
  • {{SkinStyle!==“normal”?“icon-moon”:“icon-sun”}}这句是判断当前的皮肤类型,如果是normal就是icon-sun,否则就是icon-moon。

(2)第二步:样式wxss

  • 皮肤wxss
#dark {background: #333;
}
#dark .header .h-skin{color: white;
}
  • 正常wxss
.page .header .h-skin {color: #060505;padding: 0 32rpx;font-size: 40rpx;
}
  • 公用wxss
page {height: 100%;width: 100%;
}
.page {width: 100%;height: 100%;
}

备注:这分别是三个文件。皮肤是theme.wxss,正常是index.wxss,公用是com.wxss

  • 因为换肤是所有页面都变化,所以建议把皮肤的wxss文件 @import “…/theme-bg/theme”; 加载到com.wxss文件中。然后每个页面的wxss都@import这个公用的com.wxss文件。

(3)第三步:js
首先:在app.js的文件中,Page里的globalData中设置:skin:“normal”;即默认为normal皮肤。
然后:在切换皮肤按钮的页面,添加切换按钮的点击事件bgBtn:

var app=getApp();
Page({data:{SkinStyle:"normal"  //这里其实可以不要}, bgBtn:function(){if (this.data.SkinStyle==="normal"){app.globalData.skin = "dark"; //设置app()中皮肤的类型this.setData({SkinStyle: app.globalData.skin //设置SkinStyle的值})wx.setStorage({   //设置storagekey: 'skins',data: app.globalData.skin,})}else{app.globalData.skin="normal";this.setData({SkinStyle: "normal"})wx.setStorage({key: 'skins',data: app.globalData.skin,})   }  }
})

最后:在每个页面,包括切换皮肤的页面的Page中的onLoad事件里,读取storage并设置SkinStyle的值:

onLoad: function (options) { var that=this;wx.getStorage({key: 'skins',success: function(res) {that.setData({SkinStyle: res.data})},})
}

这样每次启动都能自动设置上一次设置的皮肤了。
最终效果图:

二、例子2

Github地址:我的年目标-微信小程序 https://github.com/weijhfly/mytarget

要实现如上更换皮肤的效果,有几个思路:

  1. 准备皮肤相关的wxss,引入到app.wxss中,方便每个页面使用;
  2. 设置皮肤时,动态改变wxml中元素的类名或id,使页面应用对应的皮肤;
  3. 将选中皮肤的值保存在小程序本地缓存中,保证其他页面及下一次打开小程序时,页面展示正确的皮肤;

wxml文件
wxml部分比较简单,只需要动态切换id即可,注意因为page无法动态设置背景色,所以这里的最外层需要width: 100%;height: 100%;,否则将无法使皮肤铺满页面。

<view class="page" id='{{skin}}'>  <view class="container">...</view>
</view>

wxss文件

/* app.wxss主题颜色 */
/* 深黑 */
#dark-skin{background: #000;
}
#dark-skin .bColor{background: #333;color: #999;
}
#dark-skin .borderColor{border-color:#999;
}
/* 粉红 */
#red-skin{background: #f9e5ee;
}
#red-skin .bColor{background: #f9e5ee;color: #8e5a54;
}
#red-skin .borderColor{border-color:#8e5a54;
}
/* 橘黄 */
#yellow-skin{background: #f6e1c9;
}
#yellow-skin .bColor{background: #f6e1c9;color: #8c6031;
}
#yellow-skin .borderColor{border-color:#8c6031;
}

写好皮肤对应的颜色样式,直接放入app.wxss中即可,如果样式过多,可以使用单独的wxss文件,方便管理。

@import "style/skin/dark.wxss";

js文件
存储选中的皮肤值

//wxml
<view bindtap="setSkin" data-flag='yellow'>橘黄</view>
//bindtap事件函数setSkin:function(e){var skin = e.target.dataset.flag;this.setData({skin: skin + '-skin',openSet:false})wx.setStorage({key: "skin",data: skin + '-skin'})app.setSkin(this);}

这里使用setData使页面立即切换id,使用wx.setStorage存储值,app.setSkin是定义在app.js上的公共方法,下面会有介绍。

//app.js
App({data: {},setSkin:function(that){wx.getStorage({key: 'skin',success: function(res) {if(res){that.setData({skin: res.data})var fcolor = res.data == 'dark-skin' ? '#ffffff' : '#000000',obj = {'normal-skin':{color:'#000000',background:'#f6f6f6'},'dark-skin': {color: '#ffffff',background: '#000000'},'red-skin': {color: '#8e5a54',background: '#f9e5ee'},'yellow-skin': {color: '#8c6031',background: '#f6e1c9'},'green-skin': {color: '#5d6021',background: '#e3eabb'},'cyan-skin': {color: '#417036',background: '#d1e9cd'},'blue-skin': {color: '#2e6167',background: '#bbe4e3'}},item = obj[res.data],tcolor = item.color,bcolor = item.background;wx.setNavigationBarColor({frontColor: fcolor,backgroundColor: bcolor,})wx.setTabBarStyle({color: tcolor,backgroundColor: bcolor,})}}})}
})

app.setSkin提供给所有页面调用,并通过已有的皮肤颜色,设置头部和导航区域的背景及文字颜色。

打开一个普通wxml页面,并设置皮肤。

const app = getApp();Page({data: {skin: 'normal-skin',},onLoad: function() {app.setSkin(this); },onShow:function(){app.setSkin(this); }
})

在onLoad及onShow触发时设置皮肤,这里的onShow是为了避免重新设置皮肤时,页面还显示上一次的皮肤,由于首次加载会设置两次,onLoad里的app.setSkin其实可以去掉。

微信小程序 实现换肤功能相关推荐

  1. 小程序服务器换肤,微信小程序实现换肤功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

  2. 为微信小程序增加换肤功能

    起源 之前,我做了一个展示类的微信小程序,本来都快要完结的了,可是突然,我才听说还要给小程序增加一个换肤功能,这个换肤功能可不是简单的写两套不同的样式表就行了,因为他要可以在后台动态替换背景,底图,文 ...

  3. 微信小程序实现换肤功能

    在手机.电脑使用频率如此高的当下,应用可以更换皮肤,以提升美观性,并减轻屏幕对眼睛的刺激,无疑对用户体验有很大的帮助 实现功能 要实现如上更换皮肤的效果,有几个思路: 1.准备皮肤相关的wxss,引入 ...

  4. 微信小程序之换肤的功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

  5. 借鉴华为HiLink实现微信小程序智能配网功能

    借鉴华为HiLink实现微信小程序智能配网功能 微信小程序介绍 微信公众号智能配网 Smartconfig实现原理 Smartconfig技术的弊端 AP配网技术的出现 微信小程序智能配网 模块端设置 ...

  6. nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

    利用Nodejs怎么实现一个微信小程序消息推送功能 发布时间:2021-01-20 13:55:29 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程 ...

  7. php 微信小程序 循环 多选,微信小程序实现多选功能

    本文为大家分享了微信小程序实现多选功能的具体代码,供大家参考,具体内容如下 代码: {{num + 1}}/{{quesyion.length}}{{question[num][0]}} A {{qu ...

  8. 如何实现消息功能_如何实现微信小程序的轮盘抽奖功能

    为了吸引用户,商家会做一些活动,利用赠送或充值的积分来进行抽奖,现在来讲下微信小程序如果实现轮盘抽奖的功能,先看下图: 上面展示的就是轮盘抽奖,一共有六个奖项,其中一个是"不中奖" ...

  9. 微信小程序可以实现很多功能

    微信小程序可以实现很多功能,今天就教大家如何利用小程序插件来实现这些功能:  1.直播 你可以在「上线了」选择一个电商(或超级云名片-电商版)小程序模板,在"应用中心"里添加小程序 ...

最新文章

  1. 深度学习在自动驾驶感知领域的应用
  2. 基于tensorflow的MNIST手写字识别
  3. 小心Redis漏洞让你服务器沦为肉鸡
  4. 你不知道的关于计算机大师 Dijkstra 的事情
  5. 队列 一种数据结构(多线程利器)
  6. php函数(检查变量、函数、键是否存在)
  7. 用JAVA制作小游戏——推箱子(三)
  8. 二分法求函数方程根的matlab实现(内附例题和代码)
  9. 安徽工业大学java实验报告_安徽工业大学java实验报告.doc
  10. 自定义view跟手移动android,Android自定义view圆并随手指移动
  11. 手机充当电脑摄像头:无他相机和DroidCam
  12. Android 投屏集成记录
  13. 春天最美的成语,都在古诗词里!
  14. 怎样用计算机算出54188,2010年考研计算机考生给教育部长的一封信(转自猫扑)...
  15. 论文阅读:Reasoning about Object Affordances in a Knowledge Base Representation
  16. ASUS AC88U 路由器开机自启方法
  17. 【2018年的最佳固态硬盘】最好的固态硬盘可以增强你的电脑
  18. Java基础语法-数据类型与idea配置
  19. 0x0EA772D7 (msvcr80.dll) 处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。。
  20. 棋盘格检测--Automatic Detection of Checkerboards on Blurred and Distorted Images

热门文章

  1. SCI英文论文写作- Latex 进阶
  2. 数据统计分析(SPSS)【2】
  3. 跨境电商运营:亚马逊运营如何分析店铺数据
  4. 实验三 基于A*迷宫的算法
  5. cadence 旋转快捷键_cadence快捷键
  6. YoutubeDNN召回的一些问题
  7. Stable Diffusion:使用Lora用二十张图片训了一个简易版薇尔莉特头像生成器(不作商用,纯纯个人兴趣,狗头保命)
  8. Python学习记录 helloPython
  9. 【机器人学】牛顿-欧拉动力学方程迭代形式
  10. 谈谈奋斗里陆涛为什么不爱米莱