# Theme

This project is based on the element-ui default visual style. If you have additional requirements for visual style, you can follow the official custom theme guide. The method is implemented by covering style variables.

# Style override

The generic style variables for element-ui may not satisfy all custom requirements, and you can do this by overriding the default component style.Since the element-ui style is introduced globally, you can't add scoped if you want to override its style in a view, but if you want to override only the element style of the page, you can use it. Add a class to the parent to use the namespace to solve the problem.

Or use Deep Selectors

/* Your namespace */
.article-page {
  /* element-ui tag */
  .el-tag {
    margin-right: 0px;
  }
}

Some global element-ui style modifications can be set in @/styles/element-ui.scss.


# Dynamic theme

This project provides two kinds of dynamic skinning functions, each has its own advantages and disadvantages. Please choose according to your own needs.

# Element-ui official method

After the element-ui is upgraded to 2.0, the dynamic peel function is provided in the upper right corner of the official document. This project also provides a change function.

Code: @/components/ThemePicker

Briefly explain its principle: All styles after element-ui version 2.0 are based on SCSS, all colors are set based on a few basic color variables, so it is not difficult to achieve dynamic skinning, as long as find a few color variables to modify it. First, we need to get the version number of element-ui through package.json and request the corresponding style according to the version number. After you get the style, you will change the color, replace it with the color variable you want, and then dynamically add the style tag to override the original CSS style.

TIP

It is necessary to obtain the version of element-ui to lock the version so as to avoid the impact of non-compatible updates when the Element is upgraded in the future.

const version = require('element-ui/package.json').version

const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
this.getCSSString(url, chalkHandler, 'chalk')

getCSSString(url, callback, variable) {
  const xhr = new XMLHttpRequest()
  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4 && xhr.status === 200) {
      this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
      callback()
    }
  }
  xhr.open('GET', url)
  xhr.send()
}

How to use

Import the ThemePicker component to your project

import ThemePicker from '@/components/ThemePicker'
  • Advantage
    • No need to prepare multiple sets of themes, free dynamic theme
  • Shortcomings
    • Not enough customization, only support switching of basic colors


# Multiple sets of theme

This method is the most common way of theme, storing multiple sets of themes locally, both with different namespaces, such as writing two sets of themes, a set called day-theme, a set called night-theme, and night-theme. Themes are all under a .night-theme namespace, and we dynamically add .night-theme on body; remove .night-theme.

# How to use

We have made corresponding changes here based on the official theme generation library element-theme.

First download custom-element-theme

git@github.com:PanJiaChen/custom-element-theme.git

Globally installed theme generation tool

npm i element-theme -g

Enter the project directory Install dependencies

npm install

First execute et -i to generate element-variables.scss file that stores style variables, then enter element-variables.scss file to modify your own variables, execute et after modification, compile subject, and finally Execute gulp to generate a namespace. All generated files are in the dist directory. You just copy all the contents of the file to src/assets/custom-theme in the vue-element-admin project.

TIP

If you need to modify the name of the package generation style namespace, just modify the variable.