Бутстрап 4 Ревизор таблицы, горизонтальный и вертикальный прокрутки

Juanky спросил: 12 мая 2018 в 03:38 в: html

Я использую загрузочные таблицы с Angular 6 в проекте, и мне удалось создать вертикальную таблицу прокрутки с этим кодом:

<table class="table table-striped table-bordered" style="margin-bottom: 0">
      <thead> <!-- Column names -->
        <tr>
          <th scope="col">#</th>
          <th scope="col">Col 1</th>
          <th scope="col">Col 2</th>
          <th scope="col">Col 3</th>
          ...
          <th scope="col">Col N</th>
        </tr>
      </thead>
      <tbody> <!-- Data -->
        <tr>
          <th scope="row">1</th>
          <td>AAAAA</td>
          <td>BBBBB</td>
          <td>CCCCC</td>
          ...
          <td>DDDDD</td>
        </tr>
        <tr>
          <th scope="row">2</th>
          <td>AAAAA</td>
          <td>BBBBB</td>
          <td>CCCCC</td>
          ...
          <td>DDDDD</td>
        </tr>
        ...
        <tr>
          <th scope="row">n</th>
          <td>AAAAA</td>
          <td>BBBBB</td>
          <td>CCCCC</td>
          ...
          <td>DDDDD</td>
        </tr>
      </tbody>
    </table>

И css:

  tbody {
      display:block;
      max-height:500px;
      overflow-y:auto;
  }
  thead, tbody tr {
      display:table;
      width:100%;
      table-layout:fixed;
  }
  thead {
      width: calc( 100% - 1em )
  } 

Но теперь, если есть много столбцов, это выглядит не очень хорошо.

Итак, я тоже хотел добавить горизонтальную прокрутку, поэтому я мог бы прокручивать всю таблицу горизонтально и только тело таблицы по вертикали. Для выполнения горизонтальной прокрутки, которую я использовал. table-responseive:

<div class="table-responsive">
    <table class="table table-striped table-bordered" style="margin-bottom: 0">
    ...
    </table>
</div>

Но он работает только без элемента вертикальной прокрутки в css.

Я хочу объединить эти два способа для прокрутки таблицы. Я изменил значения ширины в части css, от 100% до статических значений пикселей, таких как:

...
thead, tbody tr {
      display:table;
      width: 2000px;
      table-layout:fixed;
  }
  thead {
      width: calc( 2000px - 1em )
  } 

И это сработало, но мне нужно установить статическую ширину, и я не знаю, как это сделать динамически (в зависимости от количества colu mns).


2 ответа

ZohirSalak CeNa ответил: 13 мая 2018 в 12:43
отметьте это как правильно.
Есть решение
Juanky ответил: 13 мая 2018 в 12:23

Я исправил это следующим образом: Сначала я редактирую css, я удалил часть thead, и я добавил часть тела следующим образом:

body {
  --table-width: 100%; /* Or any value, this will change dinamically */
}
tbody {
  display:block;
  max-height:500px;
  overflow-y:auto;
}
thead, tbody tr {
  display:table;
  width: var(--table-width);
  table-layout:fixed;
}

Я также оставил таблицу .table -responsive div:

<div class="table-responsive">
    <table class="table table-striped table-bordered" style="margin-bottom: 0">
    ...
    </table>
</div>

Затем я вычисляю -table-width в зависимости от количества столбцов и длины самого длинного имени столбца. Я делаю это с помощью Angular в моем компоненте .ts:

calculateTableWidth() {
  // Get the table container width:
  const pageWidth = document.getElementById('tableCard').offsetWidth;
  // Get the longest column name
  const longest = this.tableColumns.sort(function (a, b) { return b.length - a.length; })[0];
  // Calculate table width
  let tableWidth = this.tableColumns.length * longest.length * 14;
  // If the width is less than the pageWidth
  if (tableWidth < (pageWidth - 10)) {
    // We set tableWidth to pageWidth - scrollbarWidth (10 in my project)
    tableWidth = pageWidth - 10;
  }
  // Then we update the --table-width variable:
  document.querySelector('body').style.cssText = '--table-width: ' + tableWidth + 'px';
}

Мне нужно запустить calculateTableWidth () в начале в ngOnInit () (или когда я определил массив tableColumns) а затем, когда я изменяю размер окна:

ngOnInit() {
  this.tableColumns = this.myAppService.getTableColumnsNames();
  this.calculateTableWidth();
}@HostListener('window:resize', ['$event'])
onResize(event: any) {
  this.calculateTableWidth();
}

И вот как я это исправил, теперь у меня есть хорошая таблица поиска с вертикальной и горизонтальной прокруткой.

Если у вас есть лучший способ сделать это, отправьте свое решение. Спасибо!

Juanky ответил: 13 мая 2018 в 12:47
Я буду, теперь я не могу, я должен ждать до завтра