Angular 15+ngx-admin中Material Table CSS不生效原因咨询
问题背景
我有一个基于ngx-admin模板的Angular 15项目,使用Angular Material Table。最初尝试的CSS代码无法生效:
.mat-footer-row, .mat-header-row { //border: 1px solid #e7e7e7; height: 15px !important; background-color: #27315a; color: #fff; } .mat-row:nth-child(odd) .mat-cell { background-color: nb-theme(background-basic-color-1); font-weight: normal; color: nb-theme(text-basic-color); } .mat-row:nth-child(even) .mat-cell { background-color: nb-theme(background-basic-color-2); //background-color: rgba(0, 0, 0, 0); color: nb-theme(text-basic-color); font-weight: normal; }
改用以下代码后样式成功应用:
td[mat-cell] { padding: 16px 0 16px 0; border-bottom: 2px solid #ffa600; border-top: 2px solid #ffa600; }
原因分析
样式优先级与组件封装限制:Angular组件默认启用样式封装,ngx-admin基于Neubular框架,对Material组件的样式做了高优先级的内置覆盖。你最初使用的类选择器(
.mat-footer-row、.mat-row)优先级低于框架内置样式,即便加了!important,也可能因为组件封装的隔离规则无法穿透到Material组件内部。而属性选择器td[mat-cell]直接选中元素,优先级更高,能绕过部分封装限制。nb-theme()函数的上下文问题:nb-theme()是Neubular的主题变量获取函数,只有在Neubular的样式体系上下文(比如全局样式文件、Neubular组件的样式块)中才能正常解析。如果你的CSS写在普通组件的styles里,未正确关联Neubular主题环境,nb-theme()会返回无效值,导致背景色等样式失效,让你误以为整个选择器不起作用。Material Table的DOM样式层级:Material Table自身的样式会用更具体的选择器(比如
.mat-table .mat-row .mat-cell)定义单元格样式,你最初的.mat-row:nth-child(odd) .mat-cell选择器特异性不足,被内置样式覆盖。而td[mat-cell]直接定位到单元格元素,避开了行选择器被覆盖的问题。
内容的提问来源于stack exchange,提问作者Dejan Markovic

