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

Здесь, в моей таблице матов, есть 6 столбцов, когда в любом столбце не больше слов, тогда он выглядит как Изображение-1, но когда в любом столбце больше слов, тогда пользовательский интерфейс выглядит как Изображение-2, поэтому как установить пользовательский интерфейс, как Изображение-1, когда любой В столбце есть больше слов в угловом 6?

Изображение-1

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

Изображение-2

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

user.component.html

<div class = "mat-elevation-z8">      
 <table mat-table [dataSource] = "dataSource">
  <ng-container matColumnDef = "userimage">
    <th mat-header-cell *matHeaderCellDef> # </th>
    <td mat-cell *matCellDef = "let element"> 
      <img src = "{{commonUrlObj.commonUrl}}/images/{{element.userimage}}" style = "height: 40px;width: 40px;"/>
    </td>
  </ng-container>

  <ng-container matColumnDef = "username">
    <th mat-header-cell *matHeaderCellDef> Full Name </th>
    <td mat-cell *matCellDef = "let element"> {{element.username}} ( {{element.usertype}} )</td>
  </ng-container>

  <ng-container matColumnDef = "emailid">
    <th mat-header-cell *matHeaderCellDef> EmailId </th>
    <td mat-cell *matCellDef = "let element"> {{element.emailid}} </td>
   </ng-container>

  <ng-container matColumnDef = "contactno">
    <th mat-header-cell *matHeaderCellDef> Contact No. </th>
    <td mat-cell *matCellDef = "let element"> {{element.contactno}} </td>
  </ng-container>

  <ng-container matColumnDef = "enabled">
    <th mat-header-cell *matHeaderCellDef> Enabled </th>
    <td mat-cell *matCellDef = "let element" style = "color: blue">
      <ng-container *ngIf = "element.enabled == 'true'; else otherss">Enabled</ng-container>
        <ng-template #otherss>Disabled</ng-template>
    </td>
  </ng-container>

  <ng-container matColumnDef = "action">
    <th mat-header-cell *matHeaderCellDef> Action </th>
      <td mat-cell *matCellDef = "let element" fxLayoutGap = "5px">
        <button mat-mini-fab color = "primary" routerLink = "/base/editUserDetails/{{element.userid}}"><mat-icon>edit</mat-icon></button>
        <button mat-mini-fab color = "primary" routerLink = "/base/viewUserDetails/{{element.userid}}"><mat-icon>pageview</mat-icon></button>
      </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
  <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [pageSizeOptions] = "[5, 10, 20, 50 ,100]" showFirstLastButtons></mat-paginator>

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
115
0
230 341
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

table {
  width: 100%;
  table-layout: fixed;
}

