不应用角材料垫扩展面板体样式

Ruk*_*mad 10 css angular-material angular

我的组件的css文件中包含以下css:

.mat-expansion-panel-body {
  padding: 0;
}
Run Code Online (Sandbox Code Playgroud)

而且,因此我希望看到以下dom元素会显示此规则(即使被覆盖):

<div class="mat-expansion-panel-body">...</div>
Run Code Online (Sandbox Code Playgroud)

但是,我看到在开发工具中应用的全部是:

.mat-expansion-panel-body {
  padding: 0 24px 16px;
}
Run Code Online (Sandbox Code Playgroud)

我注意到该元素没有其他主机元素具有的_ngcontent-c19类,因此我假设这是视图封装的情况。

但是,在阅读了:: ng-deep和/ deep /的弃用以及其他封装不推荐使用的封装后,从组件的css文件中对该元素进行样式设置的更好解决方案是什么?

aln*_*sre 10

为了 "@angular/material": "^10.2.7"

您将encapsulation: ViewEncapsulation.None属性添加到 @Component 装饰器中

@Component({
  selector: '...',
  templateUrl: '...',
  styleUrls: ['...'],
  encapsulation: ViewEncapsulation.None
})
export class examplePage{}
Run Code Online (Sandbox Code Playgroud)

然后这个 CSS 将与 !important 一起工作

.mat-expansion-panel-body {
  padding: 0 !important;
}
Run Code Online (Sandbox Code Playgroud)

请注意,::ng-deep并且/deep/不适用于新版本的 angular/material


小智 6

:host ::ng-deep .mat-expansion-panel-body {
     padding: 0 !important;
 }
Run Code Online (Sandbox Code Playgroud)

效果最好,现在您不必考虑这种样式适用于您的所有组件。使用:host仅将其应用于当前主机组件


ibr*_*cic 5

如果您不想使用:: ng-deep,一种可能的解决方案是像这样在styles.css文件中设置样式。

.mat-expansion-panel-body {
  padding: 0 !important;
}
Run Code Online (Sandbox Code Playgroud)

这将除去填充物,但要小心,因为它将从所有垫子扩展面板主体元素中除去它。您可以通过在扩展面板中设置特定的类,然后在styles.css中执行类似的操作来绕过此操作

.my-special-class .mat-expansion-panel-body {
  padding: 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您甚至都不需要!important。这是一个例子。

https://stackblitz.com/edit/angular-a6necw

  • 我认为这是一个有效的替代方案。但是,我想保留本地化的样式,而不是创建特定于一个页面/组件的全局样式,因为随着项目的发展,它并不是真正可维护的。我试图对你的答案投赞成票,但我还没有足够的声誉来显示它。 (2认同)

Hie*_*yen 5

::ng-deep在组件css中进行设置,它在我这边工作。

::ng-deep .mat-expansion-panel-body{
     padding: 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您希望更改仅影响此组件,请将 ng-deep 放入 :host{} 内。或者将 ng-deep 放在 className 中并在所需的扩展面板中使用此类,以便它仅影响此扩展面板 (2认同)