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日

相关文章

  • CSS实现带阴影效果的黑色导航菜单效果

    下面就为大家详细讲解如何使用 CSS 实现带阴影效果的黑色导航菜单效果。 实现过程 首先,我们需要先创建一个 HTML 结构,包含一个导航栏区域,并在其中添加菜单项,例如: <nav> <ul> <li><a href="#">首页</a></li> <li&g…

    css 2023年6月9日
    00
  • jQuery EasyUI基础教程之EasyUI常用组件(推荐)

    jQuery EasyUI基础教程之EasyUI常用组件(推荐) EasyUI是一款基于jQuery的UI框架,提供了丰富的UI组件和功能,使得开发者能够更加轻松地开发出高质量的Web应用程序。本教程将介绍EasyUI最常用的组件,方便开发者能够快速上手。 TreeGrid TreeGrid是EasyUI中非常实用的一个组件,它可以将表格以树的形式呈现出来。…

    css 2023年6月10日
    00
  • 网页CSS背景图片使用的测试结果

    下面针对网页CSS背景图片使用的测试结果,我们来做一个完整的攻略。 一、背景图片的引用方式 在CSS中,我们可以通过如下的方式来引用背景图片: selector { background-image: url(image.jpg); } 其中,selector表示你要引用的元素,background-image表示背景图片的属性名称,url()里面填写的是背…

    css 2023年6月9日
    00
  • 使用CSS伪元素控制连续几个元素的样式方法

    使用CSS伪元素可以方便地控制连续几个元素的样式,常用于制作特定排版和装饰效果。下面是使用CSS伪元素控制连续几个元素的样式方法的完整攻略: 使用CSS伪元素控制连续几个元素的样式方法 1. 选择器 CSS伪元素可以通过选择器和属性选择器来指定样式。在选择器中,伪元素使用双冒号(::)来标识,而不是单冒号(:)。伪元素的名称可以通过选择器来引用,如下所示: …

    css 2023年6月10日
    00
  • jQuery动画与特效详解

    针对“jQuery动画与特效详解”的攻略,我来给你做一个详细的讲解。 jQuery动画与特效详解 jQuery动画 jQuery提供了多种动画方法,包括隐藏和显示元素、淡入淡出、移动、旋转和缩放等。下面是几个常用的动画方法: 隐藏和显示元素 通过 hide() 和 show() 方法,可以将元素进行隐藏和显示。 // 隐藏元素 $(selector).hid…

    css 2023年6月11日
    00
  • css3制作彩色边线3d立体按钮的示例(css3按钮)

    接下来我会详细讲解如何使用CSS3制作彩色边线3D立体按钮。本攻略包含以下内容: 分析需求,分别设计HTML和CSS结构 使用CSS3属性,实现彩色边线3D立体效果 将按钮应用于网页中 接下来,我们分别来看每一步的具体内容。 1. 分析需求,分别设计HTML和CSS结构 在设计HTML结构时,我们需要知道一个按钮所需要的基本元素。通常情况下,一个按钮会包含以…

    css 2023年6月10日
    00
  • CSS元素居中布局的简单方法

    让我详细讲解一下“CSS元素居中布局的简单方法”的完整攻略。 一、使用Flexbox布局方式进行元素居中 Flexbox是CSS3中新增的一种布局方式,它可以方便地实现元素居中布局。以下是使用Flexbox进行元素居中的简单方法。 1. 将容器标记设置为Flex布局 要使用Flexbox布局方式,我们需要将元素的父容器标记设置为display: flex,这…

    css 2023年6月10日
    00
  • React.js Gird 布局编写键盘组件

    React.js Grid 是一个基于 Flexbox 的布局库,它可以帮助我们更方便地实现页面布局。本文将讲解使用 React.js Grid 实现键盘组件的完整攻略。 步骤一:安装 React.js Grid 首先我们需要安装 React.js Grid。可以通过 npm 包管理器进行安装: npm install react-grid-system 步…

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