【问题标题】:How to get primary or accent color of currently applied theme in angular material 2如何在角度材料 2 中获取当前应用主题的原色或强调色
【发布时间】:2017-12-18 17:46:56
【问题描述】:

我正在使用 Angular Material Design 2 构建一个具有多个主题的应用程序。我创建了多个主题,并且效果非常好。 使用本指南:Angular Material design theme

但问题是,例如,如果用户选择“绿色主题”。然后我想用绿色显示他/她的名字等等。但是在这种情况下,如何在我的组件样式中获取当前选择的主题“绿色”,然后在我的用户名类中使用该主变量来更改其颜色

【问题讨论】:

  • 是的,我已经看到了。但它对我不起作用,或者我没有正确理解它。这就是我来这里的原因
  • 你能展示你已经尝试过的东西吗?
  • 我尝试添加不同的主题让我们说在这种情况下.. Indigo and green 它在所有材料设计特定的东西上都很好用。像按钮、切换、卡片等。但我想根据我的应用当前主题更改<h1> 文本。比如如果用户选择了绿色主题,那么 h1 文本颜色应该变成绿色等等..

标签: angular angular-material2


【解决方案1】:

我不确定这是否是“正确”的方法,但它有效,所以我现在正在使用它。如果有更好的方法,我会适应。我的目标是能够根据当前应用的 Material 主题为非 Material 元素(例如标准 DIV、SPAN 等)设置不同颜色的样式。它需要 Material 2 和 Angular 2 元素的组合才能使其全部工作。

这是我所做的: 我的自定义主题文件如下所示:

@import '~@angular/material/_theming.scss';

@include mat-core();

// default theme:
$primary: mat-palette($mat-blue,800);
$accent: mat-palette($mat-teal);
$theme: mat-light-theme($primary, $accent);

@include angular-material-theme($theme);

// "dark" theme
$dark-p: mat-palette($mat-blue-grey, 500);
$dark-a: mat-palette($mat-blue-grey,900);
$dark-t: mat-dark-theme($dark-p, $dark-a);

.darkTheme {
  @include angular-material-theme($dark-t);
}

我的应用程序 scss 文件中的一个 sn-p:

@import '../../themes/main-theme';  //  <-- the theme file shown above

//default palette forground/background:
$light-foreground-palette: map-get($theme, foreground);
$light-background-palette: map-get($theme, background);

//dark palette forground/background:
$dark-foreground-palette: map-get($dark-t, foreground);
$dark-background-palette: map-get($dark-t, background);

.light-colors{
    background-color : mat-color($primary, default);
    color: mat-color($light-foreground-palette, text);
}
.dark-colors{
    background-color : mat-color($dark-p, default);
    color: mat-color($dark-foreground-palette, text);
}

在我的“主题”服务中(尽管您可以在任何服务中执行此操作,只要它在全球范围内可用,或者至少在您需要的任何地方都可用),我定义了一个简单的布尔变量isDarkTheme。我使用它来根据用户是否选择了“深色”主题来控制显示。

然后,无论我需要什么,我都使用 ngClass 动态应用类,具体取决于全局 isDarkTheme 变量的值:

<div [ngClass]="{'light-colors' : !svc.isDarkTheme,'dark-colors' : svc.isDarkTheme}">
...my content...
</div>

我有一个 div 包装我的整个应用程序,使用相同的 ngClass 方法来应用 darkTheme 类或不应用 isDarkTheme 变量的值。这可以一次性处理我整个应用程序中的所有材质感知元素,我只需在需要的特定非材质元素上使用light-colorsdark-colors。我可能可以将这些结合起来,但现在我将保持原样。

为了完整起见,以下是您可以从不同调色板中获得的元素列表: 从“主要”调色板(我上面的代码中的$primary$dark-p):

  • 默认
  • 打火机
  • 较暗

您还可以为$accent$warn 调色板获取这三个相同的颜色值。

来自“前景”调色板(我上面的代码中的$light-foreground-palette$dark-foreground-palette):

  • 基础
  • 分频器
  • 分频器
  • 已禁用
  • 禁用按钮
  • 禁用文本
  • 提示文本
  • 辅助文本
  • 图标
  • 图标
  • 文字
  • 滑块关闭
  • 滑块关闭活动

来自“背景”调色板(我上面的代码中的$light-background-palette$dark-background-palette):

  • 状态栏
  • 应用栏
  • 背景
  • 悬停
  • 卡片
  • 对话框
  • 禁用按钮
  • 凸起按钮
  • 焦点按钮
  • 选中按钮
  • 选定的禁用按钮
  • 禁用按钮切换

以下是我用来汇总的来源:

我承认自己只了解这里发生的大约 80% 的情况,所以如果有更好的方法,请告诉我...

【讨论】:

  • 我还必须在组件 scss 文件中导入 @import '~@angular/material/theming';
【解决方案2】:

我知道这对聚会来说太晚了,但在终于找到了一个干净的方法之后不想拉一个 DenverCoder9。

