说明

【Vue 开发实战】学习笔记。

vuecli3 配置

module.exports = {css: {loaderOptions: {less: {modifyVars: {'primary-color': '#1DA57A',},javascriptEnabled: true},}},
}

我们可以修改一下写法

<style lang="less" src="./index.less"></style>

引入下面的 index.less 就行

@import "~ant-design-vue/lib/style/themes/default.less";.kaimo-handle {position: absolute;top: 240px;right: 300px;width: 48px;height: 48px;background-color: @primary-color;color: #fff;font-size: 20px;text-align: center;line-height: 48px;border-radius: 3px 0 0 3px;
}

在线动态编译

如果你有报错可以参考我遇到的问题文章链接:Ant design vue动态主题切换报错Error LessError: Cannot find module ‘antd/lib/style/themes/default.less

这里我们使用 antd-theme-webpack-plugin

这个 webpack 插件用于生成特定颜色的 less/css 并注入到您的 index.html 文件中,以便您可以在浏览器中更改 Ant Design 特定的颜色主题。

具体的配置看文档就行。

但是这个我们不安装该依赖,主要原因还是版本1.3.9报错,有兴趣的可以看看我刚刚提到的文章。

1、新建插件

我们新建一个 ant-design-vue-pro\webpack-plugins\antd-theme-webpack-plugin.js 插件:里面的代码直接复制 antd-theme-webpack-plugin 的代码。

// https://github.com/mzohaibqc/antd-theme-webpack-plugin/blob/master/index.jsconst { generateTheme } = require("antd-theme-generator");
const webpack = require("webpack");
const { RawSource } = webpack.sources || require("webpack-sources");
const path = require("path");class AntDesignThemePlugin {constructor(options) {const defaultOptions = {varFile: path.join(__dirname, "../../src/styles/variables.less"),antDir: path.join(__dirname, "../../node_modules/antd"),stylesDir: path.join(__dirname, "../../src/styles/antd"),themeVariables: ["@primary-color"],indexFileName: "index.html",generateOnce: false,lessUrl: "https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js",publicPath: "",};this.options = Object.assign(defaultOptions, options);this.generated = false;this.version = webpack.version;}apply(compiler) {const pluginName = "AntDesignThemePlugin";if (this.version.startsWith("5.")) {compiler.hooks.thisCompilation.tap(pluginName, (compilation) => {compilation.hooks.processAssets.tapAsync({name: pluginName,stage: webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE,},(assets, callback) =>this.addAssets(compilation, assets, callback));});} else {compiler.hooks.emit.tapAsync(pluginName, (compilation, callback) =>this.addAssets(compilation, compilation.assets, callback));}}addAssets(compilation, assets, callback) {this.generateIndexContent(assets, compilation);if (this.options.generateOnce && this.colors) {this.generateColorStylesheet(compilation, this.colors);return callback();}generateTheme(this.options).then((css) => {if (this.options.generateOnce) {this.colors = css;}this.generateColorStylesheet(compilation, css);callback();}).catch((err) => {callback(err);});}generateIndexContent(assets, compilation) {if (this.options.indexFileName &&this.options.indexFileName in assets) {const index = assets[this.options.indexFileName];let content = index.source();if (!content.match(/\/color\.less/g)) {const less = `<link rel="stylesheet/less" type="text/css" href="${this.options.publicPath}/color.less" /><script>window.less = {async: false,env: 'production'};</script><script type="text/javascript" src="${this.options.lessUrl}"></script>`;const updatedContent = content.replace(less, "").replace(/<body>/gi, `<body>${less}`);if (this.version.startsWith("5.")) {compilation.updateAsset(this.options.indexFileName,new RawSource(updatedContent),{ size: updatedContent.length });return;}index.source = () => updatedContent;index.size = () => updatedContent.length;}}}generateColorStylesheet(compilation, source) {if (this.version.startsWith("5.")) {compilation.emitAsset("color.less", new RawSource(source), {size: source.length,});return;}compilation.assets["color.less"] = {source: () => source,size: () => source.length,};}
}module.exports = AntDesignThemePlugin;

2、安装依赖

然后安装 antd-theme-webpack-plugin 需要的依赖 antd-theme-generator

此脚本生成颜色特定的样式/更少文件,您可以使用该文件在浏览器中动态更改主题

npm install antd-theme-generator@1.2.3 -D

具体可以看文档: https://github.com/mzohaibqc/antd-theme-generator

3、配置 vue.config.js

