You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular mat-table列头与单元格对齐不一致问题如何解决

问题描述

我的mat-table列对齐效果存在异常,无法实现各列统一对齐。

已编写的CSS代码如下:

mat-header-cell, mat-cell {
  justify-content: center;
}

table{
  width: 100%;
}
 
.cdk-column-email {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 15% !important;
  width: 15% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

对应的HTML代码如下:

<mat-table mat-table [dataSource]="dataSource" class="mat-elevation-z8" matSort>
  
    <ng-container matColumnDef="id">
      <th mat-header-cell *matHeaderCellDef mat-sort-header><b>S.No</b></th>
      <td mat-cell *matCellDef="let item; let i = index">
         {{ (paginatorRef.pageIndex * paginatorRef.pageSize) + (i + 1) }}
      </td>
     </ng-container>

    <ng-container *ngFor="let column of columns; let colIndex = index" [cdkColumnDef]="column.columnDef" class="row-color">
 
      <mat-header-cell *cdkHeaderCellDef mat-sort-header > <b>{{ column.header }}</b></mat-header-cell>
      <mat-cell *cdkCellDef="let row"  [ngClass]="{ 'selected': row === selectedRow }">{{ column.cell(row) }}</mat-cell>
    </ng-container>

       <ng-container cdkColumnDef="update">
          <mat-header-cell *cdkHeaderCellDef> <b>Update</b> </mat-header-cell>
          <mat-cell *cdkCellDef="let element">       
                <mat-icon class="mat-18" (click)="Editdata(element)">edit</mat-icon>               
          </mat-cell>
        </ng-container>
     
        <ng-container cdkColumnDef="delete">
            <mat-header-cell *cdkHeaderCellDef> <b>Delete</b> </mat-header-cell>
            <mat-cell *cdkCellDef="let element">                
                  <mat-icon class="mat-18" (click)="openDialog(element.id)">delete</mat-icon>                  
            </mat-cell>
          </ng-container>   

    <mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;" [ngClass]="{'row-color': !row.active}"></mat-row>             
  </mat-table>
  <mat-paginator #paginatorRef pageSize="15" [pageSizeOptions]="[10, 25, 50]" showFirstLastButtons></mat-paginator>

当前实际效果

设置justify-content: center时的效果:
设置justify-content: center时的效果

为mat-header-cell和mat-cell设置justify-content: center属性后,各列对齐效果不一致。不设置该属性时的效果如下:
未设置justify-content: center时的效果


解决方案

导致对齐异常的核心原因有两点:一是仅给email列设置了固定宽度规则,其余列的宽度由内容自动撑开,宽度不统一导致对齐错位;二是带排序功能的表头(mat-sort-header)自带右侧排序箭头占位,默认的内边距和普通单元格不统一,也会导致上下对齐错位。

替换原有CSS为以下内容即可实现统一对齐:

/* 全局table宽度 */
table{
  width: 100%;
  table-layout: fixed; /* 固定表格布局,避免内容撑开列宽 */
}

/* 统一所有单元格的对齐和盒模型 */
mat-header-cell, mat-cell, th[mat-header-cell], td[mat-cell] {
  justify-content: center;
  text-align: center;
  padding: 0 8px; /* 统一内边距 */
  box-sizing: border-box;
  overflow: hidden;
}

/* 统一带排序表头的布局,抵消排序箭头的占位偏移 */
.mat-sort-header-container {
  justify-content: center;
  padding-right: 0 !important; /* 取消默认给排序箭头预留的右padding */
}

/* 保留原有的email列换行规则 */
.cdk-column-email {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 15% !important;
  width: 15% !important;
  overflow-wrap: break-word;
  word-break: break-word;
  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

/* 操作列固定小宽度 */
.cdk-column-update, .cdk-column-delete {
  flex: 0 0 80px !important;
  width: 80px !important;
}

/* 序号列固定小宽度 */
.cdk-column-id {
  flex: 0 0 80px !important;
  width: 80px !important;
}

如果有其他自定义列需要调整宽度,参照上述写法给对应的.cdk-column-列名设置固定宽度或占比即可。


内容的提问来源于stack exchange,提问作者A Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:07