无法用我的 css 属性覆盖 angular material 主题
Can't override the angular material theme with my css properties
我正在使用 Angular 6.0.8
和 Angular Material theme
版本 6.4.0
每当我尝试稍微修改 material 主题时,它永远不会奏效,因为我总是发现 material 主题属性会覆盖我的 CSS 属性,如下所示:
currentColor .mat-input-element (material theme)
initial input, textarea, select, button (user agent stylesheet)
#1072BA .English
#1072BA .English
#1072BA body
仅应用第一个 属性(其余的被划线)
我尝试了多种变体来解决这个问题,但 none 奏效了(比如使用 important 或更改导入主题的顺序)
那么更改 material 主题和用户样式表中的小东西的正确方法是什么? (例如应用此英语规则)
我的 styles.scss 如下,只有覆盖 Material 主题的效果很好,比如颜色和字体不起作用:
@import '~@angular/material/prebuilt-themes/indigo-pink.css';
/* You can add global styles to this file, and also import other style files */
/* prevent clicking in the wizard nav header */
.mat-horizontal-stepper-header{
pointer-events: none !important;
}
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(./assets/material_icons/material_icons.woff2) format('woff2');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
-webkit-font-smoothing: antialiased;
}
.mat-radio-button{
margin: 10px;
}
.mat-checkbox{
margin-bottom: 10px;
}
.Done-numbers{
color: red;
font-weight: bold;
}
.finInfo-hint{
color: gray;
}
.finInfo-success{
color: green;
}
.Arabic {
font-family: "AXtManal" !important;
margin: 0;
/* background: #fff; */
font: normal 16px/20px Verdana;
color: #1072BA;
text-shadow: 0 0 0 #1072BA;
}
.English {
font-family: "Rotis" !important;
margin: 0;
/* background: #fff; */
font: normal 16px/20px Verdana;
color: #1072BA;
text-shadow: 0 0 0 #0078be;
}
更新 1:
请查看this stackblitz example,里面的问题很清楚
1- 我期望用 阿拉伯语 class 封闭的 div 会改变 字体和颜色 所包含的 material 表单字段,但它没有(与 Sushi 的第一个字段一样,字体未更改)
这非常重要,因为所有元素都包含在 div 中,ngClass 具有英语或阿拉伯语,我想将 class 应用于所有包含的元素,包括 material 表单字段
2-如何将所有表单标签的颜色从蓝色更改为红色或绿色?
通常,当我使用 Material 样式库时,它们的样式具有非常高的特异性。如果您检查浏览器中的元素,您将看到应用样式的顺序。像这里一样,你会看到一些属性正在被覆盖,因为上面指定了更多的属性。
查看您的样式是否在优先队列中排得太靠后。如果它们根本不存在,则导入有问题。
请查看此 minimal example(我必须调整字体系列才能使此示例正常工作)。
您正在覆盖您的一些字体样式定义。像下面调整后的 .Arabic
定义一样分别定义字体系列、-size 和 -weight:
.Arabic {
font-family: 'Shadows Into Light', cursive;
margin: 0;
/* background: #fff; */
font-size: 16px/20px;
font-weight: normal;
color: red;
text-shadow: 0 0 0 #1072BA;
}
或者使用 shorthand 声明设置字体属性,就像在这个修改过的例子中一样:
.English{
margin: 0;
/* background: #fff; */
font: normal 16px/20px 'Pacifico', cursive;
color: green;
text-shadow: 0 0 0 #0078be;
}
编辑
回答您的评论/编辑的问题:
I find the font in the computed values but it is striked through and
not applied, it is only applied if I apply the class specifically on
the mat-form field
如果要更改 .mat-form-field
,则必须在 class 上明确应用 class,因为在 prebuilt-themes/indigo-pink.css 中,它被明确定义为
.mat-form-field{
font-size:inherit;
font-weight:400;
line-height:1.125;
font-family:Roboto, "Helvetica Neue",sans-serif
}
标签颜色相同。
对于 CSS,您始终必须至少与现有样式定义一样具体。
你可以这样做:
.Arabic .mat-form-field,.mat-form-field-appearance-legacy .mat-form-field-label,
.mat-input-element,.mat-form-field.mat-focused .mat-form-field-label{
font-family: 'Shadows Into Light', cursive;
margin: 0;
/* background: #fff; */
font-size: 16px/20px;
font-weight: normal;
color: red;
text-shadow: 0 0 0 #1072BA;
}
.Arabic .mat-form-field.mat-focused .mat-form-field-ripple{
background-color: red
}
但我认为这不是很好。更好的解决方案是创建两个 custom theme,每种语言一个,并在那里设置颜色和字体。这样您的颜色和字体定义将自动应用于嵌套元素。
This guide 是一本关于自定义主题的好书。
编辑 2:angular material 主题
正如我之前编辑中提到的,创建自定义主题可能是解决您问题的更好方法。 angular material 中的自定义主题非常强大,但是您需要先进行一些设置。之后只需几行即可调整颜色、字体等。
我创建了一个 new stackblitz,您可以在其中看到默认和两个自定义主题的设置以及 material-form-field 的颜色和字体的调整。我对每个部分都进行了评论,但我也会在这里简要解释一下:
你的 styles.scss
的一般结构应该是:
- 导入所需的 angular material mixins
- 定义字体
- defining/importing 自定义组件主题
- 定义默认主题
- 定义所有其他自定义主题
导入后 @import '~@angular/material/theming';
您可以开始调整字体(如果您愿意)。为此,您只需要定义一个新的 mat-typography-config
例如:
$arabic-typography: mat-typography-config(
$font-family: '"Shadows Into Light", cursive'
);
$english-typography: mat-typography-config(
$font-family: '"Pacifico", cursive'
);
要应用那些你需要的字体配置,然后将它们应用到 mat-core
-mixin 中,后者负责其余的工作:@include mat-core($english-typography);
。现在,如果您只想将字体配置应用于特定的自定义主题,则必须在主题定义中添加字体配置。
主题由以下结构定义:使用 mat-light-theme-mixin 定义您想要的主色和主题。要应用主题,请使用 @include angular-material-theme(<theme name>);
$app-primary: mat-palette($mat-indigo);
$app-accent: mat-palette($mat-amber, A200, A100, A400);
$app-warn: mat-palette($mat-red);
$app-theme: mat-light-theme($app-primary, $app-accent, $app-warn);
@include angular-material-theme($app-theme);
要实现多主题设置,您可以将主题定义包含在 CSS-class 名称中,如下所示:
.Arabic {
$arabic-primary: mat-palette($mat-orange);
$arabic-accent: mat-palette($mat-blue, A200, A100, A400);
$arabic-warn: mat-palette($mat-red);
$arabic-theme: mat-light-theme($arabic-primary, $arabic-accent, $arabic-warn);
@include mat-core($arabic-typography);
@include angular-material-theme($arabic-theme);
}
现在,仅当您的 html 元素是具有 .Arabic
class 的元素的后代时,才会应用 .Arabic
主题。此外,我添加了 @include mat-core($arabic-typography);
,它告诉主题引擎仅将 $arabic-typography
应用于 $arabic-theme
。
完成样式的最后一步是定义一个自定义组件主题,它根据需要对 mat-form-fields 进行样式设置。现在这是几行的问题:
@mixin my-custom-component($theme) {
// retrieve variables from current theme
$primary: map-get($theme, primary);
// style element
mat-form-field, .mat-form-field-appearance-legacy .mat-form-field-label {
color: mat-color($primary);
}
}
然后通过向每个主题定义添加 @include custom-components-theme(<theme name>);
行,将此自定义组件主题添加到您的自定义主题中。 (custom-components-theme 是一个小辅助函数。在 stackblitz 中阅读更多相关信息)。
就是这样。如果您需要调整更多组件,只需为该组件创建一个自定义主题并将其添加到 custom-components-theme mixin。
如果您要覆盖 Angular Material 样式,可以使用 deep
它前面的参数是这样的:
::ng-deep .mat-step-header .mat-step-icon {
background-color: #f6871f;
}
我正在使用 Angular 6.0.8
和 Angular Material theme
版本 6.4.0
每当我尝试稍微修改 material 主题时,它永远不会奏效,因为我总是发现 material 主题属性会覆盖我的 CSS 属性,如下所示:
currentColor .mat-input-element (material theme)
initial input, textarea, select, button (user agent stylesheet)
#1072BA .English
#1072BA .English
#1072BA body
仅应用第一个 属性(其余的被划线)
我尝试了多种变体来解决这个问题,但 none 奏效了(比如使用 important 或更改导入主题的顺序)
那么更改 material 主题和用户样式表中的小东西的正确方法是什么? (例如应用此英语规则)
我的 styles.scss 如下,只有覆盖 Material 主题的效果很好,比如颜色和字体不起作用:
@import '~@angular/material/prebuilt-themes/indigo-pink.css';
/* You can add global styles to this file, and also import other style files */
/* prevent clicking in the wizard nav header */
.mat-horizontal-stepper-header{
pointer-events: none !important;
}
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(./assets/material_icons/material_icons.woff2) format('woff2');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
-webkit-font-smoothing: antialiased;
}
.mat-radio-button{
margin: 10px;
}
.mat-checkbox{
margin-bottom: 10px;
}
.Done-numbers{
color: red;
font-weight: bold;
}
.finInfo-hint{
color: gray;
}
.finInfo-success{
color: green;
}
.Arabic {
font-family: "AXtManal" !important;
margin: 0;
/* background: #fff; */
font: normal 16px/20px Verdana;
color: #1072BA;
text-shadow: 0 0 0 #1072BA;
}
.English {
font-family: "Rotis" !important;
margin: 0;
/* background: #fff; */
font: normal 16px/20px Verdana;
color: #1072BA;
text-shadow: 0 0 0 #0078be;
}
更新 1:
请查看this stackblitz example,里面的问题很清楚
1- 我期望用 阿拉伯语 class 封闭的 div 会改变 字体和颜色 所包含的 material 表单字段,但它没有(与 Sushi 的第一个字段一样,字体未更改)
这非常重要,因为所有元素都包含在 div 中,ngClass 具有英语或阿拉伯语,我想将 class 应用于所有包含的元素,包括 material 表单字段
2-如何将所有表单标签的颜色从蓝色更改为红色或绿色?
通常,当我使用 Material 样式库时,它们的样式具有非常高的特异性。如果您检查浏览器中的元素,您将看到应用样式的顺序。像这里一样,你会看到一些属性正在被覆盖,因为上面指定了更多的属性。
查看您的样式是否在优先队列中排得太靠后。如果它们根本不存在,则导入有问题。
请查看此 minimal example(我必须调整字体系列才能使此示例正常工作)。
您正在覆盖您的一些字体样式定义。像下面调整后的 .Arabic
定义一样分别定义字体系列、-size 和 -weight:
.Arabic {
font-family: 'Shadows Into Light', cursive;
margin: 0;
/* background: #fff; */
font-size: 16px/20px;
font-weight: normal;
color: red;
text-shadow: 0 0 0 #1072BA;
}
或者使用 shorthand 声明设置字体属性,就像在这个修改过的例子中一样:
.English{
margin: 0;
/* background: #fff; */
font: normal 16px/20px 'Pacifico', cursive;
color: green;
text-shadow: 0 0 0 #0078be;
}
编辑
回答您的评论/编辑的问题:
I find the font in the computed values but it is striked through and not applied, it is only applied if I apply the class specifically on the mat-form field
如果要更改 .mat-form-field
,则必须在 class 上明确应用 class,因为在 prebuilt-themes/indigo-pink.css 中,它被明确定义为
.mat-form-field{
font-size:inherit;
font-weight:400;
line-height:1.125;
font-family:Roboto, "Helvetica Neue",sans-serif
}
标签颜色相同。
对于 CSS,您始终必须至少与现有样式定义一样具体。
你可以这样做:
.Arabic .mat-form-field,.mat-form-field-appearance-legacy .mat-form-field-label,
.mat-input-element,.mat-form-field.mat-focused .mat-form-field-label{
font-family: 'Shadows Into Light', cursive;
margin: 0;
/* background: #fff; */
font-size: 16px/20px;
font-weight: normal;
color: red;
text-shadow: 0 0 0 #1072BA;
}
.Arabic .mat-form-field.mat-focused .mat-form-field-ripple{
background-color: red
}
但我认为这不是很好。更好的解决方案是创建两个 custom theme,每种语言一个,并在那里设置颜色和字体。这样您的颜色和字体定义将自动应用于嵌套元素。 This guide 是一本关于自定义主题的好书。
编辑 2:angular material 主题
正如我之前编辑中提到的,创建自定义主题可能是解决您问题的更好方法。 angular material 中的自定义主题非常强大,但是您需要先进行一些设置。之后只需几行即可调整颜色、字体等。
我创建了一个 new stackblitz,您可以在其中看到默认和两个自定义主题的设置以及 material-form-field 的颜色和字体的调整。我对每个部分都进行了评论,但我也会在这里简要解释一下:
你的 styles.scss
的一般结构应该是:
- 导入所需的 angular material mixins
- 定义字体
- defining/importing 自定义组件主题
- 定义默认主题
- 定义所有其他自定义主题
导入后 @import '~@angular/material/theming';
您可以开始调整字体(如果您愿意)。为此,您只需要定义一个新的 mat-typography-config
例如:
$arabic-typography: mat-typography-config(
$font-family: '"Shadows Into Light", cursive'
);
$english-typography: mat-typography-config(
$font-family: '"Pacifico", cursive'
);
要应用那些你需要的字体配置,然后将它们应用到 mat-core
-mixin 中,后者负责其余的工作:@include mat-core($english-typography);
。现在,如果您只想将字体配置应用于特定的自定义主题,则必须在主题定义中添加字体配置。
主题由以下结构定义:使用 mat-light-theme-mixin 定义您想要的主色和主题。要应用主题,请使用 @include angular-material-theme(<theme name>);
$app-primary: mat-palette($mat-indigo);
$app-accent: mat-palette($mat-amber, A200, A100, A400);
$app-warn: mat-palette($mat-red);
$app-theme: mat-light-theme($app-primary, $app-accent, $app-warn);
@include angular-material-theme($app-theme);
要实现多主题设置,您可以将主题定义包含在 CSS-class 名称中,如下所示:
.Arabic {
$arabic-primary: mat-palette($mat-orange);
$arabic-accent: mat-palette($mat-blue, A200, A100, A400);
$arabic-warn: mat-palette($mat-red);
$arabic-theme: mat-light-theme($arabic-primary, $arabic-accent, $arabic-warn);
@include mat-core($arabic-typography);
@include angular-material-theme($arabic-theme);
}
现在,仅当您的 html 元素是具有 .Arabic
class 的元素的后代时,才会应用 .Arabic
主题。此外,我添加了 @include mat-core($arabic-typography);
,它告诉主题引擎仅将 $arabic-typography
应用于 $arabic-theme
。
完成样式的最后一步是定义一个自定义组件主题,它根据需要对 mat-form-fields 进行样式设置。现在这是几行的问题:
@mixin my-custom-component($theme) {
// retrieve variables from current theme
$primary: map-get($theme, primary);
// style element
mat-form-field, .mat-form-field-appearance-legacy .mat-form-field-label {
color: mat-color($primary);
}
}
然后通过向每个主题定义添加 @include custom-components-theme(<theme name>);
行,将此自定义组件主题添加到您的自定义主题中。 (custom-components-theme 是一个小辅助函数。在 stackblitz 中阅读更多相关信息)。
就是这样。如果您需要调整更多组件,只需为该组件创建一个自定义主题并将其添加到 custom-components-theme mixin。
如果您要覆盖 Angular Material 样式,可以使用 deep
它前面的参数是这样的:
::ng-deep .mat-step-header .mat-step-icon {
background-color: #f6871f;
}