const path = require("path");const AntDesignThemePlugin = require('./webpack-plugins/antd-theme-webpack-plugin');const options = {antDir: path.join(__dirname, './node_modules/ant-design-vue'),stylesDir: path.join(__dirname, './src'),varFile: path.join(__dirname, './src/assets/styles/theme/variables.less'),themeVariables: ['@primary-color'],generateOnce: false
}const themePlugin = new AntDesignThemePlugin(options);module.exports = {lintOnSave: false,css: {loaderOptions: {less: {modifyVars: {'primary-color': '#1DA57A',},javascriptEnabled: true},}},chainWebpack: config => {const svgRule = config.module.rule('svg');// 清除已有的所有 loader。// 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。svgRule.uses.clear();// 添加要替换的 loadersvgRule.use('vue-svg-loader').loader('vue-svg-loader');},configureWebpack: {plugins: [ themePlugin ]},devServer: {proxy: {// '@(/api)': { target: 'http://localhost:3000','/api': {target: 'http://localhost:8080',bypass: function (req, res, proxyOptions) {if (req.headers.accept.indexOf('html') !== -1) {console.log('Skipping proxy for browser request.');return '/index.html';} else if(process.env.MOCK !== "none") {// 将请求url转为文件名const name = req.path.split("/api/")[1].split("/").join("_");const mock = require(`./mock/${name}`);const result = mock(req.method);// 需要清除缓存delete require.cache[require.resolve(`./mock/${name}`)];return res.send(result);}},},},},
}

4、添加 variables.less

新建 ant-design-vue-pro\src\assets\styles\theme\variables.less

@import "~ant-design-vue/lib/style/themes/default.less";

关于 ~ 的使用可以查看:https://www.npmjs.com/package/less-loader#webpack-resolver

5、配置 index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width,initial-scale=1.0" /><link rel="icon" href="<%= BASE_URL %>favicon.ico" /><title><%= htmlWebpackPlugin.options.title %></title></head><body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><!-- built files will be auto injected --><link rel="stylesheet/less" type="text/css" href="/color.less" /><script>window.less = {async: false,env: 'production',javascriptEnabled: true,modifyVars: {'primary-color': 'orange',}};</script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js"></script></body>
</html>

6、效果

启动服务,我们就可以看到:

我们动态修改一下,在控制台将主题色改为粉色的,执行下面代码

window.less.modifyVars({"@primary-color": "pink"})

我们可以看到主题色就改变了。

关于生成的 color.less 文件,可以访问 http://localhost:8080/color.less 查看

【Vue 开发实战】实战篇 # 42:如何定制主题及动态切换主题相关推荐

  1. vue + element-UI 实现深色模式和主题色动态切换

    vue + element-UI 实现深色模式和主题色动态切换 文章目录 vue + element-UI 实现深色模式和主题色动态切换 前言 深色模式和主题色动态切换 本地样式切换 主题色切换 el ...

  2. vue动态切换css文件_vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  3. vue动态发布到线上_vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  4. vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css,具体实现步骤如下: 1.添加webpack插件,新建文件we ...

  5. 直播短视频系统开发,动态切换主题色

    直播短视频系统开发,动态切换主题色相关的代码: 点击按钮变量存储切换状态: override fun onClick(v: View?) {when (v?.id) {R.id.btn_theme1 ...

  6. element如何动态切换主题(vite+vue+ts+elementPlus)

    前言 提示:动态切换主题使用的是css3的var函数现实 示例:切换--main-bg-color的值,使用<div style="--main-bg-color:red"& ...

  7. vue基于scss的动态切换主题颜色

    根据预设的配色方案,在前端动态切换系统主题颜色 大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量. ...

  8. vue开发看这篇文章就够了 vue知识大全

    Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...

  9. vue动态切换主题色

    1,style文件中新建一个theme.json用来进行主题样式存储 {"blue": {"--themeColor": "#1eafc5" ...

最新文章

  1. Calc3: Multiple Integrals
  2. 汽车开放系统架构(AUTOSAR)是什么
  3. 点击链接,执行.py脚本,cgi脚本,浏览器中没有显示解析后的web页面,而是.py文件本身的代码内容...
  4. sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
  5. 计算机组成结构IR,计算机组成与体系结构试题
  6. 【BCVP升级】泛型主键的使用
  7. linux支持ppp网卡,linux和安卓上(ppp widget)使用3g网卡的方法
  8. linux图形驱动安装失败,红旗Linux 下NVIDIA的驱动安装问题
  9. ffmpeg-filter 入门
  10. Python基础:16面向对象概述
  11. BZOJ3028 食物
  12. python判断字符串,str函数isdigit、isdecimal、isnumeric的区别
  13. 【Selenium2】【Shell】
  14. 计算机如何建立小型服务器,如何将个人PC搭建成小型服务器
  15. 2011年5月10日中兴通讯实习生招聘笔试小记
  16. 自定义对象转换接口实现JDBC的封装
  17. 58上租房显示服务器异常,“58同城租房信息”满是套路,你中招了吗?
  18. ARFoundation系列讲解 - 31 光照估计
  19. python+matplotlib绘图线条类型、颜色、散点类型
  20. JavaApi:IO基础

热门文章

  1. Android获取Bitmap网络图片类型
  2. Linux永久关闭防火墙命令
  3. 一边学计算机一边上班累的说说,形容工作很累的心情说说 关于上班辛苦的朋友圈感言...
  4. 我们把计算机硬件系统和软件系统称为,我们把计算机硬件系统和软件系统总称为__________。...
  5. 验证码短信发送失败比较常见的4大原因
  6. Java项目-基于Springboot实现校友录管理系统
  7. 微演示 ppt/pdf/doc 转html5 用法 (2)-- 前端脚本接口
  8. 多行内容超出...显示的终极解决方案
  9. android后台进程限制,Android O:服务未被后台执行限制停止
  10. 怎样给边框添加阴影?CSS3属性box-shadow帮你搞定!