避免 Angular Material 主题中的重复样式
Avoid duplicate styles in Angular Material theme
我有一个 styles.theme.scss
如下所示。
@media (prefers-color-scheme: dark) {
@include example-theme($dark-theme);
}
@media (prefers-color-scheme: light) {
@include example-theme($light-theme);
}
[data-theme="dark-theme"] {
@include example-theme($dark-theme);
}
[data-theme="light-theme"] {
@include example-theme($light-theme);
}
如果用户代理配置了 prefers-color-scheme
,目标是使用它,但如果用户已在网站上配置它,则覆盖它。
然而,当前的 SCSS 会导致以下警告:
WARNING: The same color styles are generated multiple times. Read more about how style duplication can be avoided in a dedicated guide. https://github.com/angular/components/blob/master/guides/duplicate-theming-styles.md
node_modules/@angular/material/_theming.scss 1648:7 -mat-check-duplicate-theme-styles()
node_modules/@angular/material/_theming.scss 7010:3 angular-material-theme()
stdin 29:3 example-theme()
stdin 57:3 root stylesheet
我已经检查了提供的文档,但它似乎没有涵盖这种情况,而且我不确定如何更好地构建它以避免重复样式。
我认为唯一可行的解决方案是使用 JavaScript 检测首选项,如果应用程序中未配置主题,则设置 data-theme
属性。
还有比这更好的解决方案吗?
我尝试过的:
- 看看我是否可以像
[data-theme="dark-theme"], @media (prefers-color-scheme: dark)
那样将媒体查询和选择器串在一起,我认为这是不可能的。
- 如果我可以使用 SASS
@if
和 @else
来检查 data-theme
选择器是否匹配任何元素,否则包括 @media
查询。
我今天也发现自己在为同样的问题而战。
您的样式问题是您有两个主题 light 和 dark 以及 in
@include angular-material-theme('Your-Theme');
您必须提供一个主题(浅色或深色)。
所以您应该只覆盖其中一个主题,因为其他主题已经包含在内
因此,如果您提供了 light media query,则覆盖 media query dark ,反之亦然。
这是我的代码示例
@import "~@angular/material/theming";
@include mat-core();
$kyc-web-primary: mat-palette($mat-pink);
$kyc-web-accent: mat-palette($mat-pink, A200, A100, A400);
$kyc-web-warn: mat-palette($mat-red);
$kyc-web-theme-light: mat-light-theme(
(
color: (
primary: $kyc-web-primary,
accent: $kyc-web-accent,
warn: $kyc-web-warn,
),
)
);
$kyc-web-theme-dark: mat-dark-theme(
(
color: (
primary: $kyc-web-primary,
accent: $kyc-web-accent,
warn: $kyc-web-warn,
),
)
);
@include angular-material-theme($kyc-web-theme-dark);
@media (prefers-color-scheme: light) {
@include angular-material-color($kyc-web-theme-light);
}
mat.$theme-ignore-duplication-warnings: true;
您应该包括 mat.all-component-colors
而不是 mat.all-component-themes
例子:下面是错误的
// Generates styles for all systems configured in the theme. In this case, color styles
// and default density styles are generated. Density is in themes by default.
@include mat.all-component-themes($light-theme);
.dark-theme {
// Generates styles for all systems configured in the theme. In this case, color styles
// and the default density styles are generated. **Note** that this is a problem because it
// means that density styles are generated *again*, even though only the color should change.
@include mat.all-component-themes($dark-theme);
}
改用这个:
@use '@angular/material' as mat;
...
@include mat.all-component-themes($light-theme);
.dark-theme {
// This mixin only generates the color styles now.
@include mat.all-component-colors($dark-theme);
}
更多信息,Official Docs
我有一个 styles.theme.scss
如下所示。
@media (prefers-color-scheme: dark) {
@include example-theme($dark-theme);
}
@media (prefers-color-scheme: light) {
@include example-theme($light-theme);
}
[data-theme="dark-theme"] {
@include example-theme($dark-theme);
}
[data-theme="light-theme"] {
@include example-theme($light-theme);
}
如果用户代理配置了 prefers-color-scheme
,目标是使用它,但如果用户已在网站上配置它,则覆盖它。
然而,当前的 SCSS 会导致以下警告:
WARNING: The same color styles are generated multiple times. Read more about how style duplication can be avoided in a dedicated guide. https://github.com/angular/components/blob/master/guides/duplicate-theming-styles.md
node_modules/@angular/material/_theming.scss 1648:7 -mat-check-duplicate-theme-styles()
node_modules/@angular/material/_theming.scss 7010:3 angular-material-theme()
stdin 29:3 example-theme()
stdin 57:3 root stylesheet
我已经检查了提供的文档,但它似乎没有涵盖这种情况,而且我不确定如何更好地构建它以避免重复样式。
我认为唯一可行的解决方案是使用 JavaScript 检测首选项,如果应用程序中未配置主题,则设置 data-theme
属性。
还有比这更好的解决方案吗?
我尝试过的:
- 看看我是否可以像
[data-theme="dark-theme"], @media (prefers-color-scheme: dark)
那样将媒体查询和选择器串在一起,我认为这是不可能的。 - 如果我可以使用 SASS
@if
和@else
来检查data-theme
选择器是否匹配任何元素,否则包括@media
查询。
我今天也发现自己在为同样的问题而战。 您的样式问题是您有两个主题 light 和 dark 以及 in
@include angular-material-theme('Your-Theme');
您必须提供一个主题(浅色或深色)。
所以您应该只覆盖其中一个主题,因为其他主题已经包含在内 因此,如果您提供了 light media query,则覆盖 media query dark ,反之亦然。
这是我的代码示例
@import "~@angular/material/theming";
@include mat-core();
$kyc-web-primary: mat-palette($mat-pink);
$kyc-web-accent: mat-palette($mat-pink, A200, A100, A400);
$kyc-web-warn: mat-palette($mat-red);
$kyc-web-theme-light: mat-light-theme(
(
color: (
primary: $kyc-web-primary,
accent: $kyc-web-accent,
warn: $kyc-web-warn,
),
)
);
$kyc-web-theme-dark: mat-dark-theme(
(
color: (
primary: $kyc-web-primary,
accent: $kyc-web-accent,
warn: $kyc-web-warn,
),
)
);
@include angular-material-theme($kyc-web-theme-dark);
@media (prefers-color-scheme: light) {
@include angular-material-color($kyc-web-theme-light);
}
mat.$theme-ignore-duplication-warnings: true;
您应该包括 mat.all-component-colors
而不是 mat.all-component-themes
例子:下面是错误的
// Generates styles for all systems configured in the theme. In this case, color styles
// and default density styles are generated. Density is in themes by default.
@include mat.all-component-themes($light-theme);
.dark-theme {
// Generates styles for all systems configured in the theme. In this case, color styles
// and the default density styles are generated. **Note** that this is a problem because it
// means that density styles are generated *again*, even though only the color should change.
@include mat.all-component-themes($dark-theme);
}
改用这个:
@use '@angular/material' as mat;
...
@include mat.all-component-themes($light-theme);
.dark-theme {
// This mixin only generates the color styles now.
@include mat.all-component-colors($dark-theme);
}
更多信息,Official Docs