最近react项目,用的antd框架,然后看见他的antdPro例子里面有个定制功能很帅,老大说做,那就做吧,鼓捣了一晚终于实现了。

先看预览效果吧

css换肤

入行前端的时候经常看鱼哥(张鑫旭)的博客,记得看过 这篇 ,当时很惊叹,原理其实很简单,就是我们最能想到的方式,多个css,然后用JS替换从而达到换肤效果。但是这个有局限性,比如我们用的是antdUI库,我们不可能每个颜色都去搞个css吧。当时现在我们有less,sass,而且原生的css也有变量var了,所以新时代我们有新技术达到这个效果。

less换肤

其实antd官网是有 定制主题 的,但是是静态的,通过打包之前去设置一些config,less变量从而达到定制效果,但是这显然不是我们想要的线上实时换肤效果。

最初我的思路是用node去实时生成一个webpack.config.base的配置文件,但是这样只能在开发环境实现换肤,生成环境是没办法的。然后网上有人说,用less去生成多个css文件,这不又走了以前的老路吗。最后没办法我把antdPro的源码拿来看了下,终于找到了解决办法,antd-theme-generator

步骤

  • 这里我的项目是在自己写的 webpack4-react脚手架 的基础上做修改的,如果你用的create-react-app或者其他的脚手架可能会有相应修改。
  • 安装cnpm i antd-theme-generator --save
  • index.html
<body>
<link rel="stylesheet/less" type="text/css" href="static/color.less" /> //主要是这个起作用
<script>
window.less = {
async: false,
env: 'production'
};
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js"></script>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
</body>
  • 根目录添加color.js
const path = require('path');
const { generateTheme, getLessVars } = require('antd-theme-generator'); const options = {
stylesDir: path.join(__dirname, './src/styles'), //对应具体位置
antDir: path.join(__dirname, './node_modules/antd'), //对应具体位置
varFile: path.join(__dirname, './src/styles/vars.less'), //对应具体位置
mainLessFile: path.join(__dirname, './src/styles/main.less'), //对应具体位置
themeVariables: [
'@primary-color',
'@secondary-color',
'@text-color',
'@text-color-secondary',
'@heading-color',
'@layout-body-background',
'@btn-primary-bg',
'@layout-header-background'
],
indexFileName: 'index.html',
outputFilePath: path.join(__dirname, './src/static/color.less'),
} generateTheme(options).then(less => {
console.log('Theme generated successfully');
})
.catch(error => {
console.log('Error', error);
});
  • src添加styles文件夹,里面有vars.less和main.less
//vars.less
@import "~antd/lib/style/themes/default.less";
@link-color: #00375B;
@primary-color: #00375B;
:root {
--PC: @primary-color; //color.less中加入css原生变量:--PC
} //main.less
//可为空,只是为了不报错才引入
  • package.json
//为了每次自动node color.js,所以scripts里面修改下
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "node color && webpack-dev-server --config webpack.config.dev.js",
"start": "npm run dev",
"build": "node color && webpack --config webpack.config.prod.js"
},
  • 使用,启动后直接window.less.modifyVars就可以了
window.less
.modifyVars(
{
'@primary-color': '#ee5e7b',
'@link-color': '#ee5e7b',
'@btn-primary-bg': 'ee5e7b',
}
)
.then(() => { })
.catch(error => {
message.error(`Failed to update theme`);
});
  • 最后,打包后注意放入环境后打开,否则会报错。

原理

我们发现其实他生效主要就是靠color生成一个color.less文件,然后我打开color.less文件看了下,发现原来是利用的less可以写逻辑这个特性实现的,从而通过window.less.modifyVars去动态的改变less变量。

其他

现在antd的换肤问题解决了,但是我们自己的css样式怎么办呢,比如我有个标题想用主题色,我怎么去拿到这个颜色呢。

  • 起初我是这样实现的vars.less增加
//vars.less
.primary-color{
color:@primary-color
}

