md-table-如何更新列宽


Answers:


137

当Material创建表时,它会自动为您应用两个类名,您可以使用它们来设置各列的样式。在下面的示例中,样式命名为mat-column-userIdcdk-column-userId

<ng-container cdkColumnDef="userId">
  <md-header-cell *cdkHeaderCellDef> ID </md-header-cell>
  <md-cell *cdkCellDef="let row"> {{row.id}} </md-cell>
</ng-container>

现在,您可以在CSS中使用这些名称:

.mat-column-userId {
  flex: 0 0 100px;
}

Rahul Patil的答案类似,但是您不需要在列定义中添加其他类。


就我而言,我需要!important来应用这样的样式,因为否则样式.mat-header-cell将优先。或者,您可以为标题单元格添加另一个样式规则。
阿德里安·史密斯

是否可以在任何地方找到有关此文档的信息(我想了解“ flex”之后的3个值分别是什么意思,以及.mat-column- <colName>如何引用相应的列)?谢谢!
拉斯

@RahulSaha flex现在是标准的css属性:“这是设置flex-grow,flex-shrink和flex-basis的简写属性。” 来源:developer.mozilla.org/en-US/docs/Web/CSS/flex
Erik I,

1
这是我最终使用的解决方案,但我没有设置flex基础,而是设置flex grow,因此该单元比其他单元大3倍(flex:3 0 0)
emulcahy

3
在我的情况下,使用flex设置width无效。宽度也没有。最小宽度(出于某种原因)。
Paul Evans

53

目前,它尚未在API级别公开。但是,您可以使用与此类似的方法来实现

<ng-container cdkColumnDef="userId" >
  <md-header-cell *cdkHeaderCellDef [ngClass]="'customWidthClass'"> ID </md-header-cell>
  <md-cell *cdkCellDef="let row" [ngClass]="'customWidthClass'"> {{row.id}} </md-cell>
</ng-container>

在CSS中,您需要添加此自定义类-

.customWidthClass{
   flex: 0 0 75px;
}

在此处随意输入逻辑以添加类或自定义宽度。它将为列应用自定义宽度。

由于md-table使用flex,我们需要以flex方式给出固定的宽度。这只是解释了-

0 =不增长(flex-grow的简写)

0 =不缩小(flex-shrink的简写)

75px =以75px开始(flex-basis的简写)

在这里here- https: //plnkr.co/edit/v7ww6DhJ6zCaPyQhPRE8 ? p = preview


1
很好,两个都可以。谢谢。但是如果数据更多,它也超出了表格范围。而且自动换行也不起作用
Vinutha Kumar

2
为什么使用[ngClass]代替普通类?
安德烈·埃里科

37

如果在项目中使用角度/柔性布局,则可以通过向mat-h​​eader-cell和mat-cell添加fxFlex指令来设置列:

 <ng-container matColumnDef="name" >
      <mat-header-cell fxFlex="100px" *matHeaderCellDef mat-sort-header>Name</mat-header-cell>
      <mat-cell  fxFlex="100px" *matCellDef="let row;" (click)="rowClick(row)">{{row.Name}}</mat-cell>
 </ng-container>

否则,您可以添加自定义CSS以获得相同的结果:

.mat-column-name{
    flex: 0 0 100px;
}


15

我发现jymdman和Rahul Patil的答案最适合我:

.mat-column-userId {
  flex: 0 0 75px;
}

另外,如果您有一个“前导”列想要始终在不同设备上占用一定数量的空间,那么我发现以下方法很容易以一种响应速度更快的方式应用于可用的容器宽度(这会迫使其余的列均匀使用剩余空间):

.mat-column-userName {
  flex: 0 0 60%;
}

这是最好的答案。
PedroPovedaQ


9

我正在使用FlexLayout根据FlexLayout提供给我们的查询媒体来更新列宽。

fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20" fxFlex.gt-md="25"

表示此列默认情况下将使用行宽度的30%,当gt-xs @mediaQuery满足时,新宽度将为15%,其他情况下的行为类似

