首页 > 其他分享 >element-plus 动态自定义主题颜色

element-plus 动态自定义主题颜色

时间:2023-11-08 14:12:41浏览次数:47  
标签:const 自定义 color element rgb plus result let hexs

颜色的HEX格式

颜色的HEX格式是#+六位数字/字母,其中六位数字/字母是一种十六进制的表达方式。这六位分别两个一组,从左到右分别表示绿00表示最小,十进制是0FF表示最大,十进制是255。通俗点讲,某个颜色的数值越大,包含这个颜色就越多。如:#000000-黑色、#FFFFFF-白色、#FF0000-红色、#00FF00-绿色、#0000FF-蓝色。

HEX格式颜色变亮、变暗

通过上文的介绍,我们可以知道Elementhover颜色变亮了,即颜色的数值变大了,那我们只要对要修改的颜色数值变大即可。那就需要用到以下的方法:

HEX格式转RGB格式

hex2Rgb(color) {
  color = color.replace('#', '')
  const result = color.match(/../g)
  for (let i = 0; i < 3; i++) {
    result[i] = parseInt(result[i], 16)
  }
  return result
}

RGB格式转HEX格式

rgb2Hex(r, g, b) {
  const hexs = [r.toString(16), g.toString(16), b.toString(16)]
  for (let i = 0; i < 3; i++) {
    if (hexs[i].length === 1) {
      hexs[i] = '0' + hexs[i]
    }
  }
  const result = '#' + hexs.join('')
  return result
}

使颜色变亮

lighten(color, level) {
  const rgb = hex2Rgb(color)
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2])
  return result
}

使颜色变暗

darken(color, level) {
  const rgb = hex2Rgb(color)
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor(rgb[i] * (1 - level))
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2])
  return result
}

解决问题

在修改主色的时候将对应的其他CSS变量进行变亮或者变暗即可。一般这种主题都是会存储浏览器Storage中,可以结合实际情况配合vuex或者pinia使用。

// utils.js
export function hex2Rgb(color) {
  color = color.replace('#', '')
  const result = color.match(/../g)
  for (let i = 0; i < 3; i++) {
    result[i] = parseInt(result[i], 16)
  }
  return result
}
export function rgb2Hex(r, g, b) {
  const hexs = [r.toString(16), g.toString(16), b.toString(16)]
  for (let i = 0; i < 3; i++) {
    if (hexs[i].length === 1) {
      hexs[i] = '0' + hexs[i]
    }
  }
  const result = '#' + hexs.join('')
  return result
}
export function lighten(color, level) {
  const rgb = hex2Rgb(color)
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2])
  return result
}
export function darken(color, level) {
  const rgb = hex2Rgb(color)
  for (let i = 0; i < 3; i++) {
    rgb[i] = Math.floor(rgb[i] * (1 - level))
  }
  const result = rgb2Hex(rgb[0], rgb[1], rgb[2])
  return result
}
// index.vue
<template>
  <div class="container">
    <el-button>Default</el-button>
    <el-button v-for="item in types" :key="item" :type="item">{{ item }}</el-button>
    <hr>
    <el-radio-group v-model="radio" @change="radioChangeHandle">
      <el-radio v-for="item in types" :key="item" :label="item" size="large">{{ item }}</el-radio>
    </el-radio-group>
    <br>
    <el-color-picker v-model="color" @change="colorChangeHandle" color-format="hex" :show-alpha="false" />
  </div>
</template>

<script setup>
import { ref } from 'vue'

import { lighten, darken } from '@/utils'

const el = document.documentElement

const types = ref(['primary', 'success', 'info', 'warning', 'danger'])

const radio = ref('primary') 

const color = ref(getComputedStyle(el).getPropertyValue(`--el-color-${radio.value}`))

const radioChangeHandle = () => {
  const value = getComputedStyle(el).getPropertyValue(`--el-color-${radio.value}`)
  color.value = value
}

