如何在angular2 + Less中即时切换css主题?

时间:2018-02-19 18:46:54

标签: angular scope less themes

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

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

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

全局vars.less:

@color_0:  #283238; 

一些-component.less:

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

我想在global-vars.less中添加一个图层来按父类切换颜色:

全局vars.less:

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

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

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

一些-component.less:

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

当然,它无法正常工作,因为LESS预先编译了所有内容。但我找不到一种工作方法。 我尝试从标题中更改CSS文件,但因为angular使用封装的样式表作为标记插入,这对我没有帮助。 我尝试使用mixins,但我不能根据父类创建一个mixin,所以没有运气。

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

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

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

但由于项目规模巨大,这将是一场噩梦

非常感谢任何帮助。 感谢。

1 个答案:

答案 0 :(得分:0)

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

我创建了一个导入main.css的themes.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);
}

从我的角度组件中我有:

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

剩下的就是通过单击按钮添加一个类。 希望它可以帮助某人