角材质覆盖 SnackBar 组件的默认样式

Posted

技术标签:

【中文标题】角材质覆盖 SnackBar 组件的默认样式【英文标题】:Angular Material Overriding Default Style of SnackBar Component 【发布时间】:2018-05-25 14:49:43 【问题描述】:

我正在尝试覆盖 Angular Material 中 snackbar 组件的默认最大宽度。

Angular Material应用的CSS如下图:

.mat-snack-bar-container 
    border-radius: 2px;
    box-sizing: border-box;
    display: block;
    margin: 24px;
    max-width: 568px;
    min-width: 288px;
    padding: 14px 24px;
    transform: translateY(100%) translateY(24px);

我曾尝试在我的 style.css 文件中使用相同的样式进行覆盖,但此样式已被默认样式覆盖。

 .mat-snack-bar-container 
   max-width: 800px;
 

我找到了similar question 的答案,但我知道该问题的答案现在已弃用(/deep/ 已弃用)。

对此有最佳实践解决方案吗?

【问题讨论】:

.mat-snack-bar-container max-width: 800px!important; 我已经尝试避免使用 !important 标签,因为它们也可能被认为是不好的做法 在这种情况下,您需要在使用零食的地方添加组件名称 your-component-tag .mat-snack-bar-container max-width: 800px; Override Angular Material style in Angular component的可能重复 我个人会使用 ng-deep。特别是如果有人要使用我的组件。 ViewEncapsulation.None 本质上是用样式更新您的 styles.css 文件,实际上可能会导致更多混淆样式的来源。我考虑ViewEnapsulation.None 的唯一用途是在初始化特定组件时在整个页面上动态加载一些样式。 Angular 使用的示例假设您的项目中没有 styles.css,如果您使用的是 CLI,那么您有。 【参考方案1】:

我记得在一个项目中与网页设计师一起工作,他们有一个钱罐,如果开发人员使用 !important 声明,他们必须投入硬币。 ;)

其他解决方案对我不起作用,除非我设置 .cdk-overlay-pane(使用材料 11):

.cdk-overlay-pane 
    width: 100%;


.mat-snack-bar-container 
    max-width: 100%;
    width: 100%;

【讨论】:

【参考方案2】:

使用vw 对我有用,无论是大屏幕还是小屏幕

    .mat-snack-bar-container 
    margin-right: auto !important;
    margin-left: auto !important;
    width: 80vw !important;
    max-width: 100vw !important;

【讨论】:

【参考方案3】:

将 css 放入您的 styles.scssstyles.css

.snackbar 
    max-width: 90% !important;
    margin-left: auto !important; // center align from left
    margin-right: auto !important; // center align from right
    margin-bottom: 1rem !important; 
    padding: 10px !important; // spacing between the text and boundary
    background-color: green;
    color: white;

    .mat-button-wrapper 
        color: black !important; // action text color
    

注意:请确保您为每种样式设置了!important,没有它,样式将无法正常工作。

component.ts

this.snackbar.open(this.resMsg.message, 'OK', 
    panelClass: 'snackbar'
)

【讨论】:

【参考方案4】:

Angular 10 并且没有特殊技巧:

    在打开snackbar时使用panelClass,例如:
this.snackBar.open("VeryLongTextWithoutThePossibilityOfBreakingAutomatically", "X", 
    duration: 0,
    panelClass: 'notif-error'
);

duration: 0 仅用于调试。

    将此写入您的 style.css
.notif-error 
    background-color: red;

.mat-snack-bar-container.notif-error 
    max-width: 100%;

现在由于 css-specificity,这将是最具体的规则。

请注意,.mat-snack-bar-container 和 .notif-error 之间不应有空格。 此规则将适用于同时具有 .mat-snack-bar-container 和 .notif-error 类的元素。 当您的 .notif-error 类为空时,这也有效。

【讨论】:

【参考方案5】:

要走的路。


encapsulation: ViewEncapsulation.None

这里有一个stackblick 来演示

【讨论】:

【参考方案6】:

截至 2019 年 6 月 30 日,使用 Angular Material 8.0.1 和 Angular 8.0.3,以下 SCSS 和 typescript 似乎可以覆盖 Angular Material 快餐栏中操作按钮的颜色*不使用 !重要*

styles.scss(不是很长的持续时间,这让我可以在它消失之前检查样式):

$snackBarTextColor: white;
$snackBarBackgroundNormal: #087a51;
$snackBarActionColor: lightgray;
.snackBarInfo 
    background-color: $snackBarBackgroundNormal;
    color: $snackBarTextColor;



.mat-simple-snackbar > span 
    font-weight: bold;

.mat-simple-snackbar-action 
    .mat-button 
        .mat-button-wrapper 
            color: $snackBarActionColor;
        
    

app.module.ts:

import  MAT_SNACK_BAR_DEFAULT_OPTIONS  from '@angular/material/snack-bar';
providers: [
        
            provide: MAT_SNACK_BAR_DEFAULT_OPTIONS,
            useValue: 
                duration: 41000,
                horizontalPosition: 'center',
                verticalPosition: 'bottom',
                panelClass: 'snackBarInfo'
            
        
    ]

【讨论】:

你也可以使用持续时间 0,它会保持打开状态。我也认为不通过持续时间是一样的。【参考方案7】:

已针对 @angular/material v7.0.x 验证:

CSS !important 修饰符 可以解决问题。

这是 src/styles.scss(应用的全局 css):

.mat-snack-bar-container 
  max-width: 100% !important;

我们还调整了它的字体:

/* Overrides SnackBar CSS in Material Design's .mat-simple-snackbar class */
/* Original sizes: font: 24px, height: 47.952px */ 
.mat-simple-snackbar 
  display: flex; 
  font-size: 28px !important; // 28px  is double, 42px for triple
  min-height: 70px !important; // 70px for double, 90px for triple
  align-items: center !important;
  justify-content: center !important;

【讨论】:

【参考方案8】:

要正确执行此操作,您需要在组件上将 View Encapsulation 设置为 None:

@Component(
    templateUrl: './my.component.html' ,
    styleUrls: ['./my.component.css'], 
    encapsulation: ViewEncapsulation.None,
)

然后在你的组件 css 中你可以这样做:

.mat-snack-bar-container 
   max-width: 800px;

来自官方文档:

View Encapsulation = None 表示 Angular 没有视图 封装。 Angular 将 CSS 添加到全局样式中。范围界定 前面讨论的规则、隔离和保护不适用。这 本质上与将组件的样式粘贴到 HTML。

【讨论】:

以上是关于角材质覆盖 SnackBar 组件的默认样式的主要内容,如果未能解决你的问题,请参考以下文章

角材料垫选择样式问题

如何覆盖 Angular 2 材质样式?

如何使用角镖组件材质阴影和排版?

Angular Material Snackbar 未正确显示

我的材质 UI 自定义类被材质 UI 的默认类覆盖

如何在 Dart 2 中使用材质角镖组件的排版?