1-安装less和必要插件
npm install less-loader@5.0.0 --savenpm install less --save
- vue-cli配置需要下列插件 vite不需要
npm install style-resources-loader -Dnpm 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-loaderchainWebpack: (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个样式文件,作用分别是默认主题、自定义的几套主题以及修改主题的工具函数
- 通常自定义主题我们会提供给用户颜色选择面板,大家可以结合使用
