Element自定义主题色

配置:

1、新建style文件夹,存放样式

common.scss------全局样式

java 复制代码
// 清除默认样式
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html,
body,
#app {
    width: 100%;
    height: 100%;
}

// 去掉列表默认样式
ul,
ol {
    list-style: none;
}

// 去掉 a 标签默认样式
a {
    text-decoration: none;
    color: inherit;
}

// 去掉按钮默认边框
button {
    border: none;
}


// 全局样式
body {
    font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
}

// 单行文本溢出省略号
.ellipsis {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

// 两行省略
.ellipsis-2 {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
}

theme-vars.scss------全局变量

java 复制代码
// 1、全局变量
// 颜色变量
$color-primary: #xxx;
$color-success: #xxx;
$color-warning: #xxx;
$color-danger: #xxx;

// 字体变量
$fs-12: 12px;
$fs-14: 14px;
$fs-16: 16px;
$fs-18: 18px;
$fs-20: 20px;

// 加粗
$fw-500: 500;
$fw-600: 600;

// 间距
$sp-1: 4px;
$sp-2: 8px;
$sp-3: 12px;
$sp-4: 16px;
$sp-5: 24px;
$sp-6: 32px;

// 圆角
$radius-sm: 4px;
$radius-md: 8px;
$radius-lg: 12px;

// 阴影
$shadow-card: 0 2px 8px rgba(0, 0, 0, 0.05);
$shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.12);

element.scss------主题色

java 复制代码
// element.scss
@use "./theme-vars.scss" as vars;

// ==================== 第一部分:全局 CSS 变量覆盖 ====================
// 在 :root 中定义全局变量,Element Plus 会自动使用这些变量
:root {
  /* ========= 你的主题语义变量 ========= */
  --global-primary: #{vars.$color-primary};
  --global-primary-hover: #{vars.$color-button-hover}; 
  --global-bg-hover: #{vars.$select-hover-bg};         
  --global-bg-selected: #{vars.$select-selected-bg};
  --global-border: #{vars.$color-border};
  --global-text: #{vars.$text-color};
  --global-title: #{vars.$title-color};

  /* ========= Element Plus 核心颜色 ========= */
  --el-color-primary: var(--global-primary);

  /* primary 按钮 hover 就用这个 */
  --el-color-primary-light-3: var(--global-primary-hover);

  /* 次级浅色(很少直接用) */
  --el-color-primary-light-5: #8F91FF;
  --el-color-primary-light-7: #B6B7FF;

  /* active */
  --el-color-primary-dark-2: #5A5CFF;

  /* ========= 全局背景 hover ========= */
  --el-fill-color-light: var(--global-bg-hover);
  --el-color-primary-light-9: var(--global-bg-hover);
  --el-color-primary-light-8: var(--global-bg-selected);

  /* ========= 边框 ========= */
  --el-border-color: var(--global-border);

  /* ========= 文本 ========= */
  --el-text-color-primary: var(--global-title);
  --el-text-color-regular: var(--global-text);

  /* ========= 圆角 ========= */
  --el-border-radius-base: #{vars.$radius-sm};
  --el-border-radius-small: 2px;

  /* ========= Select ========= */
  --el-select-border-color-hover: var(--global-primary);
  --el-select-input-focus-border-color: var(--global-primary);
  --el-select-option-hover-background: var(--global-bg-hover);
  --el-select-option-selected: var(--global-primary);
  --el-select-option-selected-hover: var(--global-bg-selected);
}


// ==================== 第二部分:全局通用 hover/select 样式 ====================
// 1. 所有 Element Plus 组件的通用 hover 效果
.el-button:not(.is-disabled):hover,
.el-input__wrapper:hover,
.el-select:hover .el-input__wrapper,
.el-checkbox:hover .el-checkbox__inner,
.el-radio:hover .el-radio__inner,
.el-color-picker:hover .el-color-picker__trigger,
.el-date-editor:hover .el-input__wrapper,
.el-cascader:hover .el-input__wrapper,
.el-menu-item:hover,
.el-tabs__item:hover,
.el-tree-node__content:hover,
.el-table__row:hover td {
  border-color: var(--global-primary) !important;
}

// 2. 所有 Element Plus 组件的通用 focus 效果
.el-button:focus,
.el-input__wrapper.is-focus,
.el-select .el-input__wrapper.is-focus,
.el-checkbox.is-focus .el-checkbox__inner,
.el-radio.is-focus .el-radio__inner,
.el-color-picker.is-focus .el-color-picker__trigger,
.el-date-editor .el-input__wrapper.is-focus,
.el-cascader .el-input__wrapper.is-focus {
  border-color: var(--global-primary) !important;
  box-shadow: 0 0 0 1px var(--global-primary) inset !important;
}

// 3. 所有选中/激活状态的通用样式
.el-select-dropdown__item.is-selected,
.el-checkbox.is-checked .el-checkbox__label,
.el-radio.is-checked .el-radio__label,
.el-menu-item.is-active,
.el-tabs__item.is-active,
.el-cascader-node.in-active-path,
.el-tree-node.is-current > .el-tree-node__content,
.el-table__row.current-row {
  color: var(--global-primary) !important;
}

// ==================== 第三部分:组件特定样式微调 ====================
/* Select 输入框外观 */
.el-select .el-select__wrapper {
  border-radius: #{vars.$radius-lg};
  border-color: #{vars.$color-border};
  height: 40px;
  display: flex;
  align-items: center;

  &:hover {
    border-color: #{vars.$select-hover-bg};
  }

  &.is-focus {
    box-shadow: 0 0 0 1px #{vars.$color-primary} inset;
    border-color: #{vars.$color-primary};
  }
}

