前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Vue、ElementUI的换肤解决方案

基于Vue、ElementUI的换肤解决方案

作者头像
零式的天空
发布于 2022-03-27 08:02:33
发布于 2022-03-27 08:02:33
5.4K20
代码可运行
举报
文章被收录于专栏:零域Blog零域Blog
运行总次数:0
代码可运行

写在前面

换肤这个功能,不能算是很常见,但是也是有需求的,所以这里提供几种前端的换肤解决方案,供大家参考。

本文将介绍几种基于Vue、Element-UI的换肤实现方案,力争通俗易懂,易上手,希望大家喜欢~

方案一、使用全局的样式覆盖(前端通用)

这个应该是最常见,也是大家最容易想到的,也是最容易实现的一种方案。

我们单独写一份样式表(css 文件 深空蓝.css),以一个特定的命名开头(比如 .blue-theme),然后在这个 css 文件中,完成我们第二套皮肤的样式代码,然后当我们点击换肤的时候,就将 blue-theme 这个 class 添加到 body 标签中,那么这个时候,我们的换肤效果就出来了。

当我们这里点击深空蓝的时候,将 class science-blue 添加到 body 上,点击青铜绿的时候,就将 science-blue 去掉,因为我们默认的就是青铜绿。

方案二、自定义自己的Element-ui配色

默认的 Element 的配色是:

**蓝 色****绿 色****橙 色****红 色****灰 色**

Element-UI 还提供了了一个自定义的 配色工具 以及 配置页面,通过这个工具或者这个页面,我们可以自定义上面五种主色调以及辅助色。

配好以后,如果是工具就生成,如果是网页就下载。得到一个样式文件,这就是我们配置好的主题样式文件。

保持 css文件与 fonts 目录的关系不变(ps:这点很重要),将其放入我们的项目中。(你可以将这个css 文件改成你喜欢的名字,比如我改成了叫:theme-summer.css

然后在我们项目的 main.js 中,注释掉 Element-UI 的原来 css 文件引入,引入我们刚才放进项目中的 css 文件。

这个时候,项目中关于 Element-UI 的颜色,就变成了刚才我们自定义配置的颜色配色了。(下面是我自定义的一套颜色,你们觉得如何?)

但是,你发现没,这样只是将我们项目中的 Element-UI 的默认配色改成我们想要的;但是我们要做的是换肤功能,希望颜色是可以切换的。

所以,我们还是用上面的方法,给这个生成的css文件里面的每一个 css 样式加上一个独特的命名前缀,然后换肤的时候,就将这个 class 添加到 body 上面,如此一来,也能实现很丰富的换肤功能(因为我们可以自己配很多套好看的配色)

现在摆在眼前的一个需要解决的问题是:这个 css 文件加命名空间怎么加?

我们看一下这个工具生成的,或者 配置页面 导出的这个 css 文件,混淆压缩的代码,手动给每一个样式外面包裹一个 class 来做命名空间是不现实的,所以这里要用到一个 gulp 插件 gulp-css-wrap ,可以帮助我们完成这个结果。

首先: npm i gulp gulp-clean-css gulp-css-wrap -D

然后,编写 gulpfile.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// gulpfile.js

var path = require('path')
var gulp = require('gulp')
var cleanCSS = require('gulp-clean-css')
var cssWrap = require('gulp-css-wrap')

var customThemeName = '.theme-summer'

gulp.task('default', function() {
  return gulp.src( path.resolve('./index.css'))
    .pipe(cssWrap({selector: customThemeName}))
    .pipe(cleanCSS())
    .pipe(gulp.dest('dist'))
})

然后运行 gulp

这样就得到了一个以 .theme-summer 为命名空间的自定义主题了。

加完以后,我们按照前面介绍的切换 body 元素的 class 的方法,就可以实现皮肤切换的功能了。

方案三、快速改变网站颜色

依据 Element 官网所介绍,Element 使用 SCSS 编写,如果你的项目也使用了 SCSS,那么可以直接在项目中改变 Element 的样式变量。新建一个 element-variables.scss 样式文件。(温馨提示:请确保你安装了 node-sasssass-loader

element-variables.scss 文件,这里就不贴出来了,具体可以看这里:element-variables.scss,这个文件里面定义了很多颜色变量

这种方法使用起来是简单的,你只需将其引入

修改里面的颜色变量即可生效。

这种方法是快捷的,修改几个颜色变量即可生效。(然后就可以部署啦~)

这里有一个问题,如何在 js 中修改这个 `element-variables.scss` 文件里面的变量?如果可以实现,那么就可以实现实时动态换色了。

补充说明: js 修改 scss 变量是有方案的,但是在我们项目中无法做到动态换颜色,为什么呢?因为我们项目中所有的 css 预编译语言(sass,less,stylus)最终都会编译成 css;也就是说,打包后的项目中只有编译后的 css 文件。那么你 js 改 scss 变量的方法在打包后的项目中是不起作用的。

方案四、实时更换主色调

前面已经介绍了几种方法可以做到换肤,但都是在我们的限定提供的几个皮肤范围内换肤;但我们有一个需求是,弹出一个颜色选择器,然后我们选了什么颜色,页面的主色调就立马改成什么颜色。

ElementUI 官网中有实现动态换肤,它能让用户自定义颜色值,而且展示效果也更加优雅。 我们来看看他是怎么实现的(这里引用的是官方的 实现解释)

  • 获取当前版本的 Element-UI 的样式文件(在线 XHR 获取)
  • 根据用户选择的主题色,生成一系列对应的颜色(比如,选择绿色,生成不同程度的浅绿,深绿…)
  • 颜色替换(用刚刚生成的颜色来替换样式文件中的颜色)
  • 直接在页面上加 style 标签,把生成的样式填进去

我们一起来看一下技术实现细节吧,强烈建议你打开代码一起来看: [https://github.com/Neveryu/vue-cms/blob/master/src/views/theme/index.vue#L167-L297](https://github.com/Neveryu/vue-cms/blob/master/src/views/theme/index.vue#L167-L297))

1、首先我们需要拿到通过 package.json 拿到 element-ui 的版本号,根据该版本号去请求相应的样式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 如果没有chalk就是第一次换颜色,需要远程获取css文件,赋值给chalk
// 后续的换颜色操作,就不用远程获取了
if (!this.chalk) {
    const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
    await this.getCSSString(url, 'chalk')
}

getCSSString 方法是一个常用 XHR,用来获取远程 css 资源文件。

2、根据用户选择的颜色,生成相应的颜色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 传入一个颜色的HEX,得到这个颜色的深浅颜色数组
 * 我们知道,我们默认的主色调蓝色,在实际使用中,还需要对应的浅蓝和深蓝
 * @param  {[string]]} theme [color]
 * @return {[array]}       [对应的深浅颜色数组]
 */
getThemeCluster(theme) {
    // 具体看代码,这里就不写了
    // ...
}

3、颜色替换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/* 更新样式 - 使用新的颜色变量替换之前的 */
updateStyle(style, oldCluster, newCluster) {
  let newStyle = style
  oldCluster.forEach((color, index) => {
    newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])
  })
  return newStyle
}

