vue-element换肤所有主题色和基础色均可实现自主配置

实现vue-element-admin换肤功能一般分为以下几个步骤:

  1. 安装依赖
npm install --save-dev style-resources-loader
  1. 配置less变量及全局样式

src/styles/variables.scss中定义仪表盘样式,如下:

@import '~element-theme-chalk/src/index'; // 引入所有 less 变量

// Dashboard Theme
$--color-primary: #13ce66;
$--color-success: #13ce66;
$--color-warning: #f7ba2a;
$--color-error: #ff4949;

$--color-breadcrumb: #c4c4cc;

// navmenu active color
$--color-nav-menu-active-text: #13ce66;
$--color-nav-menu-active-bg: #e4f7ff;

// css overrides
$--color-body-background-color: #f5f6fa;
$--color-scrollbar-background-color: '#eff2f6';
$--color-scrollbar-thumb-background-color: '#c5c8ce';
$--color-scrollbar-hover-thumb-background-color: '#a2a6ad';

// App Layout variables overrides
$--header-height: 60px;
$--menu-text-color: #57627B;
$--menu-text-color-active: #13ce66;
$--menu-background-color: #fff;
$--menu-width: 260px;
$--menu-collapse-width: 80px;
$--menu-item-height: 42px;

// overwrite font family after loading fonts
$--font-family: 'Noto Sans SC', 'sans-serif';

然后在src/styles/index.scss中引入上述变量,并通过vue.config.js配置文件全局注入样式:

@import './variables.scss';

// add global css
* {
  margin: 0;
  padding: 0;
}

.app-container {
  width: 100%;
  height: 100%;
}

.wf-sans-serif {
  font-family: 'Noto Sans SC', 'sans-serif' !important;
}

.shopville-header {
  height: $--header-height;
  background-color: $--color-primary;
  color: #fff;
  display: flex;
  justify-content: space-between;
  align-items: center;

  .logo {
    width: 100px;
    height: $--header-height;
    display: flex;
    align-items: center;
    padding-left: 24px;

    img {
      width: 100%;
    }
  }

  .userinfo {
    display: flex;
    align-items: center;
  }

  .avatar {
    width: 36px;
    height: 36px;
    margin-right: 8px;
    cursor: pointer;

    img {
      width: 100%;
    }
  }

  .username {
    font-size: 14px;
    font-weight: 600;
  }
}

@media (max-width: 768px) {
  .shopville-header {
    .userinfo {
      display: none;
    }
  }
}

// override element-ui css
.el-dropdown-menu__item {
  font-size: 14px;
}

.el-dropdown-menu__item-group.title {
  font-size: 14px;
  padding: 12px 12px 8px 12px !important;
}

.el-menu::after,
.el-submenu::after {
  border-bottom: none;
}

.el-menu {
  width: $--menu-width;
  text-align: center;
  background-color: $--menu-background-color !important;
  .el-menu-item {
    height: $--menu-item-height;
    line-height: $--menu-item-height;
    font-size: 14px;
    color: $--menu-text-color;
  }
  .el-menu-item:hover {
    background-color: $--menu-collapse-background-color !important;
    color: $--menu-text-color-active !important;
  }
  .el-menu-item.is-active {
    color: $--menu-text-color-active !important;
    font-weight: bold;
    background-color: $--menu-collapse-background-color !important;
  }
  .el-submenu__title {
    line-height: $--menu-item-height;
    font-size: 14px;
    color: $--menu-text-color;
  }
}
.el-menu--collapse {
  width: $--menu-collapse-width;
  .el-menu-item {
    line-height: $--menu-item-height;
    font-size: 14px;
    margin: 0 auto;
  }
  .el-menu-item:hover {
    background-color: $--menu-collapse-background-color !important;
  }
  .el-menu-item.is-active,
  .el-menu-item:hover {
    background-color: $--menu-collapse-background-color !important;
    color: $--menu-text-color-active !important;
  }
  .el-submenu__title {
    line-height: $--menu-item-height;
    font-size: 14px;
    margin: 0 auto;
  }
}

配置vue.config.js

const path = require('path')

function resolve(dir) {
  return path.join(__dirname, dir)
}

module.exports = {
  lintOnSave: false,
  // 配置全局 less 变量
  css: {
    loaderOptions: {
      less: {
        prependData: `
          @import "@/styles/variables.scss";
          @import "@/styles/mixins.scss";
        `
      }
    }
  },
  chainWebpack: config => {
    config.resolve.alias
      .set('@$', resolve('src'))
      .set('@api', resolve('src/api'))
      .set('@assets', resolve('src/assets'))
      .set('@comp', resolve('src/components'))
      .set('@layouts', resolve('src/layouts'))
      .set('@router', resolve('src/router'))
      .set('@store', resolve('src/store'))
      .set('@views', resolve('src/views'))
      .set('@utils', resolve('src/utils'))
  },
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'less',
      patterns: [path.resolve(__dirname, './src/styles/variables.scss')]
    }
  }
}
  1. 自定义换肤
