mirror of
https://github.com/element-plus/element-plus.git
synced 2025-02-17 11:49:41 +08:00
125 lines
21 KiB
JavaScript
125 lines
21 KiB
JavaScript
import{c as n,o as s,e as a}from"./app.d323121f.js";const t=a(`<h1 id="custom-theme" tabindex="-1">Custom theme <a class="header-anchor" href="#custom-theme" aria-hidden="true">#</a></h1><p>Element Plus uses BEM-styled CSS so that you can override styles easily. But if you need to replace styles at a large scale, e.g. change the theme color from blue to orange or green, maybe overriding them one by one is not a good idea.</p><p>We provide four ways to change the style variables.</p><h2 id="change-theme-color" tabindex="-1">Change theme color <a class="header-anchor" href="#change-theme-color" aria-hidden="true">#</a></h2><p>These are examples about custom theme.</p><ul><li>Full import: <a href="https://github.com/element-plus/element-plus-vite-starter" target="_blank" rel="noopener noreferrer">element-plus-vite-starter</a></li><li>On demand: <a href="https://github.com/element-plus/unplugin-element-plus" target="_blank" rel="noopener noreferrer">unplugin-element-plus/examples/vite</a></li></ul><h3 id="by-scss-variables" tabindex="-1">By SCSS variables <a class="header-anchor" href="#by-scss-variables" aria-hidden="true">#</a></h3><p><code>theme-chalk</code> is written in SCSS. You can find SCSS variables in <a href="https://github.com/element-plus/element-plus/blob/dev/packages/theme-chalk/src/common/var.scss" target="_blank" rel="noopener noreferrer"><code>packages/theme-chalk/src/common/var.scss</code></a>.</p><div class="warning custom-block"><p class="custom-block-title">WARNING</p><p>We use sass modules (<a href="https://sass-lang.com/documentation/values/maps" target="_blank" rel="noopener noreferrer">sass:map</a>...) and <code>@use</code> to refactor all SCSS variables. And by using <code>@use</code> to all SCSS variables, it solves the duplicate output problem caused by <code>@import</code>.</p><blockquote><p><a href="https://css-tricks.com/introducing-sass-modules/" target="_blank" rel="noopener noreferrer">Introducing Sass Modules | CSS-TRICKS</a></p></blockquote><p>For example, We use <code>$colors</code> as a map to preserve different types of colors.</p><p><code>$notification</code> is a map where all variables of the <code>notification</code> component at.</p><p>In the future, we will write documentation for variables that can be customized for each component. You can also directly checkout the source <a href="https://github.com/element-plus/element-plus/blob/dev/packages/theme-chalk/src/common/var.scss" target="_blank" rel="noopener noreferrer">var.scss</a>.</p></div><div class="language-scss"><pre><code><span class="token property"><span class="token variable">$colors</span></span><span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token statement keyword">!default</span><span class="token punctuation">;</span>
|
|
<span class="token property"><span class="token variable">$colors</span></span><span class="token punctuation">:</span> map.<span class="token function">deep-merge</span><span class="token punctuation">(</span>
|
|
<span class="token punctuation">(</span>
|
|
<span class="token string">'white'</span><span class="token punctuation">:</span> #ffffff<span class="token punctuation">,</span>
|
|
<span class="token string">'black'</span><span class="token punctuation">:</span> #000000<span class="token punctuation">,</span>
|
|
<span class="token string">'primary'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #409eff<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token string">'success'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #67c23a<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token string">'warning'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #e6a23c<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token string">'danger'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #f56c6c<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token string">'error'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #f56c6c<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token string">'info'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> #909399<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token variable">$colors</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
</code></pre></div><h3 id="how-to-override-it" tabindex="-1">How to override it? <a class="header-anchor" href="#how-to-override-it" aria-hidden="true">#</a></h3><p>If your project also uses SCSS, you can directly change Element Plus style variables. Create a new style file, e.g. <code>styles/element/index.scss</code>:</p><div class="warning custom-block"><p class="custom-block-title">WARNING</p><p>You should use <code>@use 'xxx.scss' as *;</code> instead of <code>@import 'xxx.scss';</code>.</p><p>Because the sass team said they will remove <code>@import</code> eventually.</p><blockquote><p><a href="https://sass-lang.com/documentation/at-rules/use" target="_blank" rel="noopener noreferrer">Sass: @use</a> vs <a href="https://sass-lang.com/documentation/at-rules/import" target="_blank" rel="noopener noreferrer">Sass: @import</a></p></blockquote></div><div class="language-scss"><pre><code><span class="token comment">// styles/element/index.scss</span>
|
|
<span class="token comment">/* just override what you need */</span>
|
|
<span class="token keyword">@forward</span> <span class="token string">'element-plus/theme-chalk/src/common/var.scss'</span> <span class="token module-modifier keyword">with</span> <span class="token punctuation">(</span>
|
|
<span class="token property"><span class="token variable">$colors</span></span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'primary'</span><span class="token punctuation">:</span> <span class="token punctuation">(</span>
|
|
<span class="token string">'base'</span><span class="token punctuation">:</span> green<span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">)</span>
|
|
<span class="token punctuation">)</span><span class="token punctuation">;</span>
|
|
|
|
<span class="token comment">// If you just import on demand, you can ignore the following content.</span>
|
|
<span class="token comment">// if you want to import all styles:</span>
|
|
<span class="token comment">// @use "element-plus/theme-chalk/src/index.scss" as *;</span>
|
|
</code></pre></div><p>Then in the entry file of your project, import this style file instead of Element's built CSS:</p><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>Import <code>element/index.scss</code> before scss of element-plus to avoid the problem of sass mixed variables, because we need generate light-x by your custom variables.</p></div><p>Create a <code>element/index.scss</code> to combine your variables and variables of element-plus. (If you import them in ts, they will not be combined.)</p><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>In addition, you should distinguish your scss from the element variable scss. If they are mixed together, each hot update of <code>element-plus</code> needs to compile a large number of scss files, resulting in slow speed.</p></div><div class="language-ts"><pre><code><span class="token keyword">import</span> <span class="token punctuation">{</span> createApp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span>
|
|
<span class="token keyword">import</span> <span class="token string">'./styles/element/index.scss'</span>
|
|
<span class="token keyword">import</span> ElementPlus <span class="token keyword">from</span> <span class="token string">'element-plus'</span>
|
|
<span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App.vue'</span>
|
|
|
|
<span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">createApp</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span>
|
|
app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>ElementPlus<span class="token punctuation">)</span>
|
|
</code></pre></div><p>If you are using vite, and you want to custom theme when importing on demand.</p><p>Use <code>scss.additionalData</code> to compile variables with scss of every component.</p><div class="language-ts"><pre><code><span class="token keyword">import</span> path <span class="token keyword">from</span> <span class="token string">'path'</span>
|
|
<span class="token keyword">import</span> <span class="token punctuation">{</span> defineConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vite'</span>
|
|
<span class="token keyword">import</span> vue <span class="token keyword">from</span> <span class="token string">'@vitejs/plugin-vue'</span>
|
|
<span class="token comment">// You can also use unplugin-vue-components</span>
|
|
<span class="token comment">// import Components from 'unplugin-vue-components/vite'</span>
|
|
<span class="token comment">// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'</span>
|
|
|
|
<span class="token comment">// or use unplugin-element-plus</span>
|
|
<span class="token keyword">import</span> ElementPlus <span class="token keyword">from</span> <span class="token string">'unplugin-element-plus/vite'</span>
|
|
|
|
<span class="token comment">// vite.config.ts</span>
|
|
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
resolve<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
alias<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
<span class="token string-property property">'~/'</span><span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">\${</span>path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'src'</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">/</span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
css<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
preprocessorOptions<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
scss<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
additionalData<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string">@use "~/styles/element/index.scss" as *;</span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
plugins<span class="token operator">:</span> <span class="token punctuation">[</span>
|
|
<span class="token function">vue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token comment">// use unplugin-vue-components</span>
|
|
<span class="token comment">// Components({</span>
|
|
<span class="token comment">// resolvers: [</span>
|
|
<span class="token comment">// ElementPlusResolver({</span>
|
|
<span class="token comment">// importStyle: "sass",</span>
|
|
<span class="token comment">// // directives: true,</span>
|
|
<span class="token comment">// // version: "2.1.5",</span>
|
|
<span class="token comment">// }),</span>
|
|
<span class="token comment">// ],</span>
|
|
<span class="token comment">// }),</span>
|
|
<span class="token comment">// or use unplugin-element-plus</span>
|
|
<span class="token function">ElementPlus</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
useSource<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
</code></pre></div><p>If you are using webpack, and you want to custom theme when importing on demand.</p><div class="language-ts"><pre><code><span class="token comment">// webpack.config.ts</span>
|
|
<span class="token comment">// use unplugin-element-plus</span>
|
|
|
|
<span class="token keyword">import</span> ElementPlus <span class="token keyword">from</span> <span class="token string">'unplugin-element-plus/webpack'</span>
|
|
|
|
<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
css<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
loaderOptions<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
scss<span class="token operator">:</span> <span class="token punctuation">{</span>
|
|
additionalData<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string">@use "~/styles/element/index.scss" as *;</span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">,</span>
|
|
plugins<span class="token operator">:</span> <span class="token punctuation">[</span>
|
|
<span class="token function">ElementPlus</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
|
|
useSource<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">]</span><span class="token punctuation">,</span>
|
|
<span class="token punctuation">}</span><span class="token punctuation">)</span>
|
|
</code></pre></div><h3 id="by-css-variable" tabindex="-1">By CSS Variable <a class="header-anchor" href="#by-css-variable" aria-hidden="true">#</a></h3><p>CSS Variables is a very useful feature, already supported by almost all browsers. (IE: Wait?)</p><blockquote><p>Learn more from <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" target="_blank" rel="noopener noreferrer">Using CSS custom properties (variables) | MDN</a></p></blockquote><p>We have used css variables to reconstruct the style system of almost all components.</p><div class="tip custom-block"><p class="custom-block-title">TIP</p><p>It is compatible with the SCSS variable system. We use the function of SCSS to automatically generate css variables for use.</p></div><p>This means you can dynamically change individual variables inside the component to better customize it without having to modify scss and recompile it.</p><blockquote><p>In the future, the css variable names and role documentation for each component will be written to each component.</p></blockquote><p>Like this:</p><div class="language-css"><pre><code><span class="token selector">:root</span> <span class="token punctuation">{</span>
|
|
<span class="token property">--el-color-primary</span><span class="token punctuation">:</span> green<span class="token punctuation">;</span>
|
|
<span class="token punctuation">}</span>
|
|
</code></pre></div><p>If you just want to customize a particular component, just add inline styles for certain components individually.</p><div class="language-html"><pre><code><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>el-tag</span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">--el-tag-bg-color</span><span class="token punctuation">:</span> red</span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span>Tag<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>el-tag</span><span class="token punctuation">></span></span>
|
|
</code></pre></div><p>For performance reasons, it is more recommended to custom css variables under a class rather than the global <code>:root</code>.</p><div class="language-css"><pre><code><span class="token selector">.custom-class</span> <span class="token punctuation">{</span>
|
|
<span class="token property">--el-tag-bg-color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span>
|
|
<span class="token punctuation">}</span>
|
|
</code></pre></div><p>If you want to control css var by script, try this:</p><div class="language-ts"><pre><code><span class="token comment">// document.documentElement is global</span>
|
|
<span class="token keyword">const</span> el <span class="token operator">=</span> document<span class="token punctuation">.</span>documentElement
|
|
<span class="token comment">// const el = document.getElementById('xxx')</span>
|
|
|
|
<span class="token comment">// get css var</span>
|
|
<span class="token function">getComputedStyle</span><span class="token punctuation">(</span>el<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPropertyValue</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string">--el-color-primary</span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">)</span>
|
|
|
|
<span class="token comment">// set css var</span>
|
|
el<span class="token punctuation">.</span>style<span class="token punctuation">[</span><span class="token string">'--el-color-primary'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'red'</span>
|
|
</code></pre></div><p>If you want a more elegant way, check this out. <a href="https://vueuse.org/core/usecssvar/" target="_blank" rel="noopener noreferrer">useCssVar | VueUse</a></p>`,40),e=[t],i='{"title":"Theming","description":"","frontmatter":{"title":"Theming","lang":"en-US"},"headers":[{"level":2,"title":"Change theme color","slug":"change-theme-color"},{"level":3,"title":"By SCSS variables","slug":"by-scss-variables"},{"level":3,"title":"How to override it?","slug":"how-to-override-it"},{"level":3,"title":"By CSS Variable","slug":"by-css-variable"}],"relativePath":"en-US/guide/theming.md","lastUpdated":1654354655000}',o={},r=Object.assign(o,{setup(p){return(c,l)=>(s(),n("div",null,e))}});export{i as __pageData,r as default};
|