4、在页面上加 style 标签,把生成的样式填进去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let styleTag = document.getElementById(id)
if (!styleTag) {
  styleTag = document.createElement('style')
  styleTag.setAttribute('id', id)
  document.head.appendChild(styleTag)
}
styleTag.innerText = newStyle

第一次换颜色的时候,需要创建一个 style 标签,添加到 body 中,后面的换颜色,就不用了。

OK啦,看下效果:

【在线演示:[vue-cms](https://neveryu.github.io/vue-cms/index.html)】 【源代码:[github.com/Neveryu/vue-cms](https://github.com/Neveryu/vue-cms/blob/master/src/views/theme/index.vue)】

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
第四种方案的代码哪里可以看啊,你放的地址打开是404
第四种方案的代码哪里可以看啊,你放的地址打开是404
回复回复点赞举报
好思路
好思路
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题
首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。
朝雨忆轻尘
2019/06/18
1.5K0
技巧 | 从Element项目中探索任意主题色设定
https://segmentfault.com/a/1190000038436829
@超人
2021/02/26
1.6K0
技巧 | 从Element项目中探索任意主题色设定
实战教程 | 微信小程序动态换肤解决方案
在开发小程序的时候,尤其是开发第三方小程序,我们作为开发者,只需要开发一套模板,客户的小程序对我们进行授权管理,我们需要将这套模板应用到对方的小程序上,然后由我们进行发版审核即可;
极乐君
2021/07/05
2.4K0
小程序换肤
导语 换肤,对于前端来说不算常见,却也肯定不陌生。但是大家有考虑过小程序端的换肤吗?今天我们就来聊一聊小程序的换肤。 前言 有这么一句老话说得好“人靠衣装佛靠金装”,应用的UI风格的重要性犹如一个人的装扮风格。一个应用经过UI设计师们的精心“打扮”同样能为App赚很高的“回头率”。 就像女人的衣柜里永远少一件衣服一样,一个应用可能也少一套皮肤,这里就涉及到换肤了。说起换肤,对于前端来说不算常见,却也肯定不陌生。所谓的换肤,无非就是颜色值的更换,在一般的前端项目中,实现的方法有很多种。但是大家有考虑
腾讯VTeam技术团队
2020/11/30
2.1K0
一款超级漂亮的 Vue + Element UI 后台管理系统解决方案 | 开源项目
该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(Web Management System)开发。基于 vue.js,使用 vue-cli3 脚手架,引用 Element UI 组件库,方便开发快速简洁好看的组件。分离颜色样式,支持手动切换主题色,而且很方便使用自定义主题色。
终码一生
2022/04/14
2.2K0
一款超级漂亮的 Vue + Element UI 后台管理系统解决方案 | 开源项目
如何利用 SCSS 实现一键换肤
在项目开发过程中,我们有时候遇到需要更换站点主题色的需求。乃至于 APP 底部的 banner 中的 icon、文案和背景图都是运营线上可配置的。还有的功能比如更换系统字体大小等。
政采云前端团队
2022/03/29
2.9K0
如何利用 SCSS 实现一键换肤
Vue + Vuex + Element UI实现动态全局主题颜色
经常用Element UI的小伙伴,应该知道,Element UI官方文档,可以自由更换主题。那么,我们怎么把这个功能用到自己项目中呢?其实官方文档也有所说明,这里对其进行更详细,更明确的说明,同时提供简单示例,供大家参考。
Javanx
2019/09/04
4K0
Vue + Vuex + Element UI实现动态全局主题颜色
Vue2 后台管理系统解决方案
之前在公司用了Vue + Element组件库做了个后台管理系统,基本很多组件可以直接引用组件库的,但是也有一些需求无法满足。像图片裁剪上传、富文本编辑器、图表等这些在后台管理系统中很常见的功能,就需要引用其他的组件才能完成。从寻找组件,到使用组件的过程中,遇到了很多问题,也积累了宝贵的经验。所以我就把开发这个后台管理系统的经验,总结成这个后台管理系统解决方案。
全栈程序员站长
2022/07/07
1.2K0
Vue2 后台管理系统解决方案
element主题更换详解
执行后会有一个scss配置文件element-variables.scss,内部包含了主题所用到的所有变量
RtyXmd
2018/08/30
4.6K0
element主题更换详解
vue 模块化开发
vue init webpack appname:vue 脚手架使用 webpack 模板初始化一个 appname 项目
一个风轻云淡
2022/11/15
1.2K0
vue 模块化开发
DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode
暗黑模式实现,最初的设计,就是参考之前的主题模式。所谓多套主题/配色/皮肤,就是我们很常见的换肤功能。换肤简单的实现就是更换 css实现不同样式呈现不同肤色。
周陆军
2020/12/11
3.5K0
【Vue_07】ElementUI
一、命令行安装 1. 命令 npm i element-ui -S 2. 导入相关依赖(main.js) // 导入组件库 import ElementUI from "element-ui" // 导入样式 import "element-ui/lib/theme-chalk/index.css" // 注册为全局组件 Vue.use(ElementUI) 3. 使用 element-ui 提供的组件 拷贝至对应位置 4. 按需导入 // 创建 plugins/element.js import
用户8250147
2021/02/04
3650
【Vue_07】ElementUI
element-ui 简单二次开发
当前项目为vue 2.6 + element-ui 2.14.1, 我们需要开发一个类似表格的表单组件, 可以看到除了表格样式以外,我们还需要嵌套各种表单组件,而组件功能基本与框架功能一致,如果对每个组件都做独立开发,显然是不现实的。所以我们的目标一定是尽量使用原组件
copy_left
2020/12/17
1.9K0
从 Element UI 源码的构建流程来看前端 UI 库设计
由于业务需要,近期团队要搞一套自己的UI组件库,框架方面还是Vue。而业界已经有比较成熟的一些UI库了,比如ElementUI、AntDesign、Vant等。
前端森林
2020/06/28
2K0
在线动态换肤思路
很早之前就在想在线换肤的实现思路,主要是之前有个项目有换肤,连布局图片都不一样,无能为力,只好写不同页面,然后通过打包的时候配置删除和替代文件实现,但是在线换肤还是没去做。今天分享一下换肤的思路,只是单纯的颜色替换,没有包括连布局图片都不一样的换肤。
wade
2020/09/22
1.1K0
在线动态换肤思路
前端换肤的N种方案,请收下
原文链接:https://juejin.im/post/5e92ad7a518825736c5b91cd
ConardLi
2020/06/29
2.3K0
前端换肤的N种方案,请收下
Vue之设置视频为背景图
前排提示:这个是基于vue的 添加依赖 找到项目的package.json文件在dependencies中加入依赖 json "vue-video": "^0.1.7", "vue-video-player": "^5.0.2", "video.js": "^7.10.2", "videojs-contrib-hls": "^5.15.0", 效果如下: json "dependencies": { "axios": "0.18.0", "echarts": "^4.1.0", "elemen
shaoshaossm
2023/02/03
2.2K0
Element-UI 快速入门指南
在开始使用 Element-UI 之前,我们需要先安装它。可以使用 npm 或 yarn 进行安装。
IT_陈寒
2024/05/24
1.2K0
Element-UI 快速入门指南
vue2使用ElementUI
打不着的大喇叭
2024/03/11
1310
vue2使用ElementUI
关于前端主题切换的思考和现代前端样式的解决方案落地
网站或者应用一键切换主题(简称:换肤)功能,对每个前端开发者来说已经非常常见了,通常是一深一浅,或自由组合衍生出众多主题,或任意主题,这时候,设计一个工程化主题切换功能,并梳理现代前端样式的解决方案显得尤为重要。
ConardLi
2023/01/09
1.6K0
关于前端主题切换的思考和现代前端样式的解决方案落地
相关推荐
Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验