angular7主题样式在线切换

2023-10-26

参考ng-alain和delon

 思路就是动态加载css文件
代码实现
  1. 写两套less文件,分别为light.less和dark.less

  2. 用相关插件将less文件转为一个js对象(less-vars-to-js 插件)

    function genToJs(type) {
      const ngZorroAntdStylePath = path.join(__dirname, '../node_modules/ng-zorro-antd/style');
      const ngZorro = `
      ${fs.readFileSync(path.join(ngZorroAntdStylePath, 'color', 'colors.less'), 'utf8')}
       ${fs.readFileSync(path.join(ngZorroAntdStylePath, 'themes', `default.less`), 'utf8')}
      `;
    
      const packagesPath = path.join(__dirname, '../src/styles');
      const ngAlain = `
      ${fs.readFileSync(path.join(packagesPath, `${type}.less`), 'utf8')}
      `;
    
      return lessToJs(`${ngZorro}${ngAlain}`, {
        stripPrefix: true,
        resolveVariables: false,
      });
    }
    
    const darkThemeVars = genToJs('dark');
    const lightThemeVars = genToJs('light');
    
  3. 用less插件修改modifyVars中的变量,根据主题来切换生成的对象,然后导出成css文件

    function gen(type) {
      return less
        .render(themeContent, {
          javascriptEnabled: true,
          plugins: [
    	      new LessPluginNpmImport({ prefix: '~' }), 
    	      new LessPluginCleanCSS({ advanced: true })
    	  ],
          modifyVars: {
            ...(type === 'dark' ? darkThemeVars : lightThemeVars),
          },
        })
        .then((data) => {
          fs.writeFileSync(
            // 主题样式的输出文件
            `src/assets/style.${type}.css`,
            data.css,
          );
        })
        .catch((e) => {
          // 记录渲染错误
          console.error(type, e);
        });
    }
    
    Promise.all([gen('dark'), gen('light')]).then(() => {
      console.log('Success!');
    });
    
  4. 动态切换css文件

    onThemeChange(theme: SiteTheme): void {
        if (!this.platform.isBrowser) {
          return;
        }
        this.theme = theme;
        const dom = document.getElementById('site-theme');
        if (dom) {
          dom.remove();
        }
        localStorage.removeItem('site-theme');
        if (theme !== 'default') {
          const el = (this.el = document.createElement('link'));
          el.type = 'text/css';
          el.rel = 'stylesheet';
          el.id = 'site-theme';
          el.href = `assets/style.${theme}.css`;
    
          localStorage.setItem('site-theme', theme);
          document.body.append(el);
        }
        this.updateChartTheme();
      }
    
  5. 总代码如下:

    const less = require('less');
    const LessPluginCleanCSS = require('less-plugin-clean-css');
    const LessPluginNpmImport = require('less-plugin-npm-import');
    const fs = require('fs');
    const path = require('path');
    const lessToJs = require('less-vars-to-js');
    // const darkThemeVars = require('@delon/theme/theme-dark');
    // const compactThemeVars = require('@delon/theme/theme-compact');
    const appStyles = 'src/styles.less'; // 应用的样式入口文件
    const themeContent = `@import '${appStyles}';`;
    
    // 根据参数来将less文件生成对应的js对象
    function genToJs(type) {
      const ngZorroAntdStylePath = path.join(__dirname, '../node_modules/ng-zorro-antd/style');
      const ngZorro = `
      ${fs.readFileSync(path.join(ngZorroAntdStylePath, 'color', 'colors.less'), 'utf8')}
       ${fs.readFileSync(path.join(ngZorroAntdStylePath, 'themes', `default.less`), 'utf8')}
      `;
    
      const packagesPath = path.join(__dirname, '../src/styles');
      const ngAlain = `
      ${fs.readFileSync(path.join(packagesPath, `${type}.less`), 'utf8')}
      `;
    
      return lessToJs(`${ngZorro}${ngAlain}`, {
        stripPrefix: true,
        resolveVariables: false,
      });
    }
    
    const darkThemeVars = genToJs('dark');
    const lightThemeVars = genToJs('light');
    
    // 根据参数来生成对应的css文件
    function gen(type) {
      return less
        .render(themeContent, {
          javascriptEnabled: true,
          plugins: [new LessPluginNpmImport({ prefix: '~' }), new LessPluginCleanCSS({ advanced: true })],
          modifyVars: {
            ...(type === 'dark' ? darkThemeVars : lightThemeVars),
          },
        })
        .then((data) => {
          fs.writeFileSync(
            // 主题样式的输出文件
            `src/assets/style.${type}.css`,
            data.css,
          );
        })
        .catch((e) => {
          // 记录渲染错误
          console.error(type, e);
        });
    }
    
    Promise.all([gen('dark'), gen('light')]).then(() => {
      console.log('Success!');
    });
    