.el-select__placeholder {
  color: #{vars.$title-color};
}

/* Select 下拉菜单整体 */
.el-select-dropdown {
  border-radius: #{vars.$radius-lg};
  border: 1px solid #f0f0f0;
}

/* Select 下拉项 */
.el-select-dropdown__item {
  padding: 8px 14px !important;
  margin: 2px 4px;
  line-height: 20px;
  font-size: 14px;
  border-radius: #{vars.$radius-md};

  &.is-selected {
    color: #{vars.$color-primary};
    background-color: #{vars.$select-selected-bg};
  }

  &:hover {
    background-color: #{vars.$select-hover-bg};
  }
}

/* Tree 节点允许换行 */
.el-tree-node__label {
  display: inline-block;
  white-space: normal !important;
  line-height: 1.4 !important;
  word-break: break-word !important;
}

/* Tree 节点 hover 背景圆角 */
.el-tree-node__content {
  height: auto !important;
  border-radius: #{vars.$radius-md} !important;
  margin: 2px 0;
  padding: 10px;
}

.el-tree-node__label {
  padding: 8px 0;
}

/* hover 样式 */
.el-tree-node__content:hover {
  background-color: #{vars.$select-hover-bg};
  border-radius: #{vars.$radius-md};
}

/* 选中节点的背景色圆角 */
.el-tree-node.is-current > .el-tree-node__content {
  background-color: #{vars.$select-hover-bg};
  color: #{vars.$color-primary};
  border-radius: #{vars.$radius-md};
}

// /* 解决:父节点在展开 & 非 current 状态下被 Element Plus 自动加灰底的问题 */
// .el-tree-node.is-expanded:not(.is-current) > .el-tree-node__content {
//   background-color: transparent;
// }

//.el-form-item
.el-form-item {
  margin: 0;
  margin-right: 24px;
}

/* 只影响 inline 表单*/
.el-form--inline .el-form-item__label {
  height: 40px;           
  display: flex;
  align-items: center;   
  padding-bottom: 0;      
  display: flex;          
  align-items: center;
}

.el-form--inline .el-form-item {
  display: inline-flex;
  align-items: center;
}

.el-form--inline .el-form-item__label {
  line-height: normal;
  padding-bottom: 0; 
}


//el-input
/* el-input 外层 */
.el-input__wrapper {
  height: 40px;
  display: flex;
  align-items: center;
  border-radius: 12px;
}

/* 真正输入框 */
.el-input__inner {
  height: 100%;
  line-height: 40px;
}

//el-date-picker
.el-date-editor .el-input__wrapper {
  height: 40px;
}

//button
.el-button {
  border-width: 1px;
}

.el-button:focus,
.el-button:focus-visible,
.el-button:active,
.el-button:hover {
  box-shadow: none !important;
  outline: none !important;
}

//分页
.el-pager li {
  border-radius: 10px;
}
.el-pager li:hover {
  background-color: #{vars.$select-hover-bg};
  color: #{vars.$color-primary};
}
.el-pager li.is-active {
  background-color: #{vars.$color-primary}!important;
  color: #fff!important;
}

//弹框
.el-popup-parent--hidden {
  padding-right: 0 !important;
}

//自定义图标与文字内容样式
.custom-warning {
  display: flex;
  align-items: center;
  gap: 2px;

  .warn-icon {
    width: 24px;
    height: 24px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
}

// 内容
.el-message-box__container {
  .el-message-box__message {
    font-size: 14px;
    color: #3D3D3D;
    font-weight: 500;
  }
}

.el-message-box {
  border-radius: 12px;
}

//遮罩层颜色
.el-overlay.is-message-box {
  background: rgba(21, 19, 27, 0.76);
}

.el-dialog {
  border-radius: 12px;
}

2、vite.config.js

java 复制代码
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

export default defineConfig({
    plugins: [
        // 自动导入 Element Plus,并启用 SASS 模式(主题色必须)
        Components({
            resolvers: [
                ElementPlusResolver({
                    importStyle: 'sass',
                }),
            ],
        }),
    ],
    css: {
        preprocessorOptions: {
            scss: {
                api: 'modern-compiler',
                additionalData: `
                    @use "@/styles/theme-vars.scss" as *;
                    @use "@/styles/element.scss" as *;
                `
            },
        },
    }
})

3、main.js

java 复制代码
import "@/styles/common.scss";
相关推荐
灰海2 小时前
为什么给<a>标签设置了download属性, 浏览器没有下载而是打开新标签!!
前端·vue·html·下载·download
1024肥宅2 小时前
面试和算法:常见面试题实现与深度解析
前端·javascript·面试
float_六七3 小时前
行级与块级元素:核心区别与应用场景
开发语言·前端·javascript
毕设十刻3 小时前
基于Vue的家教预约系统7fisz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
前端无涯3 小时前
深度解析:fetch 与 Promise 结合实战及面试重点
前端·javascript
风舞红枫3 小时前
node代理vue打包后的文件,实现本地测试
前端·javascript·vue.js·node.js
helloCat3 小时前
记录CI/CD自动化上传AppGallery遇到的坑
android·前端·api
Yanni4Night3 小时前
使用URLPattern API构建自己的路由器 🛣️
前端·javascript
web守墓人3 小时前
【前端】garn:使用go实现一款类似yarn的依赖管理器
前端