Elementui 动态换肤

ThemePicker.vue
<template><el-tooltip effect="dark" content="theme" placement="bottom"><el-color-picker v-model="theme" class="theme-picker" size="small" popper-class="theme-picker-dropdown" /></el-tooltip>
</template><script>const version = require('element-ui/package.json').version // element-ui version from node_modules
const ORIGINAL_THEME = '#409EFF' // default colorexport default {name: "ThemePicker",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 = newStyleconsole.log(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>

Elementui动态换肤相关推荐

  1. VUE+ElementUI项目换肤功能

    VUE+ElementUI项目换肤功能 一.固定多套主题换肤 设置页面 (views/layout.vue) themes.js (@/utils/themes) main.js css相关结构及内容 ...

  2. Element UI 自定义动态换肤(主题)

    需求背景:项目需要支持动态换主题,主题色可以随意选择(即用户想用什么颜色的主题就用什么颜色的主题):而element官网给的 自定义主题 只能是项目里写死,无法实现用户动态切换: 方式一:调接口加载C ...

  3. 7:MD5、圆形图片、动态换肤

    1.获取一个文件的MD5值(可处理大文件) public static String getSkinMD5(File file) {FileInputStream fis = null;BigInte ...

  4. asp.net动态换肤

    直接上Demo:asp.net动态换肤.zip 转载于:https://www.cnblogs.com/wifi/articles/2484600.html

  5. android 状态栏 背景色_技术一面:说说Android动态换肤实现原理

    换肤分为动态换肤和静态换肤 静态换肤 这种换肤的方式,也就是我们所说的内置换肤,就是在APP内部放置多套相同的资源.进行资源的切换. 这种换肤的方式有很多缺点,比如, 灵活性差,只能更换内置的资源.a ...

  6. hybird之web动态换肤实现

    前言 最近在重构个hybird(原生的壳包着Web页面)的UI框架,进行到了做换肤功能的阶段,所以这里是我思考的解决的方法. 预想 目前实现换肤的功能无非就两种做法. 1.写几个皮肤文件,然后切换使用 ...

  7. vue3.0+ts+element-plus多页签应用模板:element-plus按需引入与动态换肤

    目录 系列链接 一.安装element-plus 二.按需引入 1. 为什么要按需引入? 2. 如何按需引入? 3. 验证是否引入成功 三.动态换肤 1. 制作自定义主题 2. 引入自定义主题 3. ...

  8. Android插件化开发实现动态换肤

    今晚实在不想coding,于是想着整理点知识点,那么简单整理了下插件化开发实现动态更换皮肤.插件化开发大家应该不陌生或多或少用过或听过,插件化开发在项目业务拓展.模块化等方面有不小优势,当然实现一个完 ...

  9. 编程小问题系列(3)如何动态换肤

    编程小问题系列(3)动态换肤 群里有人在问如何动态换肤.也就不讲了 直接上代码. /Files/helloj2ee/mumu_userselectskin.rar 转载于:https://www.cn ...

最新文章

  1. 详解设计模式在Spring中的应用
  2. 科大讯飞语音转文字以及中文分词的Java测试代码
  3. 【计算机系统设计】实践笔记(1)数据通路构建:取指部件分析
  4. opencv java水平投影_OpenCV实现图像在水平方向上投影
  5. 电脑广告太多,请避免安装这些软件
  6. 我用Anylogic写了一个遗传算法
  7. Matlab中 regionprops和bwlabel的用法
  8. 关于周考的总结与反思
  9. Java Web基础知识之文件上传:文件上传一窥究竟
  10. 【七夕节特刊】开源世界里的爱情保卫战
  11. Prometheus node_exporter报错context deadline exceeded
  12. Multisim基础 共阴极数码管是com_k,共阳极数码管是com_a
  13. 用VS2005打开方案出现“此安装不支持该项目类型
  14. CanOpen学习笔记5-- CanFestival使用提示
  15. 《2023年金融科技趋势展望》发布,提出十大技术趋势
  16. 常用邮箱服务器地址、端口(POP3/SMTP)
  17. Java 输出所有的水仙花数
  18. PVTV2--Pyramid Vision TransformerV2学习笔记
  19. 为什么祖传代码会被称为屎山
  20. 2021靳吉朕的个人主页源码

热门文章

  1. 移动端实现蓝牙打印机打印_MBrush世界上最小的移动彩色打印机
  2. JVM内存模型与GC回收器
  3. 服务器项目有哪些,怎么部署项目到服务器?服务器的特性有哪些?
  4. linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
  5. c语言作业帮,少训练大功课C语言
  6. kali linux学习入门- Chrome浏览器安装,可以正常打开
  7. cocos2d-x的未来之旅
  8. 20190725 SecureCRT查看日志修改关键字颜色
  9. mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
  10. POJ 2287 - Tian Ji -- The Horse Racing(贪心)