参考:
delon: https://github.com/ng-alain/delon/blob/9.x/scripts/build/vars.js#L7-L33.
ng-alalin: https://github.com/ng-alain/ng-alain/blob/9.x/scripts/theme.js#L10-L34.

补充

  • 切换完样式下拉框、提示信息有问题,不正常显示
    • 原因: dropdown和tooltip组件等样式在组件中写的
.ant-dropdown-menu,
.ant-select-dropdown,
.ant-mention-dropdown,
.ant-dropdown,
.ant-cascader-menus {
  top          : 100%;
  left         : 0;
  position     : relative;
  width        : 100%;
  margin-top   : 4px;
  margin-bottom: 4px;
}

.ant-tooltip{
  position     : relative;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular7主题样式在线切换 的相关文章

  • 仅使用 CSS 使相邻同级元素具有相同的宽度

    我提前表示抱歉 因为出于保密原因 我无法显示我正在处理的代码 图像 但我认为我可以很简单地解释它 我有一个 h1 充当我的网页标题的元素 该标题可以根据用户所在的特定页面的标题更改长度 因此它可以说 主页 也可以说 已保存的项目 等 长度各
  • CSS - 是否有 RTL 语言的 @media 查询

    我正在向我的大型 css 较少 样式添加 rtl 从右到左 语言支持 我正在寻找一种在 less 文件中添加嵌套规则的方法 就像可以通过分辨率一样 对于屏幕尺寸 我可以这样做 有 small为某些分辨率定义的变量 并且非常舒适 my cla
  • 为什么 Bootstrap 尝试在 Edge 中加载 LESS 文件?

    我有一个使用 Twitter Bootstrap 的网页 它在 Chrome Firefox 和 Safari 中运行良好 然而 当我尝试在 Windows 10 上的 Edge 中查看它时 收到一堆 403 错误 指出它无法从 Boots
  • less 循环中的空间

    我有这个 loop index when index lt to page index nav ul li nth child index background fff loop index 1 似乎有问题 因为我的 css 输出是 ul
  • 引导程序中的字形不显示

    div class container fluid div class sidebar left div class well h5 Administration h5 ul class administration list li cla
  • 使用 LESS 及其 @import 时的 CSS 冗余

    我真的很喜欢这个想法和概念LESS http lesscss org 然而我偶然发现了一个错误 我很早就向作者报告了该错误 但尚未得到任何反馈 也许只有我做错了事 My application less 与此类似的文件 import res
  • 在 LESS 中生成供应商前缀

    我已经将这种方法拼凑在一起 使用 LESS 生成供应商前缀的属性和动画 首先是一些工厂函数 vendorprefix property value webkit property value moz property value ms pr
  • 使用 LESS mixin 添加供应商前缀

    我收到此混合的语法错误 vendors statement statement moz statement webkit statement 任何方法都可以做到这一点 或者混合变量必须位于 a 的右侧 从 Less v2 开始 你可以使用自
  • 是否可以将 Web Essentials 配置为不将 *.css 文件添加到 Visual Studio 项目?

    我们使用 Visual Studio Web Essentials 将 LESS 文件编译为 CSS 每当我们更改 LESS 文件时 Web Essentials 都会坚持创建 css min css 和 css map 文件并将它们添加到
  • 如何扩展具有动态形成选择器的类/混合

    如何扩展使用 组合器动态形成的 Less 类 less 产生预期输出 hello world color red foo extend hello world font size 20px 预期的 CSS 输出 hello world fo
  • Node.js 找不到模块 - 干扰 Windows 上的 cygwin

    我正在测试 Bootstrap 框架 来自 Twitter 并尝试在安装 Node js 后在本地构建它 它失败了 因为它找不到 less 模块 我也使用 npm install g less 安装了该模块 C Users geir cod
  • 如何使用 16 或 24 列的 bootstrap

    我需要一些帮助将 bootstrap 2 0 4 设置为 16 或 24 列 而不是默认的 12 列 我无法理解我做错了什么我尝试了 bootstrap 站点上的自定义选项 并尝试更改变量中的网格变量 less 文件并使用 Crunch 重
  • 当项目中有多个文件时,如何使用 Grunt 配置 LESS 的 sourceMap?

    我有多个 less 文件 我希望将它们处理为匹配的 css 每个文件的 sourceMaps 都与源位于同一文件夹中 这有多难 我用 less 直接执行此操作没有问题 但无法弄清楚如何在 grunt contrib less 中执行此操作
  • Webpack 2 的语义 UI 问题

    一直在努力使用 Webpack 2 进行语义 ui 设置 我遇到了一些与默认语义 ui 主题中的字体相关的错误 以及另一个关于image webpack loader ERROR in css loader lessPlugins opti
  • 通过 m2e 自动更新生成的 css 文件

    我正在使用lesscss maven plugin生成不同的css文件到目标目录 target generated sources 然后使用maven war plugin将此目录添加为 webResouce 这些文件将完美生成 但是 m2
  • 删除编译时的 LESS // 注释

    是否可以配置LESS在通过JS编译时删除 注释 我想从输出的 less 文件中删除它们 Less的单行注释 根据文档所述 应该保持沉默 单行注释在 LESS 中也有效 但它们是 沉默的 它们不会出现在编译后的 CSS 输出中 Hi I m
  • lessc:未找到命令

    我使用的是 OS X 8 并且是 Node LESS 的新手 我以为我之前安装了 lessc 当我转到 usr local bin 时 我看到了 lessc 但对于我的生活来说 我无法运行它 每当我运行它时 我都会看到 bash lessc
  • Webpack 4 with Less 和 MiniCssExtractPlugin 使用条目

    我的应用程序中的样式结构如下 应用 css bootstrap boostrap less gt has import another less another less common common less entries bootstr
  • 如何使用 Antd / Less 和 Sass / CSS 模块配置 Next.js

    我想用Next js https nextjs org 带有 Sass 和 CSS 模块但也想使用蚂蚁设计 https ant design 并希望对较小的建筑尺寸使用 Less 样式 我可以启用 CSS 模块或 Less 加载器 但不能同
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l

随机推荐

  • JSON使用的一些总结

    http sx666 blogspot com 2007 11 json html JSON JavaScript Object Notation 是一种轻量级的数据交换格式 它采用完全独立于语言的文本格式 可以用来在客户端和服务器端传输数
  • innerText和innerHTML区别

    innerText和innerHTML区别 尽管DOM带来了动态修改文档的能力 但对开发人员来说 这还不够 IE4 0为所有的元素引入了两个特性 以更方便的进行文档操作 这两个特性是innerText和innerHTML 其中innerTe
  • Oracle:重复数据去重,只取其中一条(最新时间/其他字段排序规则)数据

    一 问题 一个会话id代表一个聊天室 返回该聊天室最新的一条数据显示在会话列表 二 解决思路 使用row number over 分组排序功能 来解决该问题 1 语法格式 row number over partition by 分组列 o
  • TMOD、SCON、PCON寄存器的配置

    TMOD控制寄存器 TMOD是定时器 计数器模式控制寄存器 它是一个逐位定义的8为寄存器 但只能使用字节寻址 其各位是 由上图我们就可以看出 这个寄存器控制了两个定时器 计数器 寄存器的高四位控制定时器1 低四位控制定时器0 GATE 门控
  • 数据分析毕业设计 二手房数据爬取与分析可视化系统 -python

    1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • Air700E开发板

    文章目录 基础资料 概述 主要功能 外设分布 PinOut 管脚定义 管脚功能说明 固件升级 正常开机模式 下载模式 IO 电平选择 基础资料 Air700E文档中心 概述 EVB Air700E 开发板是合宙通信推出的基于 Air700E
  • 去除VsCode代码前面的小点点

    去除VsCode代码前面的小点点 去除图片中的点 步骤 File gt Preferences gt Setting 搜索RenderWhitespace 将Text Editor下的Editor Render Whitespace改为no
  • peewee-async使用描述

    1 peewee async是一个为peewee ORM 提供由asyncio支持的异步io库 在单独使用peewee连接池连接时 同时使用到了async和await协程 这样操作会阻塞整个进程 因为tornado是单进程 必须数据库也使用
  • 数据库的简介与类型 #CSDN博文精选# #IT技术# #数据库#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 高通 AR Unity 虚拟按钮

    1 虚拟按钮是图像上的目标 用户可以在现实世界中触摸 以触发一个动作的 热点 现有的图像目标的一个实例的VirtualButton预制拖动到场景中添加虚拟按键 平移和缩放按钮 以匹配所需的位置 并给它一个名字 虚拟的按钮添加这样写入到con
  • 计算机视觉概述

    关注公众号 CV算法恩仇录 本文介绍了计算机视觉的主要任务及应用 全文大约 3500 字 阅读时间 10 分钟 人们或许没有意识到自己的视觉系统是如此的强大 婴儿在出生几个小时后能识别出母亲的容貌 在大雾的天气 学生看见朦胧的身体形态 能辨
  • v-viewer 插件图片点击放大预览的几种使用方法

    官网git地址 https github com mirari v viewer 最终效果如下 ps 按钮样式都是可以根据自己需求调整的 第一种使用方法 支持UMD用法 建议把v viewer相关的js和css文件下载到本地引用 可以到上面
  • set容器、map容器

    set multiset 容器 set基本概念 简介 所有元素都会在插入时自动被排序 本质 set multiset属于关联式容器 底层结构是用二叉树实现 set和multiset区别 set不允许容器中有重复的元素 multiset允许容
  • elk笔记23--定期清理索引

    elk笔记23 定期清理索引 1 介绍 2 方案 代码 2 1 方案介绍 2 2 代码 2 3 测试 3 注意事项 4 说明 1 介绍 在生产环境中 如果日志量过大 就会导致集群持续产生很多索引 占用很多存储空间 因此需要定期清理索引 确保
  • 套圈·分治

    套圈 题目信息 输入 测试样例 解答 想法 题目信息 Have you ever played quoit in a playground Quoit is a game in which flat rings are pitched at
  • 闭环步进与伺服电机差异

    当给步进电机配备编码器闭环控制后 从广义上来看 闭环步进电机和伺服电机两者是没有什么大的区别 但是 要详细区分闭环步进电机和伺服电机的不同之处 你需要先了解一下伺服电机和步进电机的差异 闭环步进电机是在步进电机上加装了高精度的编码器 用伺服
  • 理解扩散模型:Diffusion Models & DDPM

    引言 在前面的博客中 我们讨论了生成模型VAE和GAN 近年来 新的生成模型 扩散模型受到越来越多的关注 因此值得好好去研究一番 扩散模型 Diffusion Models 最早由 2 于2015年提出 但直到2020年论文 3 发表之后才
  • 不断发展中的自然语言处理技术,会在未来消灭“笔”和“键盘”吗?

    花满楼 发布于2014 07 20 23 11 00 目前 Siri 和 Google Now 的语音识别技术虽然还不完善 但在未来却很可能威胁到文字的地位 我们手写或者打字 在当下已经成为了无比繁重的劳动 不断的输入各种文字信息 在网页上
  • 快手20230807提前批一面

    Q and A 面试官 你是专硕还是学硕 能不能让实习 研究方向 面试官 项目基于什么背景做的 xxx 面试官 介绍一下框架 xxxx 面试官 里面中用了什么技术 首先的话 服务层使用了springboot 并且使用了mp 持久化使用了my
  • angular7主题样式在线切换

    参考ng alain和delon 思路就是动态加载css文件 代码实现 写两套less文件 分别为light less和dark less 用相关插件将less文件转为一个js对象 less vars to js 插件 function g