Adjusting mat-table on xs screen size using flex box css in angular 2

11,667

To adjust the spacing between the columns, set min width on mat-cell and use media queries.

For example for small screens:

  @media only screen and (max-width: 736px) and (orientation:portrait) {
    mat-header-row, mat-row {
     width: 200%;  //you can also set it in px,em, etc...
    }

  }

DEMO

Share:
11,667

Related videos on Youtube

Heena
Author by

Heena

Updated on June 04, 2022

Comments

  • Heena
    Heena about 2 years

    I have implemented a simple angular material table using flexbox css.

    In the desktop my table view is as shown below.

    enter image description here

    In md screen size the view is

    enter image description here

    In xs screen size its view is

    enter image description here

    When i see the table in XS screen view ,the spacing between the table columns is not properly adjusted..

    Is there a way out where i can add a horizontal scroll to space the table columns properly by specifying a min width to my table and adding a horizontal scroll when in XS and SM screen sizes.

    Below shown is my .html file

    <div class="example-container mat-elevation-z8">
      <mat-table #table [dataSource]="dataSource">
    
        <!-- Checkbox Column -->
        <ng-container matColumnDef="select">
          <mat-header-cell *matHeaderCellDef>
            <mat-checkbox (change)="$event ? masterToggle() : null"
                          [checked]="selection.hasValue() && isAllSelected()"
                          [indeterminate]="selection.hasValue() && !isAllSelected()">
            </mat-checkbox>
          </mat-header-cell>
          <mat-cell *matCellDef="let row">
            <mat-checkbox (click)="$event.stopPropagation()"
                          (change)="$event ? selection.toggle(row) : null"
                          [checked]="selection.isSelected(row)">
            </mat-checkbox>
          </mat-cell>
        </ng-container>
    
    
        <!-- Position Column -->
        <ng-container matColumnDef="position">
          <mat-header-cell *matHeaderCellDef> No. </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
        </ng-container>
    
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.name}} </mat-cell>
        </ng-container>
    
        <!-- Weight Column -->
        <ng-container matColumnDef="weight">
          <mat-header-cell *matHeaderCellDef> Weight </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
        </ng-container>
    
        <!-- Symbol Column -->
        <ng-container matColumnDef="symbol">
          <mat-header-cell *matHeaderCellDef> Symbol </mat-header-cell>
          <mat-cell *matCellDef="let element"> {{element.symbol}} </mat-cell>
        </ng-container>
    
        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
      </mat-table>
    
      <mat-paginator #paginator
                     [pageSize]="10"
                     [pageSizeOptions]="[5, 10, 20]">
      </mat-paginator>
    </div>
    

    Below is my .css file

    .example-container {
      display: flex;
      flex-direction: column;
      min-width: 300px;
      margin:10px;
    }
    
    .mat-table {
      overflow: auto;
      max-height: 250px;
    }
    
    mat-header-cell, mat-header-row, .mat-header-cell-def{
        background:#f2f4f7;
        min-height:15px;
        font-family:Verdana,sans-serif;
        font-weight:bold;
        font-size:13px;
        color: #1a084c;
        margin-bottom:5px;
         top: 0;
        position: sticky;
        z-index: 1;
    }
    
    mat-row{
        min-height:20px;
        font-family:Verdana,sans-serif;
        font-size:11px;
        color: #1a084c;
        }
    mat-cell{
        height:20px;
        font-family:Verdana,sans-serif;
        font-size:11px; 
        color: #1a084c;
    }
    

    Below is my .ts file

    import { Component, OnInit,Inject, ViewChild } from '@angular/core';
    import {ShowmenuService} from '../showmenu.service';
    import {MatTableDataSource, MatPaginator} from '@angular/material';
    import {SelectionModel} from '@angular/cdk/collections';
    import { ActivatedRoute, Params } from '@angular/router';
    import { MAT_DIALOG_DATA, MatDialogRef, MatDialog } from '@angular/material/dialog';
    
    @Component({
      selector: 'app-space-admin',
      templateUrl: './space-admin.component.html',
      styleUrls: ['./space-admin.component.css']
    })
    export class SpaceAdminComponent implements OnInit {
    
    
      constructor(public showmenu:ShowmenuService, private _activateroute: ActivatedRoute, public dialog: MatDialog) { }
    
      ngOnInit() {
        this.showmenu.show();
        this.showmenu.show1();
          }
      displayedColumns = ['select','position', 'name', 'weight', 'symbol'];
      dataSource = new MatTableDataSource<Element>(ELEMENT_DATA);
      selection = new SelectionModel<Element>(true, []);
    
      @ViewChild(MatPaginator) paginator: MatPaginator;
    
      /**
       * Set the paginator after the view init since this component will
       * be able to query its view for the initialized paginator.
       */
      ngAfterViewInit() {
        this.dataSource.paginator = this.paginator;
      }
    
      /** Whether the number of selected elements matches the total number of rows. */
      isAllSelected() {
        const numSelected = this.selection.selected.length;
        const numRows = this.dataSource.data.length;
        return numSelected === numRows;
      }
    
      /** Selects all rows if they are not all selected; otherwise clear selection. */
      masterToggle() {
        this.isAllSelected() ?
            this.selection.clear() :
            this.dataSource.data.forEach(row => this.selection.select(row));
      }
    }
    
    export interface Element {
      name: string;
      position: number;
      weight: number;
      symbol: string;
    }
    
    const ELEMENT_DATA: Element[] = [
      {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
      {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
      {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
      {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
      {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'},
      {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'},
      {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'},
      {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'},
      {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'},
      {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'},
      {position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na'},
      {position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg'},
      {position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al'},
      {position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si'},
      {position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P'},
      {position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S'},
      {position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl'},
      {position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar'},
      {position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K'},
      {position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca'},
    ];
    

    modified table in xs view

    enter image description here

  • Heena
    Heena about 6 years
    its working for me as i wished it to be ... but when i scroll right to see the remaining columns , i don't find the separation between the rows , as in the starting columns.. i have added the screen shot in my question ... please have a look.
  • Heena
    Heena about 6 years
    can you please tell me what is the problem here ..?
  • Heena
    Heena about 6 years
    why are the rows not separated as in the start?
  • Heena
    Heena about 6 years
    yes exactly i got it as per my requirement ... thanks a lot again..thanks for the help..