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

如何调整Angular Material mat-table宽度?CSS设置无效问题

解决Angular Material mat-table宽度无法调整的问题

问题描述

我有一个Angular Material的mat-table,代码如下:

<mat-table [dataSource]="ds">
  ...
</mat-table>

想要缩小表格显示宽度,尝试在组件CSS中添加以下代码但无效:

.mat-table {
    width: 50%;
}

通过Chrome开发者工具发现,实际控制宽度的是外层mat-card的样式,对应元素:

<mat-card _ngcontent-vna-c44="" class="mat-mdc-card mdc-card">..</mat-card>

其CSS为:

mat-card[_ngcontent-vna-c44] {
    max-width: 80%;
    margin: 2em auto;
    text-align: center;
}

在开发者工具中修改该max-width可实现宽度调整,但本地CSS中写以下代码仍无效:

.mat-card {
    max-width: 50%;
}

原因分析

Angular默认开启组件样式封装,组件内的CSS会被添加专属的属性选择器(比如_ngcontent-vna-c44),导致你写的.mat-card选择器无法匹配到带有Angular专属属性的mat-card元素,样式无法生效。

解决方法

方法1:使用::ng-deep穿透样式封装

在组件CSS中使用::ng-deep强制穿透样式隔离,让样式作用到目标mat-card:

::ng-deep .mat-card {
    max-width: 50%;
}

注意:::ng-deep是Angular的废弃语法,但目前仍能正常使用,后续可能会被替代,使用时需留意官方更新。

方法2:将样式放到全局样式文件

把mat-card的样式添加到项目根目录的styles.css(或styles.scss)中,全局样式不受组件封装限制:

.mat-card {
    max-width: 50%;
}

如果只想针对当前页面的mat-card生效,可以给mat-card添加自定义类,再在全局样式中指定:

<!-- 给mat-card添加自定义类 -->
<mat-card class="custom-table-card">
  <mat-table [dataSource]="ds">...</mat-table>
</mat-card>
/* 全局styles.css中 */
.custom-table-card {
    max-width: 50%;
}

方法3:关闭当前组件的样式封装

在组件装饰器中设置encapsulation: ViewEncapsulation.None,关闭当前组件的样式隔离,这样组件内的CSS会变成全局样式:

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

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html',
  styleUrls: ['./your-component.component.css'],
  encapsulation: ViewEncapsulation.None
})
export class YourComponentComponent {
  // 组件逻辑
}

然后在组件CSS中正常写样式即可:

.mat-card {
    max-width: 50%;
}

注意:关闭样式封装后,组件内的所有CSS都会变成全局样式,可能会影响其他组件,需谨慎使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:00:10