Vue + Element UI 前端篇(六):更换皮肤主题

自定义主题

命令行主题工具

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 colorexport default {data() {return {chalk: '', // content of theme-chalk csstheme: 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.换肤测试

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

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

退回登录界面查看

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/99106.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年行研行业研究报告

第一章 行业概述 1.1 行研行业 行业定义为同一类别的经济活动&#xff0c;这涉及生产相似产品、应用相同生产工艺或提供同类服务的集合&#xff0c;如食品饮料行业、服饰行业、机械制造行业、金融服务行业和移动互联网行业等。 为满足全球金融业的需求&#xff0c;1999年8月…

Redis 7 第六讲 主从模式(replica)架构篇

🌹🌹🌹 此篇开始进入架构篇范围(❤艸`❤) 理论 即主从复制,master以写为主,Slave以读为主。当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。 使用场景 读写分离 容灾备份数据备份水平扩容主从架构 演示案例 注:masterauth、replicaof主…

Django学习

1、启动项目 python manage.py runserversettings.py

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书对外经济贸易大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书对外经济贸易大学图书馆

2023年高教社杯 国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

从0到1学会Git(第二部分):Git的本地操作和管理

写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域&#xff0c;分别为工作区&#xff0c;暂存区和本地仓库&#xff0c;我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为&#xff0c;cpu中&#xff0c…

前端瀑布流效果

先看效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &l…

【链表OJ 11】复制带随机指针的链表

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…

使用【宝塔+docker】在云服务器上部署基于SpringBoot 和 Dubbo RPC 的项目:踩坑记录

待部署的项目包括&#xff1a;前端front&#xff0c;服务提供者backend&#xff0c;服务消费者gateway&#xff0c;注册中心nacos 服务器信息&#xff1a;腾讯云入门级服务器2核2G&#xff08;后续有对服务器进行升级&#xff09; 部署工具&#xff1a;前端使用宝塔部署&#x…

计算机网络的故事——HTTP报文内的HTTP信息

HTTP报文内的HTTP信息 文章目录 HTTP报文内的HTTP信息一、HTTP 报文二、请求报文及响应报文的结构三、编码提升传输速率 一、HTTP 报文 HTTP报文是由多行&#xff08;CRLF作换行符&#xff09;数据构成的字符串文本&#xff0c;HTTP报文可以分为报文首部和报文主体两部分&…

【C++】拷贝对象时,编译器的偷偷优化

你知道吗&#xff1f;对于连续的”构造拷贝构造“&#xff0c;编译器其实是会默默做出优化的。&#x1f47b; 如果你不知道这个知识点的话&#xff0c;那下面这道笔试题就要失分了&#x1f635;。 本篇分享一个关于编译器优化的小知识&#xff0c;看完本篇&#xff0c;你就能…

面试题 ⑤

1、TCP与UDP的区别 UDPTCP是否连接无连接&#xff0c;即刻传输面向连接&#xff0c;三次握手是否可靠不可靠传输&#xff0c;网络波动拥堵也不会减缓传输可靠传输&#xff0c;使用流量控制和拥塞控制连接对象个数支持一对一&#xff0c;一对多&#xff0c;多对一和多对多交互通…