|-- public
|-- src
|   |-- styles
|       |-- index.scss
|       |-- variables.scss
|   |-- components
|       |-- ThemePicker.vue
|-- vue.config.js

src/components目录下新建ThemePicker.vue组件:

<template>
  <color-picker
    v-model="color"
    format="hex"
    disabled-alpha
    size="small"
    color-format-input
    popper-append-to-body
    @change="handleChangeColor"
  >
    <div class="color-picker-btn">
      <span class="color-picker-btn-color" :style="{ backgroundColor: color }"></span>
    </div>
  </color-picker>
</template>

<script>
import { ColorPicker } from 'element-ui'

export default {
  components: {
    ColorPicker
  },

  data() {
    return {
      color: ''
    }
  },

  mounted() {
    this.color = this.getThemeColor()
  },

  methods: {
    getThemeColor() {
      return localStorage.getItem('themeColor') || '#13ce66'
    },

    setThemeColor(color) {
      localStorage.setItem('themeColor', color)
      window.$eventBus.$emit('themeChange')
    },

    handleChangeColor() {
      this.setThemeColor(this.color)
    }
  }
}
</script>

<style scoped>
.color-picker-btn {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 24px;
  height: 24px;

  .color-picker-btn-color {
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 50%;
  }
}
</style>

src/App.vue中加入自定义换肤标签:

<template>
  <div class="app-container">
    <div class="shopville-header">
      <div class="logo">
        <img src="@/assets/images/logo.png" />
      </div>
      <div class="userinfo">
        <theme-picker />
        <a-dropdown>
          <a-avatar class="avatar" icon="user">
            <img
              slot="avatar"
              src="https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png"
              alt=""
            />
          </a-avatar>
          <a-menu slot="overlay">
            <a-menu-item>
              <a-icon :type="$route.meta.icon" />
              <span>我的工作台</span>
            </a-menu-item>
            <a-menu-divider />
            <a-menu-item>
              <a-icon type="logout" />
              <span>退出登录</span>
            </a-menu-item>
          </a-menu>
        </a-dropdown>
      </div>
    </div>
    <app-main />
  </div>
</template>

<script>
import ThemePicker from './components/ThemePicker.vue'

export default {
  components: {
    ThemePicker
  },
  created() {
    this.changeThemeColor()
  },
  methods: {
    changeThemeColor() {
      const $primaryColor = localStorage.getItem('themeColor') || '#13ce66'

      const cssText = `
      :root {
        --color-primary: ${$primaryColor};
        --color-success: ${$primaryColor};
      }

      .el-table__body {
        font-size: 14px;
      }`

      const styleEle = document.createElement('style')
      styleEle.id = 'global_theme'
      styleEle.innerText = cssText
      document.head.append(styleEle)
    }
  }
}
</script>

示例说明1:

element-theme-chalk主题为例,我们可以在src/styles/variables.scss文件中自定义 主题颜色和元素颜色。

@import '~element-theme-chalk/src/index'; // 引入所有 less 变量
// 定义主题色
$--color-primary: #13ce66;
$--color-success: #13ce66;
$--color-warning: #F7BA2A;
$--color-error: #FF4949;

// 定义元素颜色
$--color-breadcrumb: #c4c4cc;

示例说明2:

自定义换肤,我们可以在src/components/目录下新建一个ThemePicker.vue组件来选择自己喜欢的颜色。然后在src/App.vue中使用此组件,并监听localStorage的变化,在主题颜色改变时重新渲染页面。

<template>
  <color-picker
    v-model="color"
    format="hex"
    disabled-alpha
    size="small"
    color-format-input
    popper-append-to-body
    @change="handleChangeColor"
  >
    <div class="color-picker-btn">
      <span class="color-picker-btn-color" :style="{ backgroundColor: color }"></span>
    </div>
  </color-picker>
</template>

<script>
import { ColorPicker } from 'element-ui'

export default {
  components: {
    ColorPicker
  },

  data() {
    return {
      color: ''
    }
  },

  mounted() {
    this.color = this.getThemeColor()
  },

  methods: {
    getThemeColor() {
      return localStorage.getItem('themeColor') || '#13ce66'
    },

    setThemeColor(color) {
      localStorage.setItem('themeColor', color)
      window.$eventBus.$emit('themeChange')
    },

    handleChangeColor() {
      this.setThemeColor(this.color)
    }
  }
}
</script>

