md-table - Jak zaktualizować szerokość kolumny


Odpowiedzi:


137

Kiedy Material tworzy tabelę, automagicznie stosuje dwie nazwy klas, których możesz użyć do nadania stylu każdej kolumnie. W poniższym przykładzie style są nazwane mat-column-userIdi cdk-column-userId.

<ng-container cdkColumnDef="userId">
  <md-header-cell *cdkHeaderCellDef> ID </md-header-cell>
  <md-cell *cdkCellDef="let row"> {{row.id}} </md-cell>
</ng-container>

Teraz możesz używać tych nazw w css:

.mat-column-userId {
  flex: 0 0 100px;
}

Podobna do odpowiedzi Rahula Patila , ale nie musisz dodawać kolejnej klasy do definicji kolumn.


W moim przypadku potrzebowałem! Ważne dla stylów zastosowanych w ten sposób, ponieważ w przeciwnym razie styl dla .mat-header-cellmiałby pierwszeństwo. Alternatywnie możesz po prostu dodać kolejną regułę stylu dla komórki nagłówka.
— Adrian Smith

Czy dokumentacja dotycząca tego jest dostępna gdziekolwiek (chciałem zrozumieć, co oznacza każda z 3 wartości po „flex” i jak .mat-column- <colName> odnosi się do odpowiedniej kolumny)? Dzięki!
— rahs

@RahulSaha flex jest teraz standardową właściwością css: „Jest to skrócona właściwość, która określa flex-grow, flex-shrink i flex-base”. źródło: developer.mozilla.org/en-US/docs/Web/CSS/flex
— Erik I

1
To jest rozwiązanie, którego ostatecznie użyłem, ale zamiast ustawić podstawę flex, ustawiłem flex grow tak, aby komórka była 3x większa niż inne komórki (flex: 3 0 0)
— emulcahy

3
Ustawienie szerokości za pomocą flexu nie działało w moim przypadku. Ani szerokość. min-width (z jakiegoś powodu).
— Paul Evans,

53

W tej chwili nie został jeszcze ujawniony na poziomie interfejsu API. Możesz to jednak osiągnąć za pomocą czegoś podobnego do tego

<ng-container cdkColumnDef="userId" >
  <md-header-cell *cdkHeaderCellDef [ngClass]="'customWidthClass'"> ID </md-header-cell>
  <md-cell *cdkCellDef="let row" [ngClass]="'customWidthClass'"> {{row.id}} </md-cell>
</ng-container>

W css musisz dodać tę klasę niestandardową -

.customWidthClass{
   flex: 0 0 75px;
}

Możesz tu wprowadzić logikę, aby dołączyć klasę lub niestandardową szerokość. Zastosuje niestandardową szerokość kolumny.

Ponieważ używa md-table flex, musimy podać stałą szerokość w sposób elastyczny. To po prostu wyjaśnia -

0 = nie rosnąć (skrót od flex-grow)

0 = nie kurczą się (skrót od flex-shrink)

75 pikseli = zacznij od 75 pikseli (skrót dla flex-base)

Plunkr tutaj - https://plnkr.co/edit/v7ww6DhJ6zCaPyQhPRE8?p=preview


1
Świetnie Oba działają. Dziękuję Ci. Ale jeśli dane są bardziej, wykraczają poza tabelę. I zawijanie słów też nie działa
— Vinutha Kumar

2
dlaczego używasz [ngClass] zamiast zwykłej klasy?
— Andre Elrico

37

Jeśli używasz w projekcie układu angular / flex-layout , możesz ustawić kolumnę za pomocą, dodając dyrektywę fxFlex do mat-header-cell i mat-cell:

 <ng-container matColumnDef="name" >
      <mat-header-cell fxFlex="100px" *matHeaderCellDef mat-sort-header>Name</mat-header-cell>
      <mat-cell  fxFlex="100px" *matCellDef="let row;" (click)="rowClick(row)">{{row.Name}}</mat-cell>
 </ng-container>

W przeciwnym razie możesz dodać niestandardowy CSS, aby osiągnąć ten sam wynik:

.mat-column-name{
    flex: 0 0 100px;
}


15

Odkryłem, że najlepiej dla mnie działa kombinacja odpowiedzi Jymdmana i Rahula Patila:

.mat-column-userId {
  flex: 0 0 75px;
}

Ponadto, jeśli masz jedną „wiodącą” kolumnę, która zawsze powinna zajmować pewną ilość miejsca na różnych urządzeniach, uważam, że poniższe informacje są bardzo przydatne do dostosowania do dostępnej szerokości kontenera w bardziej responsywny sposób (zmusza to pozostałe kolumny do równomiernie wykorzystać pozostałą przestrzeń):

.mat-column-userName {
  flex: 0 0 60%;
}

To najlepsza odpowiedź.
— PedroPovedaQ


9

Używam FlexLayout, aby zaktualizować szerokość kolumny zgodnie z mediami zapytań, które daje nam FlexLayout.

fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20" fxFlex.gt-md="25"

oznacza, że ​​ta kolumna będzie domyślnie używać 30% szerokości wiersza, gdy spełnione jest kryterium gt-xs @mediaQuery, nowa szerokość będzie wynosić 15% i podobne zachowanie dla innych warunków

