【问题标题】:Angular Material Switch A Color When Switching ThemeAngular Material 切换主题时切换颜色
【发布时间】:2026-01-22 06:00:01
【问题描述】:

我已经实现了 Angular Material Dark and Light 主题。有了这个,我可以根据主题更改颜色,例如使用mat-color($primary)。这很好用,但现在我需要完全使用不同的颜色。因此,我希望能够在深色主题 mat-color($primary, 800) 中使用色调为 800 的原色,而不是使用浅色主题中色调为 200 的原色:mat-color($primary, 200)

数据表主题.scss

@mixin data-table-color($color-config) {
  $primary: map-get($color-config, primary);

  .data-table {
    background-color: mat-color($primary, 200);
  }

}

data-table.html

<div class="page-container mat-app-background"
     [ngClass]="(isDarkTheme$ | async) ? 'theme-dark' : 'theme-default'">

  <div class="data-table"></div>

</div>

我尝试在自定义组件样式中添加theme-dark 选择器,但没有奏效。

@mixin data-table-color($color-config) {
  $primary: map-get($color-config, primary);

  .theme-default .data-table {
    background-color: mat-color($primary, 200);
  }

  .theme-dark .data-table {
    background-color: mat-color($primary, 800);
  }

}

我期待听到您的解决方案。

编辑

我尝试的解决方案不起作用,因为 angular material 在编译时生成 css。所以它会创建:

.theme-default .data-table {
  background-color: #c5cae9;
}

.theme-dark .data-table {
  background-color: #1a237e;
}

.theme-dark .theme-dark .data-table {
  background-color: #ff6f00;
}

.theme-dark .theme-default .data-table {
  background-color: #ffecb3;
}

这会导致它改变色调,但使用的颜色是浅色原色。

我已经将一个测试项目上传到 Stackblitz,不幸的是它没有编译一些角度材料依赖项。但如果你在本地运行它,你就会明白我的意思。

https://stackblitz.com/github/kdrpt/angular-test-project

【问题讨论】:

    标签: css angular sass angular-material


    【解决方案1】:

    您是否在 scss 文件中为您的 mixin 添加了 include 语句?

    @include data-table-color($color-config);
    

    只需在您的 scss 文件中添加上述语句(您已在其中定义了 @mixin 数据表颜色)并传递您创建的 $color-config。它对我来说很好用。

    【讨论】:

    • 感谢您的回答。当您说“它对我来说很好”时,您指的是代码的哪一部分。正如问题中所述,因为前 2 个 sn-ps 确实有效。但他们所做的只是将颜色从浅色原色 (200) 翻转为深色原色 (200)。我正在尝试做的是当暗模式处于活动状态时使用,例如原色 (800) 甚至是次要颜色而不是原色。
    • 与前两个 sn-ps 一起,您尝试的第三个 sn-p 是正确的并且为我工作。当您在第三个 sn-p 中选择暗模式时,它不会更改为暗主 (200),而是更改为主 (800)。您是否检查了您的 [ngClass] 是否按预期工作?
    • 我已经编辑了我的问题,并提供了有关您的反馈的更多信息。
    【解决方案2】:

    查看您的 stackblitz 示例,您似乎忘记在根 styles.scss 中导入您的 app.theme.scss

    @import 'theme/app-theme.scss';
    

    【讨论】: