【Vue3+Element Plus+Vite】按需导入Element Plus组件并配置全局样式文件

需求

1. 按需导入Element Plus组件并修改主题色

2. 全局导入变量文件 variable.scss

3. 实现PC和移动端响应式样式配置

实现

1. 创建全局变量文件 src/styles/variable.scss

css 复制代码
/* 基础CSS变量定义 */
:root {
  /* 移动端适配 */
  --safe-area-inset-top: env(safe-area-inset-top);
  --safe-area-inset-bottom: env(safe-area-inset-bottom);

  --sidebar-width: 48px;
  --navbar-height: 72px;

  /* 字体变量 */
  --font-family:
    Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,
    'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
  --font-size-base: 14px;

  /* 边框变量 */
  --border-radius: 4px;
  --border-color: #e6e4ee;

  /* 文字变量 */
  --Grey-950: #1b192a; // 标题色
  --Grey-700: #6e6b8b; // 副标题色
  --Grey-400: #c3c0d0; // 页脚
  --Grey-300: #d8d6e2; // 边框色
  --Grey-100: #f2f1f6; // 侧边栏按钮高亮色
}

/* 响应式断点 */
$breakpoint-sm: 576px !default;
$breakpoint-md: 768px !default;
$breakpoint-lg: 992px !default;
$breakpoint-xl: 1200px !default;
$breakpoint-xxl: 1600px !default;

/* 媒体查询混合宏 */
@mixin respond-to($breakpoint) {
  @if $breakpoint == sm {
    @media (min-width: $breakpoint-sm) {
      @content;
    }
  } @else if $breakpoint == md {
    @media (min-width: $breakpoint-md) {
      @content;
    }
  } @else if $breakpoint == lg {
    @media (min-width: $breakpoint-lg) {
      @content;
    }
  } @else if $breakpoint == xl {
    @media (min-width: $breakpoint-xl) {
      @content;
    }
  } @else if $breakpoint == xxl {
    @media (min-width: $breakpoint-xxl) {
      @content;
    }
  } @else if $breakpoint == max-sm {
    @media (max-width: ($breakpoint-sm - 1)) {
      @content;
    }
  } @else if $breakpoint == max-md {
    @media (max-width: ($breakpoint-md - 1)) {
      @content;
    }
  } @else if $breakpoint == max-lg {
    @media (max-width: ($breakpoint-lg - 1)) {
      @content;
    }
  } @else if $breakpoint == max-xl {
    @media (max-width: ($breakpoint-xl - 1)) {
      @content;
    }
  } @else if $breakpoint == max-xxl {
    @media (max-width: ($breakpoint-xxl - 1)) {
      @content;
    }
  }
}

2. 安装 Element Plus

text 复制代码
npm install element-plus

3. 按需导入组件(自动导入)并导入变量文件

text 复制代码
npm install -D unplugin-vue-components unplugin-auto-import

vite.config.ts 文件中配置如下代码:

ts 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
  css: {
    preprocessorOptions: {
      scss: {
      	 // 全局导入变量
        additionalData: `@use "@/styles/variables.scss" as *;`
      }
    }
  }
})

4. 创建主题色配置文件 src/styles/element/index.scss

css 复制代码
// Element Plus CSS 变量覆盖
:root {
  // 主题色
  --el-color-primary: #409eff;
  --el-color-primary-light-3: #79bbff;
  --el-color-primary-light-5: #a0cfff;
  --el-color-primary-light-7: #c6e2ff;
  --el-color-primary-light-8: #d9ecff;
  --el-color-primary-light-9: #ecf5ff;
  --el-color-primary-dark-2: #337ecc;
  
  // 成功色
  --el-color-success: #67c23a;
  // 警告色
  --el-color-warning: #e6a23c;
  // 危险色
  --el-color-danger: #f56c6c;
  // 信息色
  --el-color-info: #909399;
  
  // 其他变量
  --el-font-size-base: 14px;
  --el-border-radius-base: 4px;
}

// 暗黑模式主题
.dark {
  --el-color-primary: #409eff;
  // 其他暗色模式变量...
}

5. 修改全局样式文件 src/styles/global.scss

css 复制代码
@use './element/index.scss'; // 引入 Element 主题配置

// 设备显示控制
.pc-only {
  display: block !important;
}

.h5-only {
  display: none !important;
}

// 移动端适配
@include respond-to(max-md) {
  .pc-only {
    display: none !important;
  }
  
  .h5-only {
    display: block !important;
  }
}

6. 在 main.ts 中引入

ts 复制代码
// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'
引入全局样式文件
import './styles/global.scss'


// 按需导入后,不需要在这里导入 Element Plus
const app = createApp(App)

app.use(createPinia())
app.use(router)

app.mount('#app')
相关推荐
梦帮科技4 小时前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
爱勇宝4 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
微信开发api-视频号协议5 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad
甲维斯5 小时前
Fable5:20美金的顶级设计师!
前端·人工智能
kyriewen5 小时前
我同时用了 Claude Code、Cursor 和 Codex,说说三个工具的真实差距——2026 年选错工具比不用 AI 更浪费时间
前端·ai编程·claude
Jackson__6 小时前
为了拯救我的腰椎和颈椎,我做了款浏览器插件!
前端·javascript·开源
闲猫6 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅6 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒7 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
简简单单就是我_hehe7 小时前
前端埋点日志解决方案:完整 User-Agent 解析工具实现,爬虫识别、设备品牌、操作系统、浏览器版本全解析(附完整源码)
前端·爬虫