Vue进阶(七十一):webpack实现一键动态切换主题色

yumo6662个月前 (05-03)技术文章10

前言

项目中用了element-ui,有切换主题色的需求。但官方的方式,有几个问题:

1、需要下载整个element-ui样式css,并替换其中的css样式颜色。文件较大,下载慢且影响性能。

2、只能替换element-ui本身的颜色样式,项目中自己写的颜色样式替换不掉。

3、全部的element-ui样式都重新覆盖,渲染较慢,且容易导致覆盖已有样式出现意外问题。

其实带颜色的样式规则只占了所有css中很少一部分。所以,我希望可以只替换css中与颜色相关的部分css规则。于是写了个webpack插件来实现这个功能。

基本思路

webpack构建时,在emit事件(准备写入dist结果文件时)中,将即将生成的所有css文件内容中带有指定颜色的css规则单独提取出来,再合并为一个theme-colors.css输出文件。

然后在切换主题色时,下载这个文件,并替换为需要的颜色,应用到页面上。这样,下载的样式中就只包含颜色相关的css规则,文件较小;同时它已经包含了项目中所有的css中的指定颜色样式,一次下载全部颜色样式都搞定。

经过反复测试,实现的效果比较理想。而且还可以根据需要,替换掉任意数目的颜色。理论上是只要是css颜色,都可以通过这个插件来提取颜色样式。

实施方法

下载依赖包,执行命令 npm i -D
webpack-theme-color-replacer

修改配置文件webpack.base.conf.js,修改内容如下:

const forElementUI = require('webpack-theme-color-replacer/forElementUI')
const ThemeColorReplacer = require('webpack-theme-color-replacer')
module.exports = {
 .....
  plugins: [
      //生成仅包含颜色的替换样式(主题色等)
      new ThemeColorReplacer({
          fileName: 'css/theme-colors.[contenthash:8].css',
          matchColors: [
              ...forElementUI.getElementUISeries(appConfig.themeColor),  				                           //element-ui主色系列
              '#0cdd3a',  //自定义颜色
              '#c655dd',
          ],
          changeSelector: forElementUI.changeSelector,
          isJsUgly: config.isBuild,
          // resolveCss(resultCss) { // optional. Resolve result css code as you wish.
          //     return resultCss + youCssCode
          // }
      })
  ],
   }

页面配置,配置内容如下:

<change-color></change-color> 
<el-button @click="reset" size="small" style="float: right;">Reset</el-button>
import changeColor from './changeColor.vue'
   export default {
       props: {},
       data() {
           return {};
       },
       methods: {
           reset() {
               localStorage.removeItem('theme_color')
               location.reload()
           }
       },
       computed: {},
       components: { changeColor, footCode }
   }

优化

提醒:若需要进行颜色替换的页面较多,可考虑将颜色替换组件设置为全局自定义组件。实现方式如下:

main.js中全局注册到vue

import MyBread from '@/components/common/MyBread.vue'
Vue.component("MyBread", MyBread);//全局自定义组件

在需要的组件中可以直接使用,注意需要父子传值

<MyBread level1="用户管理" level2="用户列表"></MyBread>

注:在进行主体色变换时,若需要替换的主体色较多时,在初始化新的主体色数组时,应新增相应数量的色彩元素。否则,匹配的主体色不会生效。

相关文章

生成引人注目色彩的小型Javascript脚本——randomColor

介绍randomColor是一个生成随机颜色的JavaScript脚本,对于写代码的我们来说,生成一个随机颜色或许并不复杂,但是想要生成一个比较吸引人的随机颜色可能是需要花费一番功夫的,但如果已经有人...

PC网站建设必备代码知识:HTML基础与应用技巧

在PC网站建设的相关课程里,代码扮演着至关重要的角色。只有熟练运用正确的代码,我们才能打造出功能完善、用户体验出色的PC网站。接下来,我会详细讲解在PC网站建设环节中必须了解的代码知识。HTML基础代...

html开发笔记08- 字体样式与颜色(标签的属性)

一、标签的分类:双标签和单标签双标签:就是成对出现的,类似于这种 <html> </html>单标签:就是可以单个使用的,类似于 <br> 换行标签 或 <h...

教你如何用CSS修改图片颜色(css改变背景图片颜色)

看到题目是不是吓了一跳?css竟然还有这个操作?还真是第一次听说~原理嘛,其实很简单的,用到的就是 CSS3 滤镜filter中的drop-shadow,该滤镜可以给图片非透明区域添加投影。你可以理解...

CSS 颜色体系详解(css颜色有几种表示方式)

说到 CSS 颜色,相比大家都不会陌生,本文是我个人对 CSS 颜色体系的一个系统总结与学习,分享给大家。先用一张图直观的感受一下与 CSS 颜色相关大概覆盖了哪些内容。接下来的行文内容大概会按照这个...

45个颜色网站,设计师必备指南(推介几个有颜色的网站)

颜色搭配不知所措?颜色参考找不到心仪网站?来!收下这份全面的色彩网址吧!配色是设计中非常重要的部分,好的配色不仅可以让我们的设计更加出彩,还能对用户产生情感影响,相信这些网站一定能对你们有所帮助~1....