<!-- CURRENTBALANCE COLUMN-->
  <ng-container cdkColumnDef="balance_2">
    <mat-header-cell fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20"
       fxFlex.gt-md="25" fxLayout="row" fxLayoutAlign="center center"
       *cdkHeaderCellDef>{{ balanceTable.datesHeaders[2] }}</mat-header-cell>
    <mat-cell fxFlex="30" fxFlex.gt-xs="15" fxFlex.gt-sm="20" fxFlex.gt-md="25" 
      *cdkCellDef="let eventTop">
      <div fxLayout="column" fxLayoutAlign="center center">
        <!-- CELL_CONTENT-->
      </div>
    </mat-cell>
  </ng-container>
<!-- CURRENTBALANCE COLUMN-->

Przeczytaj więcej o FlexLayout i @MediaQueries na https://github.com/angular/flex-layout/wiki/Responsive-API


Dodanie dyrektywy fxFlex do jednej kolumny wydaje się mieć wpływ na wszystkie. Czy istnieje sposób kierowania reklam tylko na jedną kolumnę?
— zakany

6

Właśnie użyłem:

th:nth-child(4) {
    width: 10%;
}

Zastąp 4 pozycją nagłówka, dla którego chcesz dostosować szerokość.Przykłady w użytej dokumentacji :

td, th {
  width: 25%;
}

Więc po prostu zmodyfikowałem to, aby uzyskać to, czego chciałem.


4

Możesz ustawić klasę .mat-cell na flex: 0 0 200px; zamiast flex: 1 wraz z n-tym dzieckiem.

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


4

możesz użyć fxFlexfrom "@ angular / flex-layout" w thi tdtak:

<ng-container matColumnDef="value">
      <th mat-header-cell fxFlex="15%" *matHeaderCellDef>Value</th>
            <td mat-cell *matCellDef="let element" fxFlex="15%" fxLayoutAlign="start center">
                           {{'value'}}
            </td>
       </th>
</ng-container>

2
.mat-column-skills {
    max-width: 40px;
}

Czy jesteś pewien, że to odbiega od odpowiedzi najczęściej wybieranych? Prawdopodobnie twój cdkColumnDef jest po prostu inny?
— user1781290

nie, to prawie to samo, chciałem tylko podkreślić, że tylko to działa dla mnie.
— Pragati Dugar

1

Możesz także użyć selektorów elementów:

mat-header-cell:nth-child(1), mat-cell:nth-child(1) {
    flex: 0 0 64px;
}

Ale odpowiedź jymdmana jest w większości przypadków najbardziej zalecanym sposobem.


1

Przykładowa kolumna tabeli Mat i odpowiadający jej kod CSS:

HTML / szablon

<ng-container matColumnDef="">
  <mat-header-cell *matHeaderCellDef>
     Wider Column Header
  </mat-header-cell>
  <mat-cell *matCellDef="let displayData">
    {{ displayData.value}}
  </mat-cell>`enter code here`
</ng-container>

CSS

.mat-column-courtFolderId {
    flex: 0 0 35%;
}

0

Jeśli chcesz, możesz również dodać styl bezpośrednio w znaczniku:

<ng-container matColumnDef="Edit">
     <th mat-header-cell *matHeaderCellDef > Edit </th>
     <td mat-cell *matCellDef="let element" (click)="openModal()" style="width: 50px;"> <i class="fa fa-pencil" aria-hidden="true"></i> </td>
</ng-container>

0

Jeśli masz zbyt wiele kolumn tabeli i nie jest ona dostosowywana w tabeli kątowej za pomocą md-table, wklej następujący styl do component.csspliku. Będzie działać jak urok z widokiem przewijania w poziomie.

.mat-table__wrapper .mat-table {
    min-width: auto !important;
    width: 100% !important; }

.mat-header-row {
    width: 100%; }

.mat-row {
    width: 100%;
}

Dodaj ten styl, aby osobno zmienić kolumnę.

.mat-column-{colum-name} {
    flex: 0 0 25% !important;
    min-width: 104px !important;
}

Ewentualnie sprawdzić ten link , (gdzie powyżej przyszedł kod z) , aby uzyskać więcej szczegółów.


0

Weźmy przykład. Jeśli Twoja tabela zawiera następujące kolumny:

<!-- ID Column -->
  <ng-container matColumnDef="id" >
    <th mat-header-cell *matHeaderCellDef mat-sort-header> ID </th>
    <td mat-cell *matCellDef="let row"> {{row.sid}} </td>
  </ng-container>

 <!-- Name Column -->
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
    <td mat-cell *matCellDef="let row"> {{row.name}} </td>
  </ng-container>

Ponieważ zawiera dwie kolumny. wtedy możemy ustawić szerokość kolumn za pomocą

.mat-column-<matColumnDef-value>{
    width: <witdh-size>% !important;
}

w tym przykładzie bierzemy

  .mat-column-id{
    width: 20% !important;      
  }
  .mat-column-name{
    width: 80% !important;
  }

0

Mam na to bardzo proste rozwiązanie - ustawienie innej szerokości kolumny w arkuszu stylów przez nadpisanie komórki i komórki nagłówka:

Przykład - ustawienie niestandardowej szerokości dla pierwszej i piątej kolumny:

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

github

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.