首先,转到 angular material2 github 上的 this link 并找出您的主题使用的调色板。 (该链接指向版本 6,因此请确保将标签更改为您使用的任何版本。)

然后在您的项目中的某处创建一个variables.scss 文件来存储您的主题的调色板引用(下面的示例使用靛蓝粉色主题的调色板):

/* variables.scss */
@import "~@angular/material/theming";

$primaryPalette: mat-palette($mat-indigo);
$accentPalette:  mat-palette($mat-pink, A200, A100, A400);

// the default warn palette is red, so use that if the theme doesn't define one
$warnPalette:    mat-palette($mat-red);

然后您可以将variables.scss 文件包含到您的样式表中,并使用mat-color(&lt;palette&gt;) 为您的类获取颜色。

/* my-component.scss */
@import "~@angular/material/theming";
@import 'variables.scss';

.my-primary-text {
    color: mat-color($primaryPalette);
}

.my-accent-text {
    color: mat-color($accentPalette);
}

使用此方法,您仍然可以使用预构建的主题。使用他们发布的文档重新创建主题可能会更干净,但现在我对此很满意。

希望这可以为下一个人节省很多痛苦和痛苦。

更新:重新定义默认主题以防止 OhGodTheyChangedColorsThisRelease

谁知道角材质何时会改变它们的主题颜色,所以重新创建默认它们可能是个好主意。

因此,在帖子的前一部分的基础上,添加 mat-light-theme/mat-dark-theme 混合以重新定义新主题。

/* variables.scss */
@import "~@angular/material/theming";

$primaryPalette: mat-palette($mat-indigo);
$accentPalette:  mat-palette($mat-pink, A200, A100, A400);

// the default warn palette is red, so use that if the theme doesn't define one
$warnPalette:    mat-palette($mat-red);

// re-define the indigo-pink theme
$defaultTheme: mat-light-theme($primaryPalette, $accentPalette, $warnPalette);

然后在您的主根目录styles.scss 中为您的应用程序,

/* styles.scss */
@import '~@angular/material/theming';
@import './scss/variables.scss';

@include angular-material-theme($defaultTheme);

确保将&lt;link href=&gt; 放入默认样式表的index.html

太棒了!现在,如果您更新 Angular 材质并且它们改变了颜色,那您很好!您可以通过使用 variables.scss 中的调色板来更新整个应用程序的颜色。

【讨论】:

  • 如果您想在多个地方使用调色板中的相同颜色(例如原色)并希望利用 css 自定义属性(变量),请不要忘记使用 sass 插值语法:--primary-color: #{mat-color($primaryPalette)};
  • 在这种情况下,由于包含样式,输出包的大小太大。如何处理?
  • 经过数小时尝试弄清楚如何使用现有的主题颜色。这对我有帮助。谢谢你的朋友。
【解决方案3】:

您可以在 HTML 元素上使用 class="mat-primary"class="mat-accent" 来获取主题的主色和强调色。

【讨论】:

  • 它在诸如按钮等材料设计元素中工作。它是 [color] attr 的一种替代。但它不适用于任何 html 元素 &lt;h3 class="mat-primary"&gt;Lorem ipsum dolor sit amet.&lt;/h3&gt; 它不会改变 &lt;h3&gt; 颜色。有没有一种方法可以让我在我的 css 中简单地获取颜色并为其设置样式,例如.. h3{ color : @mat-primary; } 像这样
  • 我也在寻找这个问题的答案。我想将我页面上选定的标签颜色设置为当前主题的原色。更少的代码。所以当用户更改主题时。我不需要做任何事情
【解决方案4】:

我创建了一个简单的 mixin 来解决这个问题。

$theme: mat-light-theme((color:(primary: $primary,accent: $accent,warn: $warn)));  
$pv-theme: mat-light-theme((color:(primary: $pv-primary,accent: $pv-accent,warn: $pv-warn)));  
$avg-theme: mat-light-theme((color:(primary: $avg-primary,accent: $avg-accent,warn: $avg-warn)));  

@include angular-material-theme($theme);

.avg {
  @include angular-material-color($avg-theme);
}

.pv {
  @include angular-material-color($pv-theme);
}

  • 创建一个mixin:
@mixin theme($property: null, $key: null) {
  & {
    #{$property}: mat-color(map_get($theme, $key));
  }

  .avg & {
    #{$property}: mat-color(map_get($avg-theme, $key));
  }

  .pv & {
    #{$property}: mat-color(map_get($pv-theme, $key));
  }
}

  • 像这样使用它:
footer .container {
  @include theme(background-color, primary);
}

【讨论】:

  • 我还要补充一点,要使其在具有样式封装的组件中工作,您应该在 .#{$your-theme-class} &amp; 旁边添加 :host-context(.#{$your-theme-class}) &amp;
  • 这对 Angular 12 的重大变化有何影响?我试图实现它,但它不再起作用了。
【解决方案5】:

为了从当前应用的主题中获取任何颜色,例如primary 试试这个,$theme 是你的主题变量名

$primary: map-get($theme, primary);

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多