自定义主题

命令行主题工具

1.安装主题工具

首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。

yarn add element-theme --dev

2.安装chalk主题

安装白垩主题,可以从 npm 安装或者从 GitHub 拉取最新代码,这里从 npm 安装。

yarn add element-theme-chalk -D

3.初始化变量文件

主题生成工具安装成功后,如果全局安装可以在命令行里通过 et 调用工具,如果安装在当前目录下,需要通过 node_modules/.bin/et 访问到命令。执行 -i 初始化变量文件。默认输出到 element-variables.scss,当然你可以传参数指定文件输出目录。

node_modules/.bin/et -i

执行命令

命令执行成功之后,会在根目录生成 scss文件 element-variables.scss 。

4、修改主题色

在 element-variables.scss 文件里修改 $–color-primary:#4b5f6e,即你想要的主题颜色

5、编译主题

执行主题编译命令生成主题,根目录会生成一个theme的文件夹 。

node_modules/.bin/et

6、引入自定义主题

把生成的主题按颜色改名放置 src/theme 目录下。

在 main.js 中 import ‘所在路径/index.css’。

7、效果展示

重新加载后,我们看到按钮颜色已经不是默认的蓝色了。

动态换肤器方式

1. 在下图位置添加封装的换肤组件。

index.vue

<template><el-color-pickerclass="theme-picker"popper-class="theme-picker-dropdown"v-model="theme"></el-color-picker>
</template><script>const version = require('element-ui/package.json').version // element-ui version from node_modules
const ORIGINAL_THEME = '#409EFF' // default color

export default {data() {return {chalk: '', // content of theme-chalk css
      theme: ORIGINAL_THEME}},watch: {theme(val, oldVal) {if (typeof val !== 'string') returnconst themeCluster = this.getThemeCluster(val.replace('#', ''))const originalCluster = this.getThemeCluster(oldVal.replace('#', ''))console.log(themeCluster, originalCluster)const getHandler = (variable, id) => {return () => {const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace('#', ''))const newStyle = this.updateStyle(this[variable], originalCluster, themeCluster)let styleTag = document.getElementById(id)if (!styleTag) {styleTag = document.createElement('style')styleTag.setAttribute('id', id)document.head.appendChild(styleTag)}styleTag.innerText = newStyle}}const chalkHandler = getHandler('chalk', 'chalk-style')if (!this.chalk) {const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`this.getCSSString(url, chalkHandler, 'chalk')} else {chalkHandler()}const styles = [].slice.call(document.querySelectorAll('style')).filter(style => {const text = style.innerTextreturn new RegExp(oldVal, 'i').test(text) && !/Chalk Variables/.test(text)})styles.forEach(style => {const { innerText } = styleif (typeof innerText !== 'string') returnstyle.innerText = this.updateStyle(innerText, originalCluster, themeCluster)})this.$message({message: '换肤成功',type: 'success'})}},methods: {updateStyle(style, oldCluster, newCluster) {let newStyle = styleoldCluster.forEach((color, index) => {newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])})return newStyle},getCSSString(url, callback, variable) {const xhr = new XMLHttpRequest()xhr.onreadystatechange = () => {if (xhr.readyState === 4 && xhr.status === 200) {this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')callback()}}xhr.open('GET', url)xhr.send()},getThemeCluster(theme) {const tintColor = (color, tint) => {let red = parseInt(color.slice(0, 2), 16)let green = parseInt(color.slice(2, 4), 16)let blue = parseInt(color.slice(4, 6), 16)if (tint === 0) { // when primary color is in its rgb spacereturn [red, green, blue].join(',')} else {red += Math.round(tint * (255 - red))green += Math.round(tint * (255 - green))blue += Math.round(tint * (255 - blue))red = red.toString(16)green = green.toString(16)blue = blue.toString(16)return `#${red}${green}${blue}`}}const shadeColor = (color, shade) => {let red = parseInt(color.slice(0, 2), 16)let green = parseInt(color.slice(2, 4), 16)let blue = parseInt(color.slice(4, 6), 16)red = Math.round((1 - shade) * red)green = Math.round((1 - shade) * green)blue = Math.round((1 - shade) * blue)red = red.toString(16)green = green.toString(16)blue = blue.toString(16)return `#${red}${green}${blue}`}const clusters = [theme]for (let i = 0; i <= 9; i++) {clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))}clusters.push(shadeColor(theme, 0.1))return clusters}}
}
</script><style>
.theme-picker .el-color-picker__trigger {vertical-align: middle;
}.theme-picker-dropdown .el-color-dropdown__link-btn {display: none;
}
</style>

2.直接在组件中引用

在 Home.vue 中引入

在语言切换左边添加换肤组件

3.换肤测试

点击组件,选择一个颜色确定

我们看到相关主题颜色即刻生效

退回登录界面查看

源码下载

后端:https://gitee.com/liuge1988/kitty

前端:https://gitee.com/liuge1988/kitty-ui.git


作者:朝雨忆轻尘
出处:https://www.cnblogs.com/xifengxiaoma/ 
版权所有,欢迎转载,转载请注明原文作者及出处。

Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题相关推荐

  1. Vue + Element UI 实现权限管理系统 前端篇(八):管理应用状态

    使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题.收缩 ...

  2. Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装

    组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...

  3. Vue + Element UI 实现权限管理系统 前端篇(九):接口格式定义

    接口请求格式定义 前台显示需要后台数据,我们这里先把前后端交互接口定义好,没有后台的时候,也方便用mock模拟. 接口定义遵循几个规范: 1. 接口按功能模块划分. 系统登录:登录相关接口 用户管理: ...

  4. Vue + Element UI 实现权限管理系统:页面权限控制(菜单 + 按钮)

    权限控制方案 既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦. 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作 ...

  5. Vue + Element UI 实现权限管理系统(更换皮肤主题)

    自定义主题 命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动. yarn add ele ...

  6. vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条号.百家号等 ...

  7. vue+element ui 项目 后台管理系统

      前端界面 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF ...

  8. Vue + Element UI 实现 登陆注册基本demo实例

    Vue + Element UI 实现权限管理系统 前端篇(二):Vue + Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder ...

  9. 【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Table表格增删查改、Pagination分页、搜索框

    文章目录 目标 代码 0.结构 1.按钮-删除 2.按钮-编辑 3.debug 4.样式 5.分页Pagination:功能 6.分页Pagination:样式 7.搜索框:功能 8.搜索框:样式 总 ...

最新文章

  1. Oracle优化之表连接方式
  2. 实现windows的负载均衡
  3. N的阶乘末尾有多少个0
  4. 2013届华为校园招聘机试题
  5. jdbc thin连接oracle10,setSavepoint方法报错解决办法
  6. inspect python_python之inspect模块
  7. 什么是地址译码 理解二进制编码
  8. learn opengl 中文_LearnOpenGL CN
  9. python tablewidget 颜色_更改QTableWidget的默认选择颜色,并使其半透明
  10. 十大电子元器件及其相关基础知识
  11. [离线]ps4共享屏幕到笔记本
  12. 计算机基础教程(一)
  13. 显卡驱动设备状态代码31
  14. win7右键显示隐藏文件及扩展名
  15. 数据结构实现学生信息管理系统功能
  16. Flash打造拟真生态水族鱼缸
  17. QPainterPath
  18. vue 中的input
  19. android 隐藏wifi密码,手机怎么连接隐藏的wifi无线网络
  20. 线下python培训班哪个好

热门文章

  1. iphonex计算机隐藏功能,iPhoneX如何隐藏小白条 iPhoneX隐藏小白条方法【步骤介绍】...
  2. ZBrush中的笔触
  3. linux串口特殊字符不能接收
  4. 学大伟业DAY2模拟赛
  5. 《舞!舞!舞!》读后感
  6. 【Vulnhub】之JIS-CTF-VulnUpload-CTF01
  7. java依赖什么意思,JavaEE中的依赖性——依赖查找
  8. 红米note10和红米note9哪个值得买
  9. 有限差分方法的matlab编程,有限差分方法的MATLAB编程(1)
  10. 计算机对幼儿教育发展的优点,音乐教育对幼儿发展的影响