网站首页 > 博客文章 正文
前言
项目中用了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>
注:在进行主体色变换时,若需要替换的主体色较多时,在初始化新的主体色数组时,应新增相应数量的色彩元素。否则,匹配的主体色不会生效。
猜你喜欢
- 2024-09-14 Vue+Element UI实现断点续传、分片上传、秒传
- 2024-09-14 Vue3-笔记十.5(透传Attributes)(vue组件穿透什么意思)
- 2024-09-14 写 Vue 我建议非必要别用 watch(vue不用写html吗)
- 2024-09-14 一文看完vue3的变化之处(vue3稳定吗)
- 2024-09-14 vue中的v-model刨根问底(vue v-model.lazy)
- 2024-09-14 vue的父组件和子组件冲突问题(vue中父组件怎么调用子组件的方法)
- 2024-09-14 「面试题」如何去掉vue的url地址中的#号?及其原理?
- 2024-09-14 vue2组件系列第三十七节:Collapse 折叠面板
- 2024-09-14 前端知识点总结——Vue(前端面试题2021及答案vue)
- 2024-09-14 无意中发现 Vue3 的小技巧,帮我节省很多代码
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)