美文网首页
一键换肤的实现

一键换肤的实现

作者: 雷布斯基 | 来源:发表于2021-03-23 16:06 被阅读0次

在网站迭代升级时,经常会收到更换网站配色的需求,或者提供入口,让用户自己选择页面的配色主题。
该怎么去实现这种需求呢?
我们先看看antd里面,是用的什么方式来实现的:

antd 的样式使用了 Less 作为开发语言,并定义了一系列全局/组件的样式变量,你可以根据需求进行相应调整。
...
原理上是使用 less 提供的 modifyVars 的方式进行覆盖变量,可以在本地运行 例子 查看定制效果。下面将针对不同的场景提供一些常用的定制方式。

有两种方式实现定制主题:

  • 通过webpack
    以 webpack@4 为例进行说明,通过修改 webpack.config.js 中的 less-loader ,对 options 属性进行相应配置。
// webpack.config.js
module.exports = {
  rules: [{
    test: /\.less$/,
    use: [{
      loader: 'style-loader',
    }, {
      loader: 'css-loader', // translates CSS into CommonJS
    }, {
      loader: 'less-loader', // compiles Less to CSS
+     options: {
+       lessOptions: { // 如果使用less-loader@5,请移除 lessOptions 这一级直接配置选项。
+         modifyVars: {
+           'primary-color': '#1DA57A',
+           'link-color': '#1DA57A',
+           'border-radius-base': '2px',
+         },
+         javascriptEnabled: true,
+       },
+     },
    }],
    // ...other rules
  }],
  // ...other config
}

这种方式能直接在编译代码时,直接替换对应的颜色值,但是不支持动态更换主题色。

  • 使用umi
    在项目根目录的 .umirc.tsconfig/config.ts 文件中 theme 字段进行主题配置。theme 可以配置为一个对象或文件路径。
"theme": {
  "primary-color": "#1DA57A",
},

这种方式依赖umi,而且和webpack的一样,不支持动态修改颜色值。

  • 配置 less变量文件
    建立一个单独的 less 变量文件,引入这个文件覆盖 antd.less 里的变量。
@import '~antd/lib/style/themes/default.less';
@import '~antd/dist/antd.less'; // 引入官方提供的 less 样式入口文件
@import 'your-theme-file.less'; // 用于覆盖上面定义的变量

这种方式比较灵活,没有额外的依赖。如果需要添加动态更换主题色,可以考虑在切换主题色选项后,给body上添加不同的className,实现不同主题色的展示。甚至可以通过动态加载css文件的方式进行样式的覆盖,不过要注意样式的优先级:

/**
 * 动态加载CSS
 * @param {string} url 样式地址
 */
function dynamicLoadCss(url) {
  const head = document.getElementsByTagName('head')[0]
  const link = document.createElement('link')
  link.type = 'text/css'
  link.rel = 'stylesheet'
  link.href = url
  head.appendChild(link)
}

css variables

除了上述的一些方法,还可以尝试使用css variablescss variables 的基本概念和语法可以通过 Using CSS custom properties (variables) 进行了解。

:root{
    --primary-color: #C5C5C5!important;
    --secondary-color: #6C7478!important;
    --tertiary-color: #FFFFFF!important;
    --success-color: #80b855!important;
    --warning-color: #eaca44!important;
    --error-color: #ef4d4d!important;
  }

  /* Theming */
  header{
    background-color: var(--primary-color);
  }
  div{
    color: var(--tetriary-colory);
  }

修改主题时,直接操作颜色变量。

const bodyStyles = document.body.style;
bodyStyles.setProperty('--primary-color', 'red');
bodyStyles.setProperty('--tertiary-color', 'yellow');

但该方案有一些兼容性的问题,使用前也需要进行评估:caniuse

image.png

相关文章

  • 一键换肤的实现

    在网站迭代升级时,经常会收到更换网站配色的需求,或者提供入口,让用户自己选择页面的配色主题。该怎么去实现这种需求呢...

  • 原来Android换肤如此简单

    这是一个Android换肤的库,代码量极少,支持换肤的情况还比较多,提供了以下功能: 无需重启,一键换肤效率高 支...

  • ios实现换肤功能

    最近接到了一个需求,需要实现一键换肤,由于入门尚浅,功力不够深厚,各位大佬勿喷。希望分享出来能让更多的大佬批评指...

  • Android一键换肤功能实现

    市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐的换肤功能 换肤其实就是替换资源(文...

  • 【靶点突破】网易云换肤方案探讨

    【靶点突破】网易云换肤方案探讨 老方案 网易云音乐换肤方案原理 动手实现一个网易云换肤方案的demo 动手打造换肤...

  • Android 动态换肤原理与实现

    概述 本文主要分享类似于酷狗音乐动态换肤效果的实现。 动态换肤的思路: 收集换肤控件以及对应的换肤属性 加载插件皮...

  • iOS开发之“一键换夫”

    如今,多数爱啪啪都有一键换肤的功能,即便是称呼不一样,但是都做了同样的事情,实现了同样的效果。简单高效的方式就是使...

  • 一键换肤

    常见的APP很多都要切换皮肤的功能,到了晚上,就换成黑色背景,另外用户也可以手动切换皮肤。一直好奇是怎么实现的,后...

  • Android hook技术实现一键换肤

    引子 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度....

  • 子控制器被基类控件覆盖

    基类上添加的控件延后显示问题 今天下午写东西的时候遇到一个很奇葩的问题:为了实现一键换肤功能(为了简单化,其实就是...

网友评论

      本文标题:一键换肤的实现

      本文链接:https://www.haomeiwen.com/subject/fqufhltx.html