最近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. prayer OJ M

    这一题是一把辛酸泪啊...一个半小时ac的... 首先,考虑到如果要一条路径最小,那么肯定是没有值大于等于3的 显然如果有一个大于等于3的,那么这个数把路径分成两份,一份有k个,一个n-k-1个 那么 ...

  2. Oracle 固定执行计划-使用SPM(Sql Plan Management)固定执行计划

    固定执行计划-使用SPM(Sql Plan Management)固定执行计划 转载自:http://www.lunar2013.com/2016/01/固定执行计划-使用spm%EF%BC%88sq ...

  3. 使用 ADOX 将 Table 添加到 Catalog 时报“类型无效”的原因和解决方法

    http://blog.csdn.net/kfhzy/article/details/6020283 http://blog.csdn.net/kfhzy/article/details/602054 ...

  4. python 安装包查看

    pip freeze可以查看已经安装的python软件包和版本 pip list 也可以

  5. L213

    The world lost seven astronauts of Space Shuttle Columbia(哥伦比亚号航天飞机) this month. It broughthome the ...

  6. Bugzilla使用规范

    登陆Bugzilla Bugzilla登陆地址: http://172.21.8.39:21500/manual/ 账号:XXX@sim.com 密码:123456 Bugzilla简介 Bugzil ...

  7. 人脸对齐matlab实现-FaceAlignment 3000fps

    前言 最近研读了孙剑团队的Face Alignment at 3000fps via Regressing Local Binary Features这篇paper,基于matlab进行实现. 实现原 ...

  8. Photoshop通道抠出散乱的儿童头发

    抠图之前仔细分析是必不可少的.要了解清楚需要抠取部分的构成,然后选择最快捷的方法.教程素材图片人物头发色调比较单一,背景色也比较单一,用通道抠图是非常快捷的. 最终效果1 最终效果2 原图 一.复制图 ...

  9. Linux系统部署Web项目

    首先,需要有java环境和tomcat服务器,至于这个怎么安装,可以参考:云服务器 java+tomcat 部署与配置 项目部署 有两个大步骤: Step1 将已经写好的web项目打包成war包,在I ...

  10. hdu2073-2078

    hdu2073 数学 #include<stdio.h> #include<math.h> double len(double x){ )*(x+)); } int main( ...