const colorChangeHandle = (value) => {
  el.style.setProperty(`--el-color-${radio.value}`, value)
  for (let i = 1; i <= 9; i++) {
    el.style.setProperty(`--el-color-${radio.value}-light-${ i }`, lighten(value, i / 10))
    el.style.setProperty(`--el-color-${radio.value}-dark-${ i }`, darken(value, i / 10))
  }
}
</script>

<style>
.container {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -100%);
  width: 50%;
  text-align: center;
}
</style>

标签:const,自定义,color,element,rgb,plus,result,let,hexs
From: https://www.cnblogs.com/7c89/p/17817265.html

相关文章

  • @RequestBody接收Json参数 用自定义注解对Vo对象中Date类型日期格式校验
    @RequestBody接收Json参数|用自定义注解对Vo对象中Date类型日期格式校验问题描述昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题。要求输入的日期格式是:yyyy-MM-ddHH:mm:ss,Vo中使用的注解如下:@DateTimeFormat(pattern=”yyyy-MM-ddHH:mm:ss”)测试同事输入下面两种......
  • 让自定义的容器,也能基于范围循环
      C++11起,引入了基于范围的for循环这一特性,有什么好处呢?它有时可以大大地简化遍历容器的操作,比如说STL的vector。std::vectorv{1,2,3};std::vector<int>::iteratorit=begin(v);for(;it!=end(v);++it)std::cout<<*it<<'\n';  这是使用了迭代器的写法,......
  • NETCore,离线部署Linux ,离线部署 libgdiplus
    背景错误信息:Unabletoloadsharedlibrary‘libgdiplus‘oroneofitsdependencies解析:libgdiplus是Linux支持Netcore的图形库,比如System.Drawing要用,在线安装都容易,离线就处理起来恶心了以下事爬坑记录,思路:在有网的Linux下载依赖包,然后再拷贝rmp包去离线服务器安装参......
  • mybatisplus轻松完成一次模糊+分页查询
    之前一直用mybatis+pageinfo完成模糊+分页查询,还需要手写sql语句,之前一直没做尝试,今天试了试mybatisplus一个人完成模糊+分页,挺简单的有一个小插曲是,我的前端接受的data中,data.list变成了data.record,一开始没有查到数据,让我差点怀疑自己哪里写错了,在使用sout的检查中我发现servic......
  • Element Plus 动态表单验证
    <divv-for="(item,index)informList":key="index"><el-form:ref="(el)=>{formRefs(el)}":model="item"><el-form-item><el-inputv-model="item.name"></el-input......
  • 通过计算巢轻松部署ROS自定义资源
    概述阿里云资源编排服务ROS(ResourceOrchestrationService)可以帮助您简化云计算资源的管理。遵循ROS定义的模板规范,您可以定义所需云计算资源的集合及资源间的依赖关系。ROS可以自动完成所有资源的创建和配置,实现自动化部署和运维。ROS不仅能够编排阿里云资源,还支持自定义资源......
  • byte[]、list<byte>数组类型的几个自定义扩展方法
    byte[]、list<byte>数组类型的几个自定义扩展方法。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceiPublic.类型扩展方法{///<summary>///类型的扩展方法,用起来方便的///修改记录:///20230415,海......
  • 通过POWERSHELLPLUS示例脚本学PowerShell
    在AD的管理脚本中,基本都是通过ADSI接口获取AD操作接口,其中涉及PowerShell的原生cmdlets的都大同小异。今天看看AD下的Function中的脚本,有新东西可以学习。##=====================================================================##Title:Add-IADGroupMember##Descr......
  • element-ui选中节点包含子节点和父节点
    //代码: constcheckedNodes=this.$refs.asyncTree.getCheckedNodes(false,true) //遍历一下就可以获得所有id constids=checkedNodes.map(item=>item.id) console.log(ids)  ......
  • bitsdojo_window自定义导航以及关闭按钮
    1、Windows里面的配置在应用程序文件夹中,转到windows\runner\main.cpp,并在文件开头添加以下两行:#include<bitsdojo_window_windows/bitsdojo_window_plugin.h>autobdw=bitsdojo_window_configure(BDW_CUSTOM_FRAME|BDW_HIDE_ON_STARTUP);2、macOS里面的配置1、在应用程......