1-安装less和必要插件
npm install less-loader@5.0.0 --save
npm install less --save
- vue-cli配置需要下列插件 vite不需要
npm install style-resources-loader -D
npm install vue-cli-plugin-style-resources-loader -D
2-实现换肤步骤
- 新建style.less(/src/assets/theme/style.less)
// 默认的主题颜色 全局css变量
@primaryColor: var(--primaryColor, #000);
@primaryTextColor: var(--primaryTextColor, green);
@logo:var(--logo,url(/monitor/static/imgs/index/logo.png));
// 导出变量
:export {
name: "less";
primaryColor: @primaryColor;
primaryTextColor: @primaryTextColor;
logo:@logo;
}
3-vue配置全局less变量
- 参考连接 https://www.cnblogs.com/zhizou/p/14574105.html
3.1使用vite开发时的配置 配置vite.config.js
import {defineConfig} from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';
export default defineConfig({
plugins: [vue()],
css: {
preprocessorOptions: {
less: {
modifyVars: {
hack: `true; @import (reference) "${resolve('src/assets/theme/style.less')}";`,
},
javascriptEnabled: true,
}
}
},
})
3.2使用vue-cli2开发时的配置 vue.config.js
const path = require('path');
module.exports = {
pluginOptions: {
"style-resources-loader": {
preProcessor: "less",
patterns: [
path.resolve(__dirname, "src/assets/theme/style.less")
]
}
}
}
当我们配置好vite.config.js/vue.config.js文件后,就可以在项目的任何地方使用我们预先定义的less变量了,
3.3使用vue-cli5.x开发时的配置 vue.config.js
注意“less”: “^3.10.3”,“less-loader”: “^6.0.0”,
const { defineConfig } = require('@vue/cli-service');
module.exports = defineConfig({
devServer:{},
// 安装:style-resources-loader
chainWebpack: (config) => {
const oneOfsMap = config.module.rule('less').oneOfs.store;
oneOfsMap.forEach(item => {
item
.use('style-resources-loader')
.loader('style-resources-loader')
.options({
// 这里的路径不能使用 @ 符号,否则会报错
patterns: './src/assets/theme/style.less'
})
.end();
});
},
})
主题配置的图片有可能找不到 将图片目录放到src同级(暂时没解决办法)
4-配置几套可选主题
在/src/assets/theme目录下新建model.js,编写自定义主题代码,代码如下:
// 一套默认主题以及一套暗黑主题
export const themes = {
default: {
primaryColor: 'red',
},
dark: {
primaryColor: '#000000',
logo:'url(/monitor/static/imgs/index/logo.png)',
},
};
示例代码如下:
- 记得在style上加 lang=”less” 否则不生效
<style lang="less" scoped>
p {
color: @primaryTextColor;
background: @logo;
background-size: 100% 100%;
}
</style>
5-编写修改主题的方法
- 在/src/assets/theme文件夹下新建theme.js文件,代码如下: ```bash import { themes } from “./model”;
const changeStyle = (obj) => {
for (let key in obj) {
document.getElementsByTagName(“body”)[0]
.style.setProperty(--${key}
, obj[key]);
}
};
// 改变主题的方法 export const setTheme = (themeName) => { localStorage.setItem(“theme”, themeName); // 保存主题到本地,下次进入使用该主题 const themeConfig = themes[themeName]; // 如果有主题名称,那么则采用我们定义的主题 changeStyle(themeConfig); // 改变样式 };
- 更改自定义主题颜色
```bash
// 改变主题的方法
export const setTheme = (themeName) => {
localStorage.setItem("theme", themeName); // 保存主题到本地,下次进入使用该主题
const themeConfig = themes[themeName];
// 如果有主题名称,那么则采用我们定义的主题
if (themeConfig) {
localStorage.setItem("primaryColor", themeConfig.primaryColor); // 保存主题色到本地
changeStyle(themeConfig); // 改变样式
} else {
let themeConfig = {
primaryColor: localStorage.getItem("primaryColor"),
};
changeStyle(themeConfig);
}
};
6-动态变换主题
<template>
<div class="hello">
<div class="box-1"></div>
<div class="box-2"></div>
<p>我是测试文字</p>
<button @click="defaultTheme">默认主题</button>
<button @click="dark">暗黑主题</button>
<button @click="custom">自定义主题</button>
</div>
</template>
import {onMounted} from 'vue';
import { setTheme } from "../assets/theme/theme";
export default ({
setup(){
onMounted(()=>{
if(localStorage.getItem("theme")){
setTheme(localStorage.getItem("theme"));
}else{
setTheme('default');
}
});
// 更改为默认主题
const defaultTheme = () => {
setTheme("default");
}
// 更改为暗黑主题
const dark = () =>{
setTheme("dark");
}
// 更改为自定义主题
custom() {
let newColor = 'pink';
let newPrimaryColor = `${newColor.r},${newColor.g},${newColor.b}`;
localStorage.setItem("primaryColor", newPrimaryColor); // 将新的主题色存入本地
setTheme();
},
return {
defaultTheme,
setTheme,
dark,
custom
}
}
})
- 利用less和css变量动态修改主题,我们主要新建了3个样式文件,作用分别是默认主题、自定义的几套主题以及修改主题的工具函数
- 通常自定义主题我们会提供给用户颜色选择面板,大家可以结合使用