th, td {
  overflow: hidden;
  width: 200px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

Вот StackBlitz Example с образцами данных

Речь идет о mat-table, а не о table[mat-table]. Это не работает для mat-table (шлейф). material.angular.io/components/table/overview

Dominik 12.03.2020 19:43
Ответ принят как подходящий

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

user.component.css

table{
 width: 100%;
}

.mat-column-username {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 28% !important;
  width: 28% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-emailid {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 25% !important;
  width: 25% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-contactno {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 17% !important;
  width: 17% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-userimage {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 8% !important;
  width: 8% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-userActivity {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 10% !important;
  width: 10% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

Вы должны указать, в какой селектор вы добавляете эти классы

Nick Gallimore 10.06.2019 15:58

@Nick: вы не собираетесь добавлять ни к одному селектору таблицы данных. Просто назовите свой селектор css таким же, как имя, которое вы дали вашему matColumnDef в вашем файле .html.

Bashir M. Saad 18.11.2019 02:54

@ BashirM.Saad Спасибо, это упрощает задачу, особенно селекторы предопределены и нет необходимости добавлять собственные селекторы. Работает именно так, как показано.

Rahul Sonwanshi 19.02.2020 13:29

почему !important? По возможности избегайте этой директивы, так как без нее она работает нормально.

Saad Benbouzid 07.12.2020 15:35

Если вы используете scss для своих стилей, вы можете использовать миксин, чтобы помочь сгенерировать код. Ваши стили быстро выйдут из-под контроля, если каждый раз выставлять все свойства.

Это очень простой пример - на самом деле не более чем доказательство концепции, вы можете расширить его с помощью нескольких свойств и правил по мере необходимости.

    @mixin mat-table-columns($columns)
    {
        .mat-column-
        {
            @each $colName, $props in $columns {
    
                $width: map-get($props, 'width');
                
                &#{$colName} 
                {
                    flex: $width;
                    min-width: $width;
    
                    @if map-has-key($props, 'color') 
                    {
                        color: map-get($props, 'color');
                    }
                }  
            }
        }
    }

Затем в вашем компоненте, где определена ваша таблица, вы просто делаете это:

    @include mat-table-columns((
    
        orderid: (width: 6rem, color: gray),
        date: (width: 9rem),
        items: (width: 20rem)
    
    ));

Это генерирует что-то вроде этого:

    .mat-column-orderid[_ngcontent-c15] {
      flex: 6rem;
      min-width: 6rem;
      color: gray; }
    
    .mat-column-date[_ngcontent-c15] {
      flex: 9rem;
      min-width: 9rem; }

В этой версии width становится flex: value; min-width: value.

Для вашего конкретного примера вы можете добавить wrap: true или что-то в этом роде в качестве нового параметра.

Когда-то кто-то проголосовал за меня за это :-) Я нашел этот способ очень полезным - и вы можете расширять его все, что хотите, по мере необходимости, чтобы быть более согласованным между компонентами.

Simon_Weaver 18.07.2019 09:58

Примечание. Вы, конечно, можете использовать пиксели, если хотите. Я обычно предпочитаю ems, когда задействованы текстовые данные, и я использую здесь rems, потому что, когда размер шрифта заголовка и ячейки отличается, они будут искажены, поскольку по определению em зависят от размера шрифта.

Simon_Weaver 06.09.2019 00:23

Это выглядит супер шикарно, но я не понимаю, куда положить миксин ...

Gus 22.08.2020 22:25

как импортировать $columns в мат-таблицу ??

Sridhar Natuva 14.10.2020 15:24

@SridharNatuva, вы не импортируете $ columns, это просто имя переменной в определенном миксине (найдите sass-миксины). Когда вы используете миксин с @include, туда вы помещаете значение для $ columns (в моем примере выше @include mat-table-columns(( вторая скобка - это начало значения $ columns, которое представляет собой структуру данных sass, представляющую каждый именованный столбец)

Simon_Weaver 01.02.2021 23:32

мы можем добавить атрибут ширина прямо в th

например:

<ng-container matColumnDef = "position" >
    <th mat-header-cell *matHeaderCellDef width  = "20%"> No. </th>
    <td mat-cell *matCellDef = "let element"> {{element.position}} </td>
  </ng-container>

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

Carl Sare 09.01.2020 09:03

Чтобы добавить к бумажному следу, официальные документы подтверждают это: <th>

Dane Brouwer 24.02.2020 12:25

Вот альтернативный способ решения проблемы:

Вместо того, чтобы пытаться «исправить это в публикации», почему бы вам не обрезать описание до того, как таблица попытается уместить его в свои столбцы? У меня так получилось:

<ng-container matColumnDef = "description">
   <th mat-header-cell *matHeaderCellDef> {{ 'Parts.description' | translate }} </th>
            <td mat-cell *matCellDef = "let element">
                {{(element.description.length > 80) ? ((element.description).slice(0, 80) + '...') : element.description}}
   </td>
</ng-container>

Поэтому я сначала проверяю, больше ли массив определенной длины, если да, то усекаю и добавляю «...», в противном случае передаю значение как есть. Это позволяет нам по-прежнему пользоваться автоматическим интервалом в таблице :)

Лучшее решение для меня, так как я также хотел обрезать данные. В других решениях, если вы просто указываете ширину столбца, высота строки увеличивается по мере того, как данные вырастают за пределы ширины

learner 12.05.2020 00:08

Как я реализовал, и он работает нормально. вам просто нужно добавить ширину столбца с помощью matColumnDef = "description"

Например :

<mat-table #table [dataSource] = "dataSource" matSortDisableClear>
    <ng-container matColumnDef = "productId">
        <mat-header-cell *matHeaderCellDef>product ID</mat-header-cell>
        <mat-cell *matCellDef = "let product">{{product.id}}</mat-cell>
    </ng-container>
    <ng-container matColumnDef = "productName">
        <mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
        <mat-cell *matCellDef = "let product">{{product.name}}</mat-cell>
    </ng-container>
    <ng-container matColumnDef = "actions">
        <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>
        <mat-cell *matCellDef = "let product">
            <button (click) = "view(product)">
                <mat-icon>visibility</mat-icon>
            </button>
        </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef = "displayedColumns"></mat-header-row>
    <mat-row *matRowDef = "let row; columns: displayedColumns"></mat-row>
</mat-table>

здесь matColumnDefproductId, productName и action

теперь применяем ширину по matColumnDef

укладка

.mat-column-productId {
    flex: 0 0 10%;
}
.mat-column-productName {
    flex: 0 0 50%;
}

а оставшаяся ширина одинаково распределяется между другими столбцами

Думаю, это лучший ответ. Это мне действительно помогло. Какое-то время искал решение. Спасибо!

Kruno 25.11.2020 15:26

он работает, просто убедитесь, что вы правильно назвали свой класс css, например .mat-column-xxx, где xxx может чем угодно

downvoteit 20.06.2021 14:38

Вы легко можете это сделать. В каждом столбце вы получите класс с именем поля с префиксом mat-column, поэтому класс будет похож на mat-column-yourFieldName. Для этого вы можете установить стиль, как показано ниже

.mat-column-yourFieldName {
    flex: none;
    width: 100px;
}

Таким образом, мы можем указать фиксированную ширину столбца в соответствии с нашим требованием.

Надеюсь, это кому-то поможет.

У меня это сработало, спасибо. что, если бы я хотел избежать повторения flex: none; для каждого столбца? скажем, класс .mat-column-* { flex: none; }, который я пробовал, но это не сработало.

OJVM 02.09.2021 18:31

Просто нужно обновить ширину тега th.

th {
  width: 100px;
}

Это, безусловно, самый простой способ подать заявку, большое спасибо!

maxime1992 09.08.2021 18:38

Просто добавьте style = "width:5% !important;" в th и тд

  <ng-container matColumnDef = "username">
    <th style = "width:5% !important;" mat-header-cell *matHeaderCellDef> Full Name </th>
    <td style = "width:5% !important;" mat-cell *matCellDef = "let element"> {{element.username}} ( {{element.usertype}} )</td>
  </ng-container>

В !important нет необходимости.

Vahid 11.06.2021 10:08

Просто добавьте класс full-width-table в таблицу тегов.

например <table mat-table class = "full-width-table" [dataSource] = "dataSource">

Вы можете использовать атрибут fixedLayout = "true", например <table #table mat-table [dataSource] = "dataSource" fixedLayout = "true">

fixedLayout: использовать ли фиксированный макет таблицы. Включение этой опции обеспечит согласованную ширину столбцов и оптимизирует отображение липких стилей для собственных таблиц. Не работает для гибких столов.

введите описание изображения здесьI имел таблицу с четырьмя столбцами. Смотрите скриншот. В scss-файле я включил следующий код:

.full-width-table {
  width: 100%;
}
.mat-column-id {
  width: 15% !important;
}
.mat-column-question {
  width: 55% !important;
}
.mat-column-view {
  width: 15% !important;
}
.mat-column-reply {
  width: 15% !important;
}

Это ответ?

Sfili_81 30.06.2021 13:51

Это сработало для меня. Вы можете проверить прикрепленное изображение

abdullah-sust 30.06.2021 15:33

Это должно быть отмечено как ответ - не знаю, почему он не получает голосов.

AlanObject 08.07.2021 06:52

@AlanObject, потому что вы никогда не должны использовать! Important в стилях, это плохая практика

Dilyan Dimitrov 05.09.2021 23:34

Если вы хотите задать фиксированную ширину для определенного столбца, вы можете добавить fxFlex = "60px" как в mat-cell, так и в mat-header-cell.

Другие вопросы по теме