仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《前端项目基础建设》
  • HTML&CSS

  • JavaScript&TypeScript

  • Node

  • 构建

  • Vue

    • 持久化存储实时读取
    • vue自适应布局
    • Vue 中后台表格的增删改查统一解决方案(mixin版)
    • Vue 中后台表格的增删改查同一解决方案(组件封装版)
    • Vue Render自定义table单元格内容
    • 项目初始化编码规范(eslint,prettier等)
    • vue element-ui 换肤功能开发
      • 实现原理
      • 开始实现
        • 问题
    • vue element 定义多种主题实现换肤
    • 大屏自适应容器
    • el-upload 自定义上传进度
    • vue3初学注意点
    • vue3 hooks 自适应可视化大屏
    • vue3 element-plus ant- design 自定义主题
    • 博客开发
    • vue2中使用jsx
    • Vue 放弃繁琐的render函数,拥抱JSX
    • 组件设计步骤
    • 倒计时验证
    • Vue中computed和watch的区别
    • vue3面试聚焦
    • Vue3 原理 Proxy实现响应式
  • React

  • 小程序

  • 跨端

  • Electron

  • WebGL&GIS

  • 浏览器

  • 面经

  • 其他

  • 大前端
  • Vue
仲灏
2021-12-30
目录

vue element-ui 换肤功能开发

此功能基于

vue 2.6

element-ui 2.13.2

实现

快速切换主题 使用命令行主题工具进行深层次的主题定制

# 实现原理

  • 主题的css通过public/index.html中的link标签中引入
  • 切换事件中就切换link标签中的css地址即可
    • 避免加载缓慢的问题,提前构建好主题css文件,放置在src/assets或者public文件夹下
  • 结果:

image-20220112165109453

# 开始实现

使用官方的深度主题构建工具element-theme (opens new window)

  • 克隆仓库 git clone https://github.com/ElementUI/element-theme.git

  • node版本切换到10; 我用的10.24.1

  • 安装好依赖 npm i

  • 安装主题包 npm i element-theme -D

  • 增加npm脚本

    • "scripts": {
          ...
          "et": "node_modules/.bin/et",
          "et:init": "node_modules/.bin/et -i",
         	...
        },
      
      1
      2
      3
      4
      5
      6
  • 初始化变量文件

    • npm run et:init

    就可以看到多出一个 element-variables.css的文件

  • 然后只需要调整好几个颜色变量即可,使用官方在线构建 (opens new window)更准确如果是暗黑模式,就需要把颜色反过来。如

    • image-20220112135601646

    • 然后下载,把其中的json文件中颜色值替换到element-variables.css

    • /* Color
      -------------------------- */
      /// color|1|Brand Color|0
      $--color-primary: #50D6FF !default;
      /// color|1|Background Color|4
      $--color-white: #121B33 !default;
      /// color|1|Background Color|4
      $--color-black: #243666 !default;
      $--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
      $--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
      $--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
      $--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
      $--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
      $--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
      $--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
      $--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
      $--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */
      /// color|1|Functional Color|1
      $--color-success: #16EE9F !default;
      /// color|1|Functional Color|1
      $--color-warning: #F7D230 !default;
      /// color|1|Functional Color|1
      $--color-danger: #FE5858 !default;
      /// color|1|Functional Color|1
      $--color-info: #B2BFD9 !default;
      
      $--color-success-light: mix($--color-white, $--color-success, 80%) !default;
      $--color-warning-light: mix($--color-white, $--color-warning, 80%) !default;
      $--color-danger-light: mix($--color-white, $--color-danger, 80%) !default;
      $--color-info-light: mix($--color-white, $--color-info, 80%) !default;
      
      $--color-success-lighter: mix($--color-white, $--color-success, 90%) !default;
      $--color-warning-lighter: mix($--color-white, $--color-warning, 90%) !default;
      $--color-danger-lighter: mix($--color-white, $--color-danger, 90%) !default;
      $--color-info-lighter: mix($--color-white, $--color-info, 90%) !default;
      /// color|1|Font Color|2
      $--color-text-primary: #DEE7FF !default;
      /// color|1|Font Color|2
      $--color-text-regular: #BED0FF !default;
      /// color|1|Font Color|2
      $--color-text-secondary: #919AB3 !default;
      /// color|1|Font Color|2
      $--color-text-placeholder: #8091BE !default;
      /// color|1|Border Color|3
      $--border-color-base: #414D6E !default;
      /// color|1|Border Color|3
      $--border-color-light: #4E5C7F !default;
      /// color|1|Border Color|3
      $--border-color-lighter: #EBEEF5 !default;
      /// color|1|Border Color|3
      $--border-color-extra-light: #647092 !default;
      
      // Background
      /// color|1|Background Color|4
      $--background-color-base: #243666 !default;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
  • 然后就是构建主题包了 npm run et

element

  • 构建完成后把包放到 public/theme/[名称] 下面

  • 最后用函数去手动引入就好了

    themeColorChangeHandle (val) {
          var styleList = [
            {
              id: 'J_elementTheme',
              url: `${process.env.BASE_URL}element-theme/${val}/index.css?t=${new Date().getTime()}`
            },
          ]
          for (var i = 0; i < styleList.length; i++) {
            var el = document.querySelector(`#${styleList[i].id}`)
            if (el) {
              el.href = styleList[i].url
              continue
            }
            el = document.createElement('link')
            el.id = styleList[i].id
            el.href = styleList[i].url
            el.rel = 'stylesheet'
            document.querySelector('head').appendChild(el)
          }
        }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    # 问题

  • 出错:ReferenceError: primordials is not defined

    • node版本过高, 降级node到10就差不多了

    • (不想降级node可使用这个方案)

      • 根目录下新建npm-shrinkwrap.json, 其内容如下

      • {
          "dependencies": {
            "graceful-fs": {
                "version": "4.2.2"
             }
          }
        }
        
        1
        2
        3
        4
        5
        6
        7
上次更新: 2022/10/26, 16:57:52
项目初始化编码规范(eslint,prettier等)
vue element 定义多种主题实现换肤

← 项目初始化编码规范(eslint,prettier等) vue element 定义多种主题实现换肤→

最近更新
01
vim日常使用记录
04-02
02
滑动窗口最大值
04-02
03
有效的字母异位词
04-02
更多文章>
Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式