当前位置:   article > 正文

前端主题切换方案(react+antd)_antd切换主题

antd切换主题

背景

最近有个需求,要给系统做个主题切换功能,网上关于主题的方案挺多,准备做一些调研,因为项目是react+antd的一个后台系统,开始从antd官方文档中开始着手,做下整理对比,最后选一个最佳的方案用于实践。

技术选型

less.modifyVars

antd提供的一种主题切换方式,通过配置webpack的less-loader,添加modifyVars对象,官方已经内置了一些主题变量,每次构建时更换对应色值即可实现主题切换。

  1. // webpack.config.js
  2. module.exports = {
  3.   rules: [{
  4.     test/\.less$/,
  5.     use: [{
  6.       loader: 'style-loader',
  7.     }, {
  8.       loader: 'css-loader'// translates CSS into CommonJS
  9.     }, {
  10.       loader: 'less-loader'// compiles Less to CSS
  11. +     options: {
  12. +       lessOptions: { // 如果使用less-loader@5,请移除 lessOptions 这一级直接配置选项。
  13. +         modifyVars: {
  14. +           'primary-color''#1DA57A',
  15. +           'link-color''#1DA57A',
  16. +           'border-radius-base''2px',
  17. +         },
  18. +         javascriptEnabled: true,
  19. +       },
  20. +     },
  21.     }],
  22.     // ...other rules
  23.   }],
  24.   // ...other config
  25. }

Link标签替换

插入一个新的Link标签,用新的css链接替换原来的样式,这种方案实现上没有难度,也没有兼容问题,需要新建一套完全一样的样式类名,然后替换其中的色值,缺点是工作量太大,尤其开发中的项目来说,扩展性比较差,后期更换样式类名,需要同步更改主题样式文件:

theme2

CSS Variable

另外一个是用ConfigProvider,需要注意在antd@4.17.0-alpha.0 版本起才支持,而且webpack中如果使用了 babel-plugin-import,需要将其去除。本质是通过CSS Variable(css变量)实现,将颜色赋值变量,最大的问题是——有兼容性问题,在IE浏览器中不支持。补充:antd好像对CSS Variable做了兼容处理。

项目内需要引入使用变量样式文件:

  1. -- import 'antd/dist/antd.min.css';
  2. ++ import 'antd/dist/antd.variable.min.css';

调用部分:

  1. import { ConfigProvider } from 'antd';
  2.  
  3. ConfigProvider.config({
  4.   theme: {
  5.     primaryColor'#25b864',
  6.   },
  7. });

css-vars-ponyfill

为弥补css variable的不足,css-vars-ponyfill做了一套兼容处理,原理大概是在ie等不支持css var的浏览器中将var()中的变量值替换为对应色值,在支持css var的浏览器中不做处理。另外是操作dom,所以在node环境中无法使用。css-vars-ponyfill主要暴露了一个cssVar方法,方法入参如下:

  1.     export interface CSSVarsPonyfillOptions {
  2.         rootElement?: Document|HTMLElement;
  3.         shadowDOM?: boolean;
  4.         include?: string;
  5.         exclude?: string;
  6.         variables?: {[keystring]: string};   // 颜色键值对
  7.         onlyLegacy?: boolean;
  8.         preserveStatic?: boolean;
  9.         preserveVars?: boolean;
  10.         silent?: boolean;
  11.         updateDOM?: boolean;
  12.         updateURLs?: boolean;
  13.         watch?: null|boolean;
  14.         onBeforeSend?(xhrXMLHttpRequestelmHTMLLinkElement|HTMLStyleElementurlstring): void;
  15.         onError?(messagestringelmHTMLLinkElement|HTMLStyleElementxhrXMLHttpRequesturlstring): void;
  16.         onWarning?(messagestring): void;
  17.         onSuccess?(cssTextstringelmHTMLLinkElement|HTMLStyleElementurlstring): void;
  18.         onComplete?(cssTextstringstyleElmsHTMLStyleElement[], cssVariables: {[keystring]: string}, benchmarknumber): void;
  19.         onFinally?(hasChangedbooleanhasNativeSupportbooleanbenchmarknumber): void;
  20.     }

主要的参数:variables:颜色键值对,切换主题即更换不同的variables

技术对比

less.modifyVars是静态更改主题,适合定制化主题,构建完成之后不能再变;css标签的方法工作量太大,扩展性差;css variable比较灵活,但有兼容问题,相对于css标签方法,扩展性好点;css-vars-ponyfill是css variable的优化版,解决了兼容问题,虽然会有服务端渲染的问题,如果项目是在浏览器dom环境下无伤大雅。

补充

做了一个简单的demo,分别用三种方式实现主题切换:css标签,css variable,css-vars-ponyfill。GitHub地址:react-antd-theme

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/133596
推荐阅读
相关标签
  

闽ICP备14008679号