如何在 angular2 + Less 中动态切换 css 主题?

How to switch css theme on the fly in angular2 + Less?

我正在努力解决这个问题,但找不到任何答案,尽管这似乎是一种常见的情况。

我正在 angular5 中构建一个网络应用程序,所有样式都使用 @component styleUrls。

我用的less,所有颜色定义在一个global-vars.less文件中,导入到所有封装的组件中。

global-vars.less:

@color_0:  #283238; 

some-component.less:

@import '../../global-vars';
.my-div {
  background-color: @color_0;
}

我想在 global-vars 中添加一个图层。less 可以通过 parent class:

切换颜色

global-vars.less:

@color_0:  #283238; 
@color_1:  #EEFFEE; 

.dark-theme {
  @background-app-color: @color_0;
}

.light-theme {
  @background-app-color: @color_1;
}

some-component.less:

@import '../../global-vars';
.my-div {
  background-color: @background-app-color;
}

当然,它不能像 LESS pre-compiles 那样工作。但是我找不到可行的技术。 我尝试更改 header 中的 CSS 文件,但是因为 angular 使用作为标签插入的封装样式表,这对我没有帮助。 我尝试使用 mixin,但我无法根据 parent class 创建 mixin,所以运气不好。

我唯一的选择是复制所有模块的所有 CSS 层次结构

.parent {
  .child {
    background: @light-color;
  }
}

.dark theme .parent {
  .child {
    background: @dark-color;
  }
}

但由于项目庞大,维护起来将是一场噩梦

如有任何帮助,我们将不胜感激。 谢谢。

我使用 CSS 自定义属性(变量)找到了我的答案 显然,它已经有足够的支持, 使用它们我可以绕过所有 angular 封装问题。

我创建了一个 themes.css 文件并导入到 main.css。

我有:

:root {
  --light_color_0: #FFF;
  --light_color_1: #EEE;

  --dark_color_0: #000;
  --dark_color_1: #111;
}

在同一个文件中:

:root {
  --bg_color: var(--light_color_0);
}

:root.darktheme {
  --bg_color: var(--light_color_0);
}

在我的 angular 个组件中,我有:

.panel_popup {
  background-color: var(--bg_color);
}

剩下的就是通过单击按钮添加 class。 希望对某人有所帮助