这样.primary-color就会打入生成的color.less里面,然后我们就可以用了,当时这样有些地方就不方便,比如box-shadow: 1px 1px 1px 1px #d23333;,我们怎么办,难道每次都要写在vars.less里面吗

  • 所以这里我用了css的原生变量var
//vars.less
:root {
--PC: @primary-color;
}

然后就可以使用box-shadow: 1px 1px 1px 1px var(--PC);

本地保存

用户设置颜色后,可以用缓存或者localStorage保存,这就不多说了

预览效果

源码

最后

大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……

个人博客:www.yangyuetao.cn

小程序:TaoLand

antd在线换肤定制功能的更多相关文章

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

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

  2. vue 切换主题(换肤)功能

    一:先写好两个css样式放在static文件夹中 二:在index.html中添加css link链接 <link rel="stylesheet" id="sty ...

  3. Android主题换肤实现

    本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...

  4. Android主题换肤 无缝切换

    2016年7月6日 更新:主题换肤库子项目地址:ThemeSkinning,让app集成换肤更加容易.欢迎star以及使用,提供改进意见. 更新日志: v1.3.0:增加一键切换切换字体(初版)v1. ...

  5. Android实现换肤功能(二)

    前两天写的上章关于换肤的功能获得了很好的反响,今天为大家介绍另一种方式.今天实现的策略也是网友建议的,然后我自己去写了个demo,大家自己评估下相比第一种方式的优势和劣势在哪里. 简单介绍下关于第一种 ...

  6. Android中插件开发篇之----应用换肤原理解析

    一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...

  7. Android应用换肤总结

    换肤,我们都很熟悉,像XP的主题,塞班的主题.看过国外的一些技术博客,就会发现国内和国外对软件的,或者说移动开发的软件的需求的不同.国外用户注重社交.邮件等功能,国内用户则重视音乐.小说.皮肤等功能, ...

  8. Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述

    Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片. ...

  9. hybird之web动态换肤实现

    前言 最近在重构个hybird(原生的壳包着Web页面)的UI框架,进行到了做换肤功能的阶段,所以这里是我思考的解决的方法. 预想 目前实现换肤的功能无非就两种做法. 1.写几个皮肤文件,然后切换使用 ...

随机推荐

  1. [转]数据库更新(Update语句)查询

    2011-03-27 10:40:11| 分类: Database |举报|字号 订阅原文出自:http://blog.csdn.net/ylnjust02/archive/2005/12/10/54 ...

  2. Java平台标准版本

    JDK   Java Language Java Language     Tools &Tool APIs java javac javadoc jar javap jdeps Script ...

  3. Adaboost算法流程及示例

    1. Boosting提升方法(源自统计学习方法) 提升方法是一种常用的统计学习方法,应用十分广泛且有效.在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的 ...

  4. SWIFT中数字格式

    SWIFT中格式化数字比较常用的应该就是以下几种格式了. var formatter = NSNumberFormatter() //formatter.numberStyle = NSNumberF ...

  5. LSTM神经网络

    LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...

  6. jmeter随笔(31)--RandomString和Random函数使用

    在使用jmeter中,用到了一些自带的函数,后面我逐步把自己用到的分享出来,当然这些是比较简单的,也可自己看看英文文档,小怪这里只是结合自己分享. 视频介绍: https://v.qq.com/x/p ...

  7. 第三篇 makefile的伪目标

    我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下:    1.make将makefile的目标认为是一个文件:    2.make解释器比较目标文件和依赖文件的新旧关系,决定是否 ...

  8. 负margin

    负margin理论: 何谓参考线?参考线就是 margin移动的基准点,此基准点相对于box(自身)是静止的.而margin的数值,就是box相对于参考线的位移量. 一个完整的margin属性是这么写 ...

  9. OK335xS pwm device register hacking

    /************************************************************************* * OK335xS pwm device regi ...

  10. OpenCV 图像旋转实现

    1 旋转矩形 首先建议阅读图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的.其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导. 这里 ...