Tema personalizado

Element Plus utiliza la metodología BEM en CSS con la finalidad de que pueda sobrescribir los estilos fácilmente. Pero si necesita reemplazar estilos a gran escala, p.ej. cambiar el color del tema de azul a naranja o verde, tal vez sobreescribirlos uno por uno no es una buena idea.

Proporcionamos cuatro maneras de cambiar las variables de estilo.

Cambia el color del tema

Estos son ejemplos sobre temas personalizados.

  • Importación completa: [elemento-plus-vite-starter](https://github. com/element-plus/element-plus-vite-starter)
  • A demanda: [unplugin-element-plus/examples/vite](https://github. com/element-plus/unplugin-element-plus)

Por variables SCSS

theme-chalk está escrito en SCSS. Puede encontrar las variables SCSS en packages/theme-chalk/src/common/var.scss.

WARNING

Utilizamos módulos sass (sass:map...) y @use para refactorizar todas las variables SCSS. Y usar @use para todas las variables SCSS, resuelve el problema de salida duplicada causado por @import.

Introducción de los módulos Sass | CSS-TRICKS

Por ejemplo, usamos $colors como mapa para preservar diferentes tipos de colores.

$notification es un mapa donde todas las variables del componente notification.

En el futuro, escribiremos documentación para variables que pueden ser personalizadas para cada componente. También puede consultar directamente el código fuente var.scss.

$colors: () !default;
$colors: map.deep-merge(
  (
    'white': #ffffff,
    'black': #000000,
    'primary': (
      'base': #409eff,
    ),
    'success': (
      'base': #67c23a,
    ),
    'warning': (
      'base': #e6a23c,
    ),
    'danger': (
      'base': #f56c6c,
    ),
    'error': (
      'base': #f56c6c,
    ),
    'info': (
      'base': #909399,
    ),
  ),
  $colors
);

¿Cómo anularlo?

Si su proyecto también utiliza SCSS, puede cambiar directamente las variables de estilo Element Plus. Cree un nuevo archivo de estilo, p. ej., styles/element/index.scss:

WARNING

Debería usar @use 'xxx.scss' as *; en lugar de @import 'xxx.scss';.

Debido a que el equipo de sass dijo que eliminarán @import eventualmente.

Sass: @use vs Sass: @import

// styles/element/index.scss
/* just override what you need */
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
  $colors: (
    'primary': (
      'base': green,
    ),
  )
);

// If you just import on demand, you can ignore the following content.
// if you want to import all styles:
// @use "element-plus/theme-chalk/src/index.scss" as *;

Luego, en el archivo de entrada de su proyecto, importe este archivo de estilo en lugar del CSS construido por Element:

TIP

Importe element/index.scss antes del scss de element-plus para evitar el problema de las variables mixtas sass porque necesitamos generar light-x para sus variables personalizadas.

Cree un element/index.scss para combinar sus variables y variables de element-plus. (Si los importa en ts, no se combinarán.)

TIP

Además, hay que distinguir su scss de las variables de los elementos scss. Si se combinan entre sí, cada actualización caliente de element-plus necesita compilar un gran número de archivos scss, lo que resulta ser un proceso lento.

import { createApp } from 'vue'
import './styles/element/index.scss'
import ElementPlus from 'element-plus'
import App from './App.vue'

const app = createApp(App)
app.use(ElementPlus)

Si está utilizando vite, y desea personalizar el tema al importar bajo demanda.

Use scss.additionalData para compilar variables con scss de cada componente.

import path from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// You can also use unplugin-vue-components
// import Components from 'unplugin-vue-components/vite'
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// or use unplugin-element-plus
import ElementPlus from 'unplugin-element-plus/vite'

// vite.config.ts
export default defineConfig({
  resolve: {
    alias: {
      '~/': `${path.resolve(__dirname, 'src')}/`,
    },
  },
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@use "~/styles/element/index.scss" as *;`,
      },
    },
  },
  plugins: [
    vue(),
    // use unplugin-vue-components
    // Components({
    //   resolvers: [
    //     ElementPlusResolver({
    //       importStyle: "sass",
    //       // directives: true,
    //       // version: "2.1.5",
    //     }),
    //   ],
    // }),
    // or use unplugin-element-plus
    ElementPlus({
      useSource: true,
    }),
  ],
})

Si está utilizando webpack, y desea personalizar el tema al importar bajo demanda.

// webpack.config.ts
// use unplugin-element-plus

import ElementPlus from 'unplugin-element-plus/webpack'

export default defineConfig({
  css: {
    loaderOptions: {
      scss: {
        additionalData: `@use "~/styles/element/index.scss" as *;`,
      },
    },
  },
  plugins: [
    ElementPlus({
      useSource: true,
    }),
  ],
})

Por variables CSS

Las variables CSS son una característica muy útil, ya soportada por casi todos los navegadores. (IE: Wait?)

Aprenda más de [Uso de propiedades personalizadas (variables) en CSS | MDN](https://developer. mozilla. org/es/docs/Web/CSS/Using_CSS_custom_properties)

Hemos utilizado variables css para reconstruir el sistema de estilo de casi todos los componentes.

TIP

Es compatible con el sistema de variables SCSS. Utilizamos la función de SCSS para generar automáticamente variables CSS para su uso.

Esto significa que puede cambiar dinámicamente variables individuales dentro del componente para personalizarlo mejor sin tener que modificar scss y recompilarlo.

En el futuro, se escribirán en cada componente los nombres de variables y la documentación del rol de cada componente.

Como esto:

:root {
  --el-color-primary: green;
}

Si sólo desea personalizar un componente en particular, simplemente añada estilos en línea para ciertos componentes individualmente.

<el-tag style="--el-tag-bg-color: red">Tag</el-tag>

Por razones de rendimiento, es más recomendable personalizar las variables css bajo una clase que el global :root.

.custom-class {
  --el-tag-bg-color: red;
}

Si desea controlar las variables css por script, pruebe esto:

// document.documentElement is global
const el = document.documentElement
// const el = document.getElementById('xxx')

// get css var
getComputedStyle(el).getPropertyValue(`--el-color-primary`)

// set css var
el.style['--el-color-primary'] = 'red'

Si desea una forma más elegante, compruebe esto. useCssVar | VueUse