<style scoped>
.color-picker-btn {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 24px;
  height: 24px;

  .color-picker-btn-color {
    display: block;
    width: 100%;
    height: 100%;
    border-radius: 50%;
  }
}
</style>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue-element换肤所有主题色和基础色均可实现自主配置 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • 详解IE浏览器的haslayout属性及相关兼容性问题解决

    详解IE浏览器的hasLayout属性及相关兼容性问题解决 什么是hasLayout属性 在IE浏览器中,每个元素都有一个布局属性叫做“hasLayout”。这个属性不仅会影响元素的渲染方式,还可能引起各种布局问题。 该属性的主要作用是决定元素如何进行布局,比如浮动、定位、对齐等样式的渲染。具有“hasLayout”属性的元素会形成一个完整的渲染块(也被称为…

    css 2023年6月10日
    00
  • HTML常用标签大全及html标签的特点

    HTML常用标签大全及HTML标签的特点是学习HTML语言的基础,本文详细介绍HTML标签的种类、用途和语法规则,帮助读者快速掌握HTML语言的核心知识。 HTML常用标签种类 HTML常用标签分为文本标签、框架标签、表单标签、样式标签和脚本标签五大类。 文本标签 文本标签用于设置网页中的文本内容,包括标题、段落、列表、超链接、图片等。 标题标签 标题标签用…

    css 2023年6月9日
    00
  • CSS3动画特效在活动页中的应用

    CSS3动画特效在活动页中的应用攻略 CSS3动画特效已经成为活动页设计中的重要组成部分。据数据显示,在活动页中使用动画特效的页面浏览量要比普通网页高出很多。然而,如何在活动页中运用CSS3动画特效,来吸引和留住用户,却是值得探讨的问题。 一、基础知识 在运用CSS3动画特效之前,需先掌握以下基础知识: 1.1 CSS选择器 CSS选择器是CSS中最核心的部…

    css 2023年6月9日
    00
  • CSS中使用大于号[>]的含义及使用示例

    下面是关于“CSS中使用大于号[>]的含义及使用示例”的详细讲解。 什么是大于号[>]? 大于号[>]是CSS中的选择器,用于选择某个元素的子元素。它的含义是“选取下一级元素”,只选择该元素的直接子元素,而不选取后代元素。 如何在CSS中使用大于号[>]? 在CSS中使用大于号[>]的语法为: 父元素 > 子元素 { 属性…

    css 2023年6月9日
    00
  • 使用CSS画爱心的过程详解

    下面就是“使用CSS画爱心的过程详解”的完整攻略及示例: 1. 确定画布和心形的大小 首先,在CSS中,我们先设定要绘制的爱心的大小,比如: .heart{ width: 50px; height: 50px; } 这里我们的爱心宽和高都是50px。另外,在画爱心前,我们需要先设置其容器的大小,以便我们能够更好地控制制爱心的位置和大小。代码如下: .cont…

    css 2023年6月10日
    00
  • Ant Design中使用css切换的问题及解决

    Ant Design是一套基于React组件化开发的UI框架,提供了众多的可复用、易于维护的组件,方便快速开发Web应用。在Ant Design中,使用CSS切换的问题比较普遍,主要是由于Ant Design采用了Less预处理器,导致CSS文件中的变量和样式名不易于直接修改。下面,我们将详细讲解Ant Design中使用CSS切换的问题及解决方案。 问题描…

    css 2023年6月10日
    00
  • CSS 奇思妙想边框动画效果的实现

    下面就详细讲解“CSS 奇思妙想边框动画效果的实现”的完整攻略。该攻略将从以下三个方面来讲解: 创造不规则形状的边框 利用伪元素和动画实现边框动画效果 示例代码展示 创造不规则形状的边框 要实现边框动画效果,我们需要首先创造一些不规则形状的边框,以实现更独特的效果。使用border属性只能生成矩形形状的边框,而要实现不规则形状的边框,则需要使用 CSS cl…

    css 2023年6月9日
    00
  • CSS3 rgb and rgba(透明色)的使用详解

    以下是关于“CSS3 rgb 和 rgba(透明色)的使用详解”的完整攻略。 一、什么是rgb和rgba RGB 和 RGBA 是一组颜色模式,RGB 表示红色、绿色和蓝色,RGBA 跟 RGB 模式同样表示红色、绿色和蓝色,只不过多了一个透明度的参数。 RGB:由红色值(R)、绿色值(G)和蓝色值(B)组成的颜色表示方式。 RGBA:由红色值(R)、绿色值…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部