md-table - Как обновить ширину столбца

86

Я начал использовать md-table для своего проекта, и мне нужна фиксированная ширина столбца. На данный момент все столбцы по ширине разделены на одинаковые размеры.

Где я могу получить документацию по размерам таблицы данных?

https://material.angular.io/components/table/overview

Винута Кумар
источник

Ответы:

137

Когда Material создает таблицу, он автоматически применяет два имени класса, которые вы можете использовать для стилизации каждого столбца. В приведенном ниже примере стили названы mat-column-userIdи 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>

Теперь вы можете использовать эти имена в css:

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

Подобно ответу Рахула Патила , но вам не нужно добавлять еще один класс в определения столбцов.

джимдман
источник
В моем случае мне нужен! Important для стилей, применяемых таким образом, потому что в противном случае .mat-header-cellприоритет будет иметь стиль для . В качестве альтернативы вы можете просто добавить другое правило стиля для ячейки заголовка.
Адриан Смит
Доступна ли где-либо документация по этому поводу (я хотел понять, что означает каждое из трех значений после "flex" и как .mat-column- <colName> относится к соответствующему столбцу)? Благодарность!
rahs
@RahulSaha flex теперь является стандартным свойством css: «Это сокращенное свойство, которое устанавливает flex-grow, flex-shrink и flex-base». источник: developer.mozilla.org/en-US/docs/Web/CSS/flex
Эрик I
1
Это решение, которое я в конечном итоге использовал, но вместо настройки гибкости я установил flex grow, чтобы ячейка была в 3 раза больше, чем другие ячейки (flex: 3 0 0)
emulcahy
3
В моем случае установка ширины с помощью flex не сработала. Ни ширины. min-width сделал (по какой-то причине).
Пол Эванс
53

На данный момент он еще не был представлен на уровне API. Однако вы можете добиться этого, используя что-то вроде этого

<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>

В css вам нужно добавить этот собственный класс -

.customWidthClass{
   flex: 0 0 75px;
}

Не стесняйтесь вводить логику добавления сюда класса или произвольной ширины. Он применит нестандартную ширину для столбца.

Поскольку используется md-table flex, нам нужно гибко указать фиксированную ширину. Это просто объясняет -

0 = не расти (сокращение от flex-grow)

0 = не сжиматься (сокращение от flex-shrink)

75px = начало с 75px (сокращение от flex-base)

Plunkr здесь - https://plnkr.co/edit/v7ww6DhJ6zCaPyQhPRE8?p=preview

Рахул Патил
источник
1
Хорошо. Оба работают. Спасибо. Но если его данные выходят и за пределы таблицы. И перенос слов также не работает,
Винута Кумар
2
почему вы используете [ngClass] вместо обычного класса?
Андре Эльрико
37

Если вы используете в своем проекте angular / flex-layout , вы можете установить столбец с, добавив директиву fxFlex в mat-header-cell и 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>

В противном случае вы можете добавить собственный CSS для достижения того же результата:

.mat-column-name{
    flex: 0 0 100px;
}
Ульяна Павелко
источник
20

Проверьте это: https://github.com/angular/material2/issues/5808

Поскольку material2 использует гибкий макет, вы можете просто установить fxFlex="40"(или желаемое значение для fxFlex) на md-cellи md-header-cell.

Карлос Э. Венегас
источник
Стоит отметить, что fxFlex="40px"это тоже возможно,
umutesen 05
Самый простой способ сделать это. Хороший совет!
jseals
15

Я обнаружил, что комбинация ответов Джимдмана и Рахула Патила лучше всего работает для меня:

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

Кроме того, если у вас есть один «ведущий» столбец, который вы хотите всегда занимать определенное количество места на разных устройствах, я обнаружил, что следующее очень удобно для адаптации к доступной ширине контейнера в более гибком виде (это заставляет остальные столбцы равномерно используйте оставшееся пространство):

.mat-column-userName {
  flex: 0 0 60%;
}
Ганс
источник
Это лучший ответ.
PedroPovedaQ 02
9

Я использую FlexLayout для обновления ширины столбца в соответствии с носителем запроса, который предоставляет нам FlexLayout.

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

означает, что этот столбец будет использовать 30% ширины строки по умолчанию, при выполнении gt-xs @mediaQuery новая ширина будет 15% и аналогичное поведение для других условий

<!-- 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-->

Узнайте больше о FlexLayout и @MediaQueries на https://github.com/angular/flex-layout/wiki/Responsive-API

Фелипе Санта
источник
Добавление директивы fxFlex в один столбец, похоже, влияет на все. Есть ли способ настроить таргетинг только на один столбец?
zakdances
6

Я просто использовал:

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

Замените 4 положением заголовка, ширину которого вам необходимо настроить. Примеры из документации :

td, th {
  width: 25%;
}

Поэтому я просто изменил его, чтобы получить то, что хотел.

Даниекпо
источник
4

Вы можете установить для класса .mat-cell значение flex: 0 0 200px; вместо flex: 1 вместе с nth-child.

.mat-cell:nth-child(2), .mat-header-cell:nth-child(2) {
    flex: 0 0 200px;
}
Марк Кутаджар
источник
4

Теперь вы можете сделать это так

<cdk-cell [style.flex]="'0 0 75px'">
Джейсон Политис
источник
4

вы можете использовать fxFlex"@ angular / flex-layout" thи tdвот так:

<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>
amir110
источник
2
.mat-column-skills {
    max-width: 40px;
}
Прагати Дугар
источник
Вы уверены, что это отклонение от наиболее популярного ответа? Возможно, ваш cdkColumnDef просто другой?
user1781290 08
нет, это почти то же самое, просто хотел подчеркнуть, что только это сработало для меня.
Pragati Дугар
1

Вы также можете использовать селекторы элементов:

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

Но ответ jymdman - это наиболее рекомендуемый способ в большинстве случаев.

Мартин Шнайдер
источник
1

Образец столбца Mat-table и соответствующий CSS:

HTML / шаблон

<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

Вы также можете добавить стиль прямо в разметку, если хотите:

<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

Если у вас слишком много столбцов таблицы и они не настраиваются в угловой таблице с помощью md-table, вставьте следующий стиль в component.cssфайл. Он будет работать как шарм с горизонтальной прокруткой.

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

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

.mat-row {
    width: 100%;
}

Добавьте этот стиль, чтобы изменить столбец отдельно.

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

Кроме того, проверьте эту ссылку , (где код выше пришел от) , более подробно.

конташи35
источник
0

Возьмем пример. Если в вашей таблице есть следующие столбцы:

<!-- 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>

Поскольку это содержит два столбца. тогда мы можем установить ширину столбцов, используя

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

для этого примера мы берем

  .mat-column-id{
    width: 20% !important;      
  }
  .mat-column-name{
    width: 80% !important;
  }
am2505
источник
0

У меня есть очень простое решение - установить разную ширину столбца в таблице стилей, переопределив как ячейку, так и ячейку заголовка:

Пример - установка произвольной ширины для 1-го и 5-го столбца:

.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

reza.cse08
источник