【问题标题】:Mat-table background color on horizontal scroll水平滚动上的垫表背景颜色
【发布时间】:2019-05-17 15:39:47
【问题描述】:

在我的 Angular 6 应用程序中使用 mat-table,我无法在水平滚动时正确设置 mat-header-rowmat-row 的背景颜色。 CSS 属性仅适用于屏幕的可见部分,一旦向右滚动,就不会分配颜色。

我的表中有大约 30 列,所以肯定需要水平滚动。

我的 CSS 如下:

.mat-toolbar {
    font-size: 17px;
    font-family: inherit;
    background-color: indigo;
    max-height: 12vh;
}

.mat-elevation-z8 {
    padding: 0px;
}

.mat-table {
    overflow: auto;
    max-height: 68vh;
    min-width: 100%;
}

.mat-header-row {
    position: sticky;
    top: -.5px;
    z-index: 100;
    background-color: gainsboro;
    font-size: 12px;
    min-height: 8vh;
    color: #f5f5f5;
    padding-top: 3px;
}

.mat-row:nth-child(even) {
    background-color: floralwhite;
}

.mat-row:nth-child(odd) {
    background-color: gainsboro;
}

.mat-row {
    min-height: 8vh;
}

.no-results {
    display: flex;
    justify-content: center;
    padding: 12px;
    font-size: 12px;
    font-style: italic;
    font-family: inherit;
}

.mat-cell {
    font-family: inherit;
    font-size: 12px;
}

.mat-header-cell {
    font-size: 12px;
    font-weight: bolder;
}

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

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

.mat-cell:nth-child(3),
.mat-header-cell:nth-child(3) {
    flex: 0 0 14%;
}

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

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

.mat-cell:nth-child(6),
.mat-header-cell:nth-child(6) {
    flex: 0 0 8%;
}

.mat-cell:nth-child(7),
.mat-header-cell:nth-child(7) {
    flex: 0 0 9%;
}

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

.mat-cell:nth-child(9),
.mat-header-cell:nth-child(9) {
    flex: 0 0 8%;
}

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

.mat-cell:nth-child(11),
.mat-header-cell:nth-child(11) {
    flex: 0 0 8%;
}

.mat-cell:nth-child(12),
.mat-header-cell:nth-child(12) {
    flex: 0 0 11%;
}

.mat-cell:nth-child(13),
.mat-header-cell:nth-child(13) {
    flex: 0 0 7%;
}

.mat-cell:nth-child(14),
.mat-header-cell:nth-child(14) {
    flex: 0 0 11%;
}

.mat-cell:nth-child(15),
.mat-header-cell:nth-child(15) {
    flex: 0 0 7%;
}

.mat-cell:nth-child(16),
.mat-header-cell:nth-child(16) {
    flex: 0 0 8%;
}

.mat-column-name {
    border-right: 1px solid grey;
    align-self: stretch;
    text-align: center;
}

.mat-column-position {
    border-right: 1px solid grey;
    align-self: stretch;
    text-align: center;
}

.mat-column-weight {
    border-right: 1px solid grey;
    align-self: stretch;
    text-align: center;
}

.mat-column-symbol {
    text-align: center;
    align-self: stretch;
}

.mat-column-weight {
    align-self: stretch;
}

尝试将溢出属性分别设置为mat-h​​eader-row和mat-row;它会解析背景颜色,但标题行和数据行可以单独滚动而不同步。

HTML文件如下:

