你如何使用material2卡中的mat-card-header-text处理div?

fla*_*diu 12 angular-material angular

我似乎无法将这个容器包裹在md卡中.

在我的材料卡片中,我有这个:

<div class="mat-card-header-text"> </div>
Run Code Online (Sandbox Code Playgroud)

我见过别人注意到了.它会在我的标题左侧产生40px的空间.没有CSS似乎也会影响它.

我正在使用Angular 4.x和Material2.

Dre*_*Dre 24

这个额外的div实际上很烦人.事实证明,您可以使用阴影穿孔来为其应用样式,而无需更改CSS仿真模式.你可以使用:: ng-deep组合器这样做:

::ng-deep .mat-card-header-text {
  /* CSS styles go here */
  margin: 0px; // for example to remove the margin
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用自己的CSS类替换整个标头:

<mat-card>
  <div class="your-header">
    <div class="your-title">
      Your title here
    </div>
  </div>
  <mat-card-content>
    Stuff goes here
  </mat-card-content>
</mat-card>
Run Code Online (Sandbox Code Playgroud)

  • 我必须添加`!important`才能正确覆盖边距 (6认同)
  • `:: ng-deep`已过时! (2认同)

小智 15

根据他们最近的建议https://angular.io/guide/component-styles,这对我有用:

 :host /deep/ .mat-card-header-text {
     margin: 0;
 }
Run Code Online (Sandbox Code Playgroud)

  • 是的,对于角度请使用 ``` :host ::ng-deep .mat-card-header-text { margin: 0; } ``` (2认同)

Lès*_*sté 8

这种行为是 Angular 2/4 的视图封装的结果,它在Emulated模式下只会注入(通过style元素)与视图模板中实际匹配元素的组件样式。

因此,如果您尝试覆盖这样的.mat-*样式:

.mat-card-header-text {
  height: auto;
  margin: 0;
}
Run Code Online (Sandbox Code Playgroud)

但你的 HTML 看起来像这样:

<md-card-header>
  <md-icon md-card-avatar>face</md-icon>
  <md-card-title>{{user.name}}</md-card-title>
  <md-card-subtitle>{{user.status | userStatus}}</md-card-subtitle>
</md-card-header>
Run Code Online (Sandbox Code Playgroud)

那么.mat-card-header-text规则就不会被注入到 DOM 中,因为注入器在你的模板中看不到这样的元素。

最简单的解决方法是直接div.mat-card-header-text在模板中包含该元素:

<md-card-header>
  <md-icon md-card-avatar>face</md-icon>
  <div class="mat-card-header-text">
    <md-card-title>{{user.name}}</md-card-title>
    <md-card-subtitle>{{user.status | userStatus}}</md-card-subtitle>
  </div>
</md-card-header>
Run Code Online (Sandbox Code Playgroud)

编辑:正如您所指出的,这会生成一个额外的 empty div.mat-card-header-text,因此它不是理想的解决方案。解决这个问题的唯一方法是,如果您基于md-card(可能使用组件继承)创建自己的卡片组件,但此时您只需直接修改组件的 CSS。

否则,您可以将组件的视图封装模式切换为None

import { ViewEncapsulation } from '@angular/core';

@Component({
  moduleId: module.id,
  selector: 'user-card',
  templateUrl: 'user-card.component.html',
  styleUrls: ['user-card.component.css'],
  encapsulation: ViewEncapsulation.None
})
...
Run Code Online (Sandbox Code Playgroud)

但是如果你这样做,:host选择器将不再工作,所以你需要用你在@Component装饰器中指定的选择器替换它:

user-card {
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我试着直接像你展示的那样直接使用div。然而,我最终得到了我的 div 并插入了一个。不过,为什么要这样做呢?你展示的方式还是我最终做到的方式? (2认同)

小智 5

我通过为md-card-title提供负的左边距来修复它

<md-card-title style="margin-left:-8px;">
Run Code Online (Sandbox Code Playgroud)


fla*_*diu 0

使用以下 css 和 html 修复它:

md-card-title > span {
    background-color: #fff;
    background-color: rgba(255, 255, 255, 0.5);
    position: absolute;
    margin-top: -81px;
    margin-left: -24px;
    font-size: 20px;
    padding: 10px;
}

<div class="main" mat-padding fxLayout="row" fxLayoutWrap="no-wrap" fxLayoutAlign="center start" fxLayoutGap="15px">
    <md-card class="mat-elevation-z2" mat-whiteframe="8" (click)="goToArticle(article)" *ngFor="let article of articleStore.articles() | async">
        <img md-card-image src="{{ article.getCover() }}">
        <md-card-title fxFlex>
            <span>{{ article.title }}</span>
        </md-card-title>
        <md-card-content>
            <p>{{ article.description }}</p>
        </md-card-content>  
    </md-card>
</div>
Run Code Online (Sandbox Code Playgroud)

使用<md-card-header></md-card-header>会带来一些奇怪的间距问题。不确定这是否是一个错误。