<!-- CURRENTBALANCE COLUMN-->
  <ng-container cdkColumnDef="balance_2">
    <mat-header-cell fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20"
       fxFlex.gt-md="25" fxLayout="row" fxLayoutAlign="center center"
       *cdkHeaderCellDef>{{ balanceTable.datesHeaders[2] }}</mat-header-cell>
    <mat-cell fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20" fxFlex.gt-md="25" 
      *cdkCellDef="let eventTop">
      <div fxLayout="column" fxLayoutAlign="center center">
        <!-- CELL_CONTENT-->
      </div>
    </mat-cell>
  </ng-container>
<!-- CURRENTBALANCE COLUMN-->

https://github.com/angular/flex-layout/wiki/Responsive-API上了解有关FlexLayout和@MediaQueries的更多信息


将fxFlex指令添加到一列似乎会影响它们。有没有一种方法只针对一列?
zakdances

6

我只是用过:

th:nth-child(4) {
    width: 10%;
}

将4替换为您需要调整宽度的标头位置。所用文档中的示例

td, th {
  width: 25%;
}

因此,我只是对其进行了修改以获得我想要的。


4

您可以将.mat-cell类设置为flex:0 0 200px; 代替flex:1和第n个孩子。

.mat-cell:nth-child(2), .mat-header-cell:nth-child(2) {
    flex: 0 0 200px;
}


4

您可以使用fxFlex“ @ angular / flex-layout”中的代码thtd如下所示:

<ng-container matColumnDef="value">
      <th mat-header-cell fxFlex="15%" *matHeaderCellDef>Value</th>
            <td mat-cell *matCellDef="let element" fxFlex="15%" fxLayoutAlign="start center">
                           {{'value'}}
            </td>
       </th>
</ng-container>


1

您还可以使用元素选择器:

mat-header-cell:nth-child(1), mat-cell:nth-child(1) {
    flex: 0 0 64px;
}

但是在大多数情况下,jymdman的答案是最推荐的方法。


1

示例Mat-table列和相应的CSS:

HTML /模板

<ng-container matColumnDef="">
  <mat-header-cell *matHeaderCellDef>
     Wider Column Header
  </mat-header-cell>
  <mat-cell *matCellDef="let displayData">
    {{ displayData.value}}
  </mat-cell>`enter code here`
</ng-container>

的CSS

.mat-column-courtFolderId {
    flex: 0 0 35%;
}

0

如果需要,还可以直接在标记中添加样式:

<ng-container matColumnDef="Edit">
     <th mat-header-cell *matHeaderCellDef > Edit </th>
     <td mat-cell *matCellDef="let element" (click)="openModal()" style="width: 50px;"> <i class="fa fa-pencil" aria-hidden="true"></i> </td>
</ng-container>

0

如果表格列过多,并且使用不能在角度表中进行调整md-table,则将以下样式粘贴到component.css文件中。水平滚动视图时,它将像超级按钮一样工作。

.mat-table__wrapper .mat-table {
    min-width: auto !important;
    width: 100% !important; }

.mat-header-row {
    width: 100%; }

.mat-row {
    width: 100%;
}

添加此样式可以单独更改列。

.mat-column-{colum-name} {
    flex: 0 0 25% !important;
    min-width: 104px !important;
}

可替换地检查这个链接(其中,上面的代码是从哪里来的),对于更多的细节。


0

让我们举个例子。如果您的表具有以下列:

<!-- ID Column -->
  <ng-container matColumnDef="id" >
    <th mat-header-cell *matHeaderCellDef mat-sort-header> ID </th>
    <td mat-cell *matCellDef="let row"> {{row.sid}} </td>
  </ng-container>

 <!-- Name Column -->
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
    <td mat-cell *matCellDef="let row"> {{row.name}} </td>
  </ng-container>

由于这包含两列。然后我们可以使用设置列的宽度

.mat-column-<matColumnDef-value>{
    width: <witdh-size>% !important;
}

在这个例子中,我们

  .mat-column-id{
    width: 20% !important;      
  }
  .mat-column-name{
    width: 80% !important;
  }

0

我得到了一个非常简单的解决方案-通过覆盖单元格和标题单元格为样式表中的列设置不同的宽度:

示例-为第一和第五列设置自定义宽度:

.mat-cell:nth-child(1),
.mat-header-cell:nth-child(1) {
  flex: 0 0 5%;
}
.mat-cell:nth-child(5),
.mat-header-cell:nth-child(5) {
  flex: 0 0 10%;
}

的github

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.