<div [@routerTransition] class="col-md-12 mat-elevation-z8" class="white-space-pre-line">
    <mat-toolbar color="primary">
        Project Times Overview Report
        <span class="spacer"></span>
        <mat-select *ngxPermissionsOnly="['attendance-all-leave-balance-read']" name="year" [(ngModel)]="selectedYear"
            class="form-control" type="text" placeholder="Year" required>
            <mat-option *ngFor="let year of yearName" [value]="year">{{year}}</mat-option>
        </mat-select> &nbsp;
        <button class="btn btn-sm btn-primary" *ngxPermissionsOnly="['attendance-all-leave-balance-read']" [disabled]="selectedYear==''"
            (click)="loadData()">View Report</button>
    </mat-toolbar>

    <div class="form">
        <mat-form-field floatPlaceholder="never" color="primary">
            <input matInput #filter placeholder="Filter">
        </mat-form-field>
    </div>

    <mat-table #table [dataSource]="dataSource" matSort class="mat-cell">
        <ng-container matColumnDef="sno">
            <mat-header-cell *matHeaderCellDef>S.No.</mat-header-cell>
            <mat-cell *matCellDef="let timesReport; let i = index;">{{i+1}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="timesCode">
            <mat-header-cell *matHeaderCellDef>Times Code</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.timesCode}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="projectName">
            <mat-header-cell *matHeaderCellDef>Project</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.projectName}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="team">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Team</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{getTeamDesc(timesReport)}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="department">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Department</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{getDeptDesc(timesReport)}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="allocatedWorkload">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Allocated PD</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.allocatedWorkload}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="activity">
            <mat-header-cell *matHeaderCellDef>Activity</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.activity}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="actualWorkload">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Actual Received PD</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.actualWorkload}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="createdBy">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Created By</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.createdBy}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="creationDate">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Creation Date</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.creationDate}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="approvedBy">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Approved By</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.approvedBy}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="approvalDate">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Approval Date</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.approvalDate}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="claimed">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Claimed PD</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.claimed}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="unclaimed">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Unclaimed PD</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.unclaimed}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="gapActualAllocated">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Gap (Actual vs Allocated)</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.gapActualAllocated}}</mat-cell>
        </ng-container>

        <ng-container matColumnDef="lossPD">
            <mat-header-cell *matHeaderCellDef mat-sort-header>Loss PD</mat-header-cell>
            <mat-cell *matCellDef="let timesReport">{{timesReport.lossPD}}</mat-cell>
        </ng-container>

        <mat-header-row *matHeaderRowDef="dispProjectTimesReportColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: dispProjectTimesReportColumns;"></mat-row>
    </mat-table>

    <div class="no-results" [style.display]="dataSource.renderedData.length == 0 ? '' : 'none'">
        No results found
    </div>

    <mat-paginator #paginator [length]="dataSource.filteredData.length" [pageIndex]="0" [pageSize]="100"
        [pageSizeOptions]="[25, 50, 100, 200]">
    </mat-paginator>

</div>

按照迪普的回答后,背景如下:

【问题讨论】:

  • 你能分享你的模板(HTML)吗?
  • @BearNithi 添加了 html 模板。请检查。
  • .mat-row:nth-child(even) td { background-color: #yourColor; }怎么样
  • 你能创建 stackblitz 示例来重现问题吗?
  • @ShubhamJain,您可以从浏览器中检查并复制您的 HTML,然后将其添加到 sn-p 中,以使用相关样式重现您的问题。

标签: css angular angular-material mat-table


【解决方案1】:

使用这个

    .mat-header-row{
            width: fit-content !important;
    }
    .mat-row{
            width: fit-content !important;
    }

【讨论】:

  • 这仍然适用于 Angular Material 8,应该是公认的解决方案。
  • 这仍然适用于 Angular 13...我不记得这个问题,但为什么他们还没有从源头修复它??!?!谢谢顺便说一句!
【解决方案2】:

mat-cell添加样式

.mat-row:nth-child(even) .mat-cell{
  background-color: floralwhite;
  min-height: 8vh;
  display: flex;
  align-items: center;
}
.mat-row:nth-child(odd) .mat-cell{
  background-color: gainsboro;
  min-height: 8vh;
  display: flex;
  align-items: center;
}
.mat-row{
  border-bottom-style: hidden;
}

stackblitz link

【讨论】:

  • 上述解决方案有效,但将固定高度应用于 mat-row 无法正确显示动态内容,并且可以扩展超过 8vh。尝试用 min-height 改变高度,但不能正常工作。
  • 不能正常工作,它会在有文本的区域周围应用背景,并且当单元格中的内容高度不同时,它会不均匀地分布。我在上面的答案中附上了屏幕截图。
猜你喜欢
  • 2018-01-17
  • 2023-03-28
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多