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主题样式在线切换 的相关文章

  • 配置Webpack将LESS文件的目录构建成相应的CSS文件

    我希望使用 Webpack 编译我们所有的 less 文件 less to public css并将它们作为常规 css 包含在我们的服务器端模板中 not将文本粘贴到使用 ExtractText 插件或重载 require 中 也就是说
  • 更少的变量:这可能吗

    所以我的代码在类型方面存在重大问题 但我似乎无法解决它 每当我减去1从线8有问题 我该如何解决这个问题 max columns 2 column 1 width min 30 column 2 width min 40 loop colum
  • 如何在 Node.js 项目中自动执行编译 Twitter Bootstrap 等前端框架的任务?

    如何在 Node js 项目中自动执行编译 Twitter Bootstrap 的任务 我正在编辑 LESS 文件 这些文件编译成 Node js 项目的 Bootstrap 自定义版本 因此我不能只使用在线定制器或预编译的 JavaScr
  • 如何将手写笔块级导入与 Vuetify 样式结合使用

    使用手写笔块级导入 vuetify style styl myapp import vuetify src stylus main 这是为了确保 vuetify css 不会干扰页面中未使用 vuetify 的其他部分的元素 但不幸的是它不
  • 如何在 Angular 2 中使用 Less?

    我想知道如何在我的 Angular 2 项目中添加更少的编译 因为每个组件都有自己的 css 文件 现在将是 less文件 我不确定如何使文件编译为 css 我也用谷歌搜索了这个问题 但没有找到任何解决我的问题的方法 EDIT为了让我的问题
  • 媒体查询分组而不是多个分散的匹配媒体查询

    我正在尝试 LESS 不喜欢 SASS 语法 并一直试图找出用它进行媒体查询的最佳方法是什么 我通读了this http alwaystwisted com post php s 2012 05 05 everyday im bubblin
  • 在字符串内使用带有 LESS 的函数

    我搜索了文档和 SO 但找不到我的查询的答案 使用 LESS 将函数结果包含在字符串中的正确方法是什么 例如 我定义了一个变量 并希望将其变亮以形成盒子阴影 例如 这就是我想做的事情 box shadow inset 0 1px 1px r
  • 如何扩展具有动态形成选择器的类/混合

    如何扩展使用 组合器动态形成的 Less 类 less 产生预期输出 hello world color red foo extend hello world font size 20px 预期的 CSS 输出 hello world fo
  • 如何在 LESS 中使用 if 语句

    我正在寻找某种 if 语句来控制background color不同的div元素 我已经尝试过以下内容 但无法编译 debug true header background color yellow when debug true titl
  • wp_enqueue_style 和 rel 除了样式表之外?

    我创建 或者更好地尝试 使用 Less 创建我的第一个 WordPress 主题 我所做的就是在我的functions php中使用这样的脚本 wp register style screen css get bloginfo templa
  • 按名称从 css LESS 列表中提取项目

    如果我有一个不太像的列表 colors red f00 green 0f0 blue 00f 我知道我可以循环列表并获取颜色 但如果我想获取特定的颜色怎么办 说我想做 extract colors green 将 0f0 从列表中删除 有没
  • 删除编译时的 LESS // 注释

    是否可以配置LESS在通过JS编译时删除 注释 我想从输出的 less 文件中删除它们 Less的单行注释 根据文档所述 应该保持沉默 单行注释在 LESS 中也有效 但它们是 沉默的 它们不会出现在编译后的 CSS 输出中 Hi I m
  • 对于固定的 960px 布局,我应该在 twitter bootstrap 中设置哪些值?

    我正在使用 twitter bootstrap 并且从 github 克隆了 less 我想设置网格宽度变量 因为我需要 960px 固定布局 940px 宽度的默认值为 gridColumns 12 gridColumnWidth 60p
  • 如何简化这个 LESS CSS Box-shadow mixin? (带有“方向”的多个阴影)

    如何减少这段代码 可能使用循环 以拥有一个接受方向和数字的 函数 dir 想要的 方向 number 我需要多少次影子 这里是10次 color 阴影的颜色 Example 可以工作 但不是很容易使用 perspective box dir
  • LESS CSS 语法对现代化很有用

    通常我使用现代化 http modernizr com 了解浏览器的功能 同时 我用LESS CSS http lesscss org 使我的CSS更具可读性和可维护性 使用 LESS 嵌套规则的常见样式如下所示 header color
  • 如何使用 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
  • 使用 grunt 编译具有不同变量的 LESS

    我有基于 Bootstrap 的 HTML 模板 有不同的颜色 红色 绿色等 颜色正在改变使用 brand变量在variables less 现在我转到这个文件 更改变量 编译 less 文件 进入已编译的 css 文件目录并重命名 CSS
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • 如何在没有@import的情况下减少@import?

    我用的较少 从 Google PageSpeed 我了解到 使用 importCSS 文件中的内容会影响网站速度 所以我想排除任何 import来自我的 CSS 的东西 我有 2 个不同的样式表reset css and rebuild c

随机推荐

  • 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