HTML-таблиця зі 100% шириною, з вертикальною прокруткою всередині тіло


423

Як я можу встановити на <table>100% ширину і розмістити лише всередині <tbody>вертикальної прокрутки деяку висоту?

вертикальна прокрутка всередині корпусу

table {
    width: 100%;
    display:block;
}
thead {
    display: inline-block;
    width: 100%;
    height: 20px;
}
tbody {
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}
  
<table>
  <thead>
    <tr>
    	<th>Head 1</th>
    	<th>Head 2</th>
    	<th>Head 3</th>
    	<th>Head 4</th>
    	<th>Head 5</th>
    </tr>
  </thead>
  <tbody>
    <tr>
    	<td>Content 1</td>
    	<td>Content 2</td>
    	<td>Content 3</td>
    	<td>Content 4</td>
    	<td>Content 5</td>
    </tr>
  </tbody>
</table>

Я хочу уникати додавання якихось додаткових div, все, що я хочу, - це проста таблиця на кшталт цієї, і коли я намагаюся змінити дисплей table-layout, positionта багато іншого в таблиці CSS не працює добре зі 100% шириною лише з фіксованою шириною в px.


я не дуже впевнений, чого ви хочете досягти. подивіться на це: jsfiddle.net/CrSpu і скажіть, як ви хочете, щоб він поводився
x4rf41

2
я знаю, але дивлюся .. й і td не відображаються повної ширини .. postimg.org/image/mgd630y61
Marko S


Відповіді:


674

Для того, щоб зробити <tbody>елемент прокручуваним, нам потрібно змінити спосіб відображення на сторінці, тобто використовувати display: block;для відображення цього як елемента рівня блоку.

Оскільки ми змінюємо displayвластивість tbody, ми повинні також змінити це властивість для theadелемента, щоб не порушити макет таблиці.

Отже, у нас є:

thead, tbody { display: block; }

tbody {
    height: 100px;       /* Just for the demo          */
    overflow-y: auto;    /* Trigger vertical scroll    */
    overflow-x: hidden;  /* Hide the horizontal scroll */
}

Веб-браузери відображають елементи theadта tbodyелементи як групи рядків ( table-header-groupта table-row-group) за замовчуванням.

Як тільки ми це змінимо, внутрішні trелементи не заповнять весь простір їх контейнера.

Для того, щоб виправити це, ми повинні обчислити ширину tbodyстовпців і застосувати відповідне значення до theadстовпців через JavaScript.

Автоматичні ширини стовпців

Ось версія jQuery з вищезгаданої логіки:

// Change the selector if needed
var $table = $('table'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
    return $(this).width();
}).get();

// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
    $(v).width(colWidth[i]);
});    

А ось вихід (для Windows 7 Chrome 32) :

вертикальна прокрутка всередині корпусу

РОБОТА ДЕМО .

Таблиця повної ширини, стовпчики відносної ширини

У міру необхідності оригінального плаката ми можемо розгорнути tableдо 100% widthйого контейнера, а потім використовувати відносний ( відсоток ) widthдля кожного стовпця таблиці.

table {
    width: 100%; /* Optional */
}

tbody td, thead th {
    width: 20%;  /* Optional */
}

Оскільки таблиця має (свого роду) макет рідини , ми повинні регулювати ширину theadстовпців, коли контейнер змінює розмір.

Отже, ми повинні встановити ширину стовпців після зміни розміру вікна:

// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
    /* Same as before */ 
}).resize(); // Trigger the resize handler once the script runs

Вихід буде:

Таблиця рідини з вертикальним прокруткою всередині корпусу

РОБОТА ДЕМО .


Підтримка браузера та альтернативи

Я протестував два вищевказані методи в Windows 7 за допомогою нових версій основних веб-браузерів (включаючи IE10 +), і це спрацювало.

Однак він не працює належним чином на IE9 та нижче.

Це тому, що в макеті таблиці всі елементи повинні відповідати однаковим структурним властивостям.

Використовуючи display: block;для елементів <thead>та <tbody>елементів, ми порушили структуру таблиці.

Редизайн макета через JavaScript

Один із підходів - переробити макет (цілого) таблиці. Використання JavaScript для створення нового макета на льоту та ручці та / або динамічного регулювання ширини / висоти комірок.

Наприклад, подивіться на наступні приклади:

Столи для вкладання

Цей підхід використовує дві вкладені таблиці, що містять div. У першій tableє лише одна комірка, яка має "а" div, а друга таблиця розміщується всередині цього divелемента.

Перевірте таблиці вертикальної прокрутки на CSS Play .

Це працює в більшості веб-браузерів. Ми також можемо виконувати описану вище логіку динамічно через JavaScript.

Таблиця з фіксованим заголовком на прокруті

З метою додавання вертикальної смуги прокрутки до <tbody>відображає таблиці заголовка у верхній частині кожного рядка, ми могли б розташувати на theadелемент , щоб залишитися fixedу верхній частині екрану замість.

Ось робоча демонстрація цього підходу, виконана Жульєном .
Він має перспективну підтримку веб-браузера.

А ось чистий CSS реалізація на Willem Van Bockstal .


Чисте рішення CSS

Ось стара відповідь. Звичайно, я додав новий метод і вдосконалив декларації CSS.

Таблиця з фіксованою шириною

У цьому випадку tableслід мати фіксований width (включаючи суму ширини стовпців та ширину вертикальної смуги прокрутки) .

Кожен стовпець повинен мати конкретну ширину , і останній рядок з theadелементів потребує більшої ширини , яка дорівнює до інших ширина + ширина вертикальної смуги прокрутки.

Отже, CSS буде таким:

table {
    width: 716px; /* 140px * 5 column + 16px scrollbar width */
    border-spacing: 0;
}

tbody, thead tr { display: block; }

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 140px;
}

thead th:last-child {
    width: 156px; /* 140px + 16px scrollbar width */
}

Ось вихід:

Таблиця з фіксованою шириною

РОБОТА ДЕМО .

Таблиця зі 100% шириною

У цьому підході tableширина має 100%і для кожного, thі tdвартість widthмайна повинна бути меншою, ніж 100% / number of cols.

Крім того , нам потрібно , щоб зменшити ширину від , theadяк значення ширини вертикальної смуги прокрутки.

Для цього нам потрібно використовувати calc()функцію CSS3 наступним чином:

table {
    width: 100%;
    border-spacing: 0;
}

thead, tbody, tr, th, td { display: block; }

thead tr {
    /* fallback */
    width: 97%;
    /* minus scroll bar width */
    width: -webkit-calc(100% - 16px);
    width:    -moz-calc(100% - 16px);
    width:         calc(100% - 16px);
}

tr:after {  /* clearing float */
    content: ' ';
    display: block;
    visibility: hidden;
    clear: both;
}

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 19%;  /* 19% is less than (100% / 5 cols) = 20% */
    float: left;
}

Ось онлайн демонстрація .

Примітка. Цей підхід не вдасться, якщо вміст кожного стовпця порушує рядок, тобто вміст кожної комірки повинен бути достатньо коротким .


Далі наведено два простих приклади чистого CSS-рішення, які я створив під час відповіді на це запитання.

Ось jsFiddle Demo v2 .

Стара версія: jsFiddle Demo v1


17
З display: blockвами властивості розкритої таблиці як ширина стовпця, поділена між тедом та tbody. Я знаю, що ви виправили це, встановивши, width: 19.2%але якщо ми не знаємо завчасно ширину кожного стовпця, це не спрацює.
самб

10
Здається, цей код передбачає, що клітини тіла завжди будуть ширшими, ніж комірки заголовка.
Адам Донахю

2
Не працює, коли height: 100%(коли ви хочете, щоб таблиця розгорнулася в нижній частині сторінки).
АлікЕльзін-кілака

2
Це також фантастично працює з ng-repeatтаблицями AngularJS . Не впевнений, чому існують усі ці бібліотеки із фіксованими заголовками таблиць, а що ні, коли є це рішення.
чакеда

2
Ви можете трохи покращити це за допомогою box-sizingвластивості, щоб рамки двох різної товщини не скидали вирівнювання стовпця.
Рікка

89

У наступному рішенні таблиця займає 100% батьківського контейнера, не потрібні абсолютні розміри. Це чистий CSS, використовується гнучкий макет.

Ось як це виглядає: введіть тут опис зображення

Можливі недоліки:

  • вертикальна смуга прокрутки завжди видно незалежно від того, потрібна вона;
  • макет таблиці виправлений - стовпці не змінюють розмір відповідно до ширини вмісту (ви все одно можете встановити будь-яку ширину стовпця, яку ви явно хочете);
  • є один абсолютний розмір - ширина смуги прокрутки, що становить приблизно 0,9ем для браузерів, які я зміг перевірити.

HTML (скорочений):

<div class="table-container">
    <table>
        <thead>
            <tr>
                <th>head1</th>
                <th>head2</th>
                <th>head3</th>
                <th>head4</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            ...
        </tbody>
    </table>
</div>

CSS, дещо прикрас пропущено для наочності:

.table-container {
    height: 10em;
}
table {
    display: flex;
    flex-flow: column;
    height: 100%;
    width: 100%;
}
table thead {
    /* head takes the height it requires, 
    and it's not scaled when table is resized */
    flex: 0 0 auto;
    width: calc(100% - 0.9em);
}
table tbody {
    /* body takes all the remaining available space */
    flex: 1 1 auto;
    display: block;
    overflow-y: scroll;
}
table tbody tr {
    width: 100%;
}
table thead, table tbody tr {
    display: table;
    table-layout: fixed;
}

повний код на jsfiddle

Той самий код у МЕНШЕ, щоб ви могли його змішати:

.table-scrollable() {
  @scrollbar-width: 0.9em;
  display: flex;
  flex-flow: column;

  thead,
  tbody tr {
    display: table;
    table-layout: fixed;
  }

  thead {
    flex: 0 0 auto;
    width: ~"calc(100% - @{scrollbar-width})";
  }

  tbody {
    display: block;
    flex: 1 1 auto;
    overflow-y: scroll;

    tr {
      width: 100%;
    }
  }
}

2
Дякую за рішення! Виникла незначна помилка .... ви двічі встановили ширину для thead, і я виявив, що віднімання 1,05ем від ширини виходить трохи краще: jsfiddle.net/xuvsncr2/170
TigerBear

1
як щодо змістового числа символів? вона псується, додаючи більше символів чи слів у клітинки ряду рядків
Limon

Я думаю, що встановити підходящу політику для обгортання td повинно допомогти
tsayen

Будь-яке подібне рішення, але не потребує 100% ширини?
Олександр Перейра Нунес

2
@tsayen Як ви можете зупинити його накручування та перекриття під час зміни розміру вікна?
clearshot66

31

У сучасних браузерах ви можете просто використовувати css:

th {
  position: sticky;
  top: 0;
  z-index: 2;
}

8
Цей заклик є неповним ... Бажаєте розмістити приклад або хоча б детально?
Ліам

працює добре, але стосується лише го. Якщо ми встановимо позицію липкою на thead, вона не працює.
Вішал

Виправлена ​​теда повинна додати W3C!
sonichy

2
Ця відповідь працює , коли ви обернути <table>з <div>якої має overflow-y: auto;і деякі max-height. Наприклад:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Мінпраця

Станом на 2020 рік, це буде обрана відповідь (разом із оновленням @Minwork)
Крістоф Відал

18

Я використовую display:blockдля theadі tbody. Через це ширина theadстовпців відрізняється від ширини tbodyстовпців.

table {
    margin:0 auto; 
    border-collapse:collapse;
}
thead {
    background:#CCCCCC;
    display:block
}
tbody {
    height:10em;overflow-y:scroll;
    display:block
}

Щоб виправити це, я використовую невеликий jQueryкод, але це можна зробити JavaScriptлише.

var colNumber=3 //number of table columns    

for (var i=0; i<colNumber; i++) {
  var thWidth=$("#myTable").find("th:eq("+i+")").width();
  var tdWidth=$("#myTable").find("td:eq("+i+")").width();      
  if (thWidth<tdWidth)                    
      $("#myTable").find("th:eq("+i+")").width(tdWidth);
  else
      $("#myTable").find("td:eq("+i+")").width(thWidth);           
}  

Ось моя робоча демонстрація: http://jsfiddle.net/gavroche/N7LEF/

Не працює в IE 8


Це найкраще / найпростіше рішення, яке я знайшов, яке дозволяє не фіксувати ширину стовпців (наприклад, управління .NET DataGrid). Для "виробництва" colNumberзмінна може бути замінена кодом, який повторюється через фактичні комірки, знайдені замість цього, і зауважте, що вона не справляється правильно, якщо є які colspan(може також бути покращена в коді, якщо це необхідно, але малоймовірно за типом таблиця, ймовірно, захоче цю функцію прокрутки).
JonBrave

Це працює (модно), але не справляється, коли розмір вікна менший за таблицю (оскільки він ігнорує ширину смуги прокрутки).
Пройшов кодування

Так, заголовок і комірки більше не збігаються, якщо ширина таблиці обмежується заданою шириною
Крейг,

найкраща відповідь і тут, найпростіша
Чарльз Окваагву

18

Тільки CSS

для браузерів Chrome, Firefox, Edge (та інших вічнозелених веб-переглядачів)

Просто position: sticky; top: 0;ваші thелементи:

/* Fix table head */
.tableFixHead    { overflow-y: auto; height: 100px; }
.tableFixHead th { position: sticky; top: 0; }

/* Just common table stuff. */
table  { border-collapse: collapse; width: 100%; }
th, td { padding: 8px 16px; }
th     { background:#eee; }
<div class="tableFixHead">
  <table>
    <thead>
      <tr><th>TH 1</th><th>TH 2</th></tr>
    </thead>
    <tbody>
      <tr><td>A1</td><td>A2</td></tr>
      <tr><td>B1</td><td>B2</td></tr>
      <tr><td>C1</td><td>C2</td></tr>
      <tr><td>D1</td><td>D2</td></tr>
      <tr><td>E1</td><td>E2</td></tr>
    </tbody>
  </table>
</div>

PS: якщо вам потрібні рамки для TH-елементів, th {box-shadow: 1px 1px 0 #000; border-top: 0;}це допоможе (оскільки межі за замовчуванням не зображені правильно на прокрутці).

Для варіанту вищезазначеного, який використовує лише трохи JS для пристосування до IE11, дивіться цю відповідь https://stackoverflow.com/a/47923622/383904


Якщо у вас є рамки для елементів, використання "межа-колапс: колапс" приклеїть межу до тіла, а не до заголовка. Щоб уникнути цієї проблеми, слід скористатися "межа-крах: окремо". Див stackoverflow.com/a/53559396
mrod

@mrod під час використання separateви додаєте олію у вогонь. jsfiddle.net/RokoCB/o0zL4xyw і знайдіть рішення ТУТ: додайте межі до фіксованого TH - я вітаю пропозиції OFC, якщо я щось пропустив.
Roko C. Buljan

11

Створіть дві таблиці одна за одною, поставте другу таблицю у діву фіксованої висоти та встановіть властивість переповнення на автоматичне. Крім того, залиште порожнім все тед-коду у другій таблиці.

<div>
    <table>
        <thead>
            <tr>
                <th>Head 1</th>
                <th>Head 2</th>
                <th>Head 3</th>
                <th>Head 4</th>
                <th>Head 5</th>
            </tr>
        </thead>
    </table>
</div>

<div style="max-height:500px;overflow:auto;">
    <table>
        <thead>
            <tr>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        <tr>
            <td>Content 1</td>
            <td>Content 2</td>
            <td>Content 3</td>
            <td>Content 4</td>
            <td>Content 5</td>
        </tr>
        </tbody>
    </table>    
</div>

8
У цьому випадку стовпці другої таблиці не можуть відповідати ширині першої таблиці.
kat1330

2
Не добре! Ви втрачаєте синхронізацію ширини для стовпців у двох таблицях.
Зафар

1
для завершення цього рішення нам потрібно додати сценарій @Hashem Qolami ( описати вище ) для синхронізації ширини стовпців заголовка
Elhay Avichzer

6

Я зрозумів це, нарешті, з чистим CSS, дотримуючись цих інструкцій:

http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

Перший крок - встановити <tbody>показ дисплея: блокувати, щоб можна було застосувати перелив і висоту. Звідси рядки, які <thead>потрібно встановити в положення: відносні та відображення: блокуйте так, щоб вони сиділи вгорі над прокручуваною зараз <tbody>.

tbody, thead { display: block; overflow-y: auto; }

Оскільки <thead>відносно розміщена, кожна комірка таблиці потребує явної ширини

td:nth-child(1), th:nth-child(1) { width: 100px; }
td:nth-child(2), th:nth-child(2) { width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

Але, на жаль, цього недостатньо. При наявності смуги прокрутки браузери виділяють для неї простір, отже, в <tbody>кінці є менше місця, ніж у <thead>. Зверніть увагу на незначну нерівність, що це створює ...

Єдине рішення, яке я міг придумати, - це встановити мінімальну ширину для всіх стовпців, крім останньої.

td:nth-child(1), th:nth-child(1) { min-width: 100px; }
td:nth-child(2), th:nth-child(2) { min-width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

Приклад цілого кодексу нижче:

CSS:

.fixed_headers {
  width: 750px;
  table-layout: fixed;
  border-collapse: collapse;
}
.fixed_headers th {
  text-decoration: underline;
}
.fixed_headers th,
.fixed_headers td {
  padding: 5px;
  text-align: left;
}
.fixed_headers td:nth-child(1),
.fixed_headers th:nth-child(1) {
  min-width: 200px;
}
.fixed_headers td:nth-child(2),
.fixed_headers th:nth-child(2) {
  min-width: 200px;
}
.fixed_headers td:nth-child(3),
.fixed_headers th:nth-child(3) {
  width: 350px;
}
.fixed_headers thead {
  background-color: #333333;
  color: #fdfdfd;
}
.fixed_headers thead tr {
  display: block;
  position: relative;
}
.fixed_headers tbody {
  display: block;
  overflow: auto;
  width: 100%;
  height: 300px;
}
.fixed_headers tbody tr:nth-child(even) {
  background-color: #dddddd;
}
.old_ie_wrapper {
  height: 300px;
  width: 750px;
  overflow-x: hidden;
  overflow-y: auto;
}
.old_ie_wrapper tbody {
  height: auto;
}

Html:

<!-- IE < 10 does not like giving a tbody a height.  The workaround here applies the scrolling to a wrapped <div>. -->
<!--[if lte IE 9]>
<div class="old_ie_wrapper">
<!--<![endif]-->

<table class="fixed_headers">
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Plum</td>
      <td>Purple</td>
      <td>These are Purple</td>
    </tr>
    <tr>
      <td>Watermelon</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Tomato</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cherry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cantelope</td>
      <td>Orange</td>
      <td>These are orange inside.</td>
    </tr>
    <tr>
      <td>Honeydew</td>
      <td>Green</td>
      <td>These are green inside.</td>
    </tr>
    <tr>
      <td>Papaya</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Raspberry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Blueberry</td>
      <td>Blue</td>
      <td>These are blue.</td>
    </tr>
    <tr>
      <td>Mango</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Passion Fruit</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

<!--[if lte IE 9]>
</div>
<!--<![endif]-->

EDIT: Альтернативне рішення для ширини столу 100% (вище насправді призначено для фіксованої ширини і не відповіло на питання):

HTML:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  text-align: left;
  min-width: 610px;
}
tr {
  height: 30px;
  padding-top: 10px
}
tbody { 
  height: 150px; 
  overflow-y: auto;
  overflow-x: hidden;
}
th,td,tr,thead,tbody { display: block; }
td,th { float: left; }
td:nth-child(1),
th:nth-child(1) {
  width: 20%;
}
td:nth-child(2),
th:nth-child(2) {
  width: 20%;
  float: left;
}
td:nth-child(3),
th:nth-child(3) {
  width: 59%;
  float: left;
}
/* some colors */
thead {
  background-color: #333333;
  color: #fdfdfd;
}
table tbody tr:nth-child(even) {
  background-color: #dddddd;
}

Демо: http://codepen.io/anon/pen/bNJeLO


1
Питання спеціально вимагало таблиці на 100% ширини. Це єдине, на що ви не згадували приклад .
Пройшов кодування

@TrueBlueAussie Хороший улов: D Додано альтернативне рішення для 100% ширини.
Mikael Lepistö

ви не вважаєте довготою вмісту рядків комірок
Limon

2

Css вирішення для примушування стовпців до правильного відображення з тілом 'block'

Це рішення все ще вимагає thобчислення та встановлення ширини jQuery

table.scroll tbody,
table.scroll thead { display: block; }

table.scroll tbody {
    overflow-y: auto;
    overflow-x: hidden;
    max-height: 300px;
}

table.scroll tr {
    display: flex;
}

table.scroll tr > td {
    flex-grow: 1;
    flex-basis: 0;
}

І Jquery / Javascript

var $table = $('#the_table_element'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

$table.addClass('scroll');

// Adjust the width of thead cells when window resizes
$(window).resize(function () {

    // Get the tbody columns width array
    colWidth = $bodyCells.map(function () {
        return $(this).width();
    }).get();

    // Set the width of thead columns
    $table.find('thead tr').children().each(function (i, v) {
        $(v).width(colWidth[i]);
    });

}).resize(); // Trigger resize handler

@Craig в 2019 році, це зовсім чудово, щоб взагалі не перейматися IE.
Automagisch

2

спробуйте нижче підхід, дуже простий у виконанні

Нижче посилання на jsfiddle

http://jsfiddle.net/v2t2k8ke/2/

HTML:

<table border='1' id='tbl_cnt'>
<thead><tr></tr></thead><tbody></tbody>

CSS:

 #tbl_cnt{
 border-collapse: collapse; width: 100%;word-break:break-all;
 }
 #tbl_cnt thead, #tbl_cnt tbody{
 display: block;
 }
 #tbl_cnt thead tr{
 background-color: #8C8787; text-align: center;width:100%;display:block;
 }
 #tbl_cnt tbody {
 height: 100px;overflow-y: auto;overflow-x: hidden;
 }

Jquery:

 var data = [
    {
    "status":"moving","vehno":"tr544","loc":"bng","dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che", "dri":"ttt"
    },{    "status":"idle","vehno":"yy5499999999999994","loc":"bng","dri":"ttt"
    },{
    "status":"moving","vehno":"tr544","loc":"bng", "dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che","dri":"ttt"
    },{
    "status":"idle","vehno":"yy544","loc":"bng","dri":"ttt"
    }
    ];
   var sth = '';
   $.each(data[0], function (key, value) {
     sth += '<td>' + key + '</td>';
   });
   var stb = '';        
   $.each(data, function (key, value) {
       stb += '<tr>';
       $.each(value, function (key, value) {
       stb += '<td>' + value + '</td>';
       });
       stb += '</tr>';
    });
      $('#tbl_cnt thead tr').append(sth);
      $('#tbl_cnt tbody').append(stb);
      setTimeout(function () {
      var col_cnt=0 
      $.each(data[0], function (key, value) {col_cnt++;});    
      $('#tbl_cnt thead tr').css('width', ($("#tbl_cnt tbody") [0].scrollWidth)+ 'px');
      $('#tbl_cnt thead tr td,#tbl_cnt tbody tr td').css('width',  ($('#tbl_cnt thead tr ').width()/Number(col_cnt)) + 'px');}, 100)

2
Це рішення не справляється з тим, що вікно вужче ширини столу. Це повинно включати горизонтальну прокрутку, коли це відбувається. Також заголовки не точно узгоджуються з комірками даних (Chrome).
Пройшов кодування


2

Додавання фіксованої ширини тд, й після внесення TBODY & THEAD блок дисплея працює відмінно , а також ми можемо використовувати slimscroll плагін , щоб зробити смугу прокрутки красиво.

введіть тут опис зображення

<!DOCTYPE html>
<html>

<head>
    <title> Scrollable table </title>
    <style>
        body {
            font-family: sans-serif;
            font-size: 0.9em;
        }
        table {
            border-collapse: collapse;
            border-bottom: 1px solid #ddd;
        }
        thead {
            background-color: #333;
            color: #fff;
        }
        thead,tbody {
            display: block;
        }
        th,td {
            padding: 8px 10px;
            border: 1px solid #ddd;
            width: 117px;
            box-sizing: border-box;
        }
        tbody {
            height: 160px;
            overflow-y: scroll
        }
    </style>
</head>

<body>

    <table class="example-table">
        <thead>
            <tr>
                <th> Header 1 </th>
                <th> Header 2 </th>
                <th> Header 3 </th>
                <th> Header 4 </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td> Row 1- Col 1 </td>
                <td> Row 1- Col 2 </td>
                <td> Row 1- Col 3 </td>
                <td> Row 1- Col 4 </td>
            </tr>
            <tr>
                <td> Row 2- Col 1 </td>
                <td> Row 2- Col 2 </td>
                <td> Row 2- Col 3 </td>
                <td> Row 2- Col 4 </td>
            </tr>
            <tr>
                <td> Row 3- Col 1 </td>
                <td> Row 3- Col 2 </td>
                <td> Row 3- Col 3 </td>
                <td> Row 3- Col 4 </td>
            </tr>
            <tr>
                <td> Row 4- Col 1 </td>
                <td> Row 4- Col 2 </td>
                <td> Row 4- Col 3 </td>
                <td> Row 4- Col 4 </td>
            </tr>
            <tr>
                <td> Row 5- Col 1 </td>
                <td> Row 5- Col 2 </td>
                <td> Row 5- Col 3 </td>
                <td> Row 5- Col 4 </td>
            </tr>
            <tr>
                <td> Row 6- Col 1 </td>
                <td> Row 6- Col 2 </td>
                <td> Row 6- Col 3 </td>
                <td> Row 6- Col 4 </td>
            </tr>
            <tr>
                <td> Row 7- Col 1 </td>
                <td> Row 7- Col 2 </td>
                <td> Row 7- Col 3 </td>
                <td> Row 7- Col 4 </td>
            </tr>
            <tr>
                <td> Row 8- Col 1 </td>
                <td> Row 8- Col 2 </td>
                <td> Row 8- Col 3 </td>
                <td> Row 8- Col 4 </td>
            </tr>
            <tr>
                <td> Row 9- Col 1 </td>
                <td> Row 9- Col 2 </td>
                <td> Row 9- Col 3 </td>
                <td> Row 9- Col 4 </td>
            </tr>
            <tr>
                <td> Row 10- Col 1 </td>
                <td> Row 10- Col 2 </td>
                <td> Row 10- Col 3 </td>
                <td> Row 10- Col 4 </td>
            </tr>
            <tr>
                <td> Row 11- Col 1 </td>
                <td> Row 11- Col 2 </td>
                <td> Row 11- Col 3 </td>
                <td> Row 11- Col 4 </td>
            </tr>
            <tr>
                <td> Row 12- Col 1 </td>
                <td> Row 12- Col 2 </td>
                <td> Row 12- Col 3 </td>
                <td> Row 12- Col 4 </td>
            </tr>
            <tr>
                <td> Row 13- Col 1 </td>
                <td> Row 13- Col 2 </td>
                <td> Row 13- Col 3 </td>
                <td> Row 13- Col 4 </td>
            </tr>
            <tr>
                <td> Row 14- Col 1 </td>
                <td> Row 14- Col 2 </td>
                <td> Row 14- Col 3 </td>
                <td> Row 14- Col 4 </td>
            </tr>
            <tr>
                <td> Row 15- Col 1 </td>
                <td> Row 15- Col 2 </td>
                <td> Row 15- Col 3 </td>
                <td> Row 15- Col 4 </td>
            </tr>
            <tr>
                <td> Row 16- Col 1 </td>
                <td> Row 16- Col 2 </td>
                <td> Row 16- Col 3 </td>
                <td> Row 16- Col 4 </td>
            </tr>
        </tbody>
    </table>


    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script>
    <script>
        $('.example-table tbody').slimscroll({
            height: '160px',
            alwaysVisible: true,
            color: '#333'
        })
    </script>
</body>

</html>


1

Це код, який працює для мене, щоб створити клейку теду на столі з прокручуваним тілом:

table ,tr td{
    border:1px solid red
}
tbody {
    display:block;
    height:50px;
    overflow:auto;
}
thead, tbody tr {
    display:table;
    width:100%;
    table-layout:fixed;/* even columns width , fix width of table too*/
}
thead {
    width: calc( 100% - 1em )/* scrollbar is average 1em/16px width, remove it from thead width */
}
table {
    width:400px;
}

1

Для використання "overflow: scroll" ви повинні встановити "display: block" на thead та tbody. І це псує ширину стовпців між ними. Але тоді ви можете клонувати рядок thead за допомогою Javascript і вставити його в tbody як прихований рядок, щоб зберегти точну ширину колонки.

$('.myTable thead > tr').clone().appendTo('.myTable tbody').addClass('hidden-to-set-col-widths');

http://jsfiddle.net/Julesezaar/mup0c5hk/

<table class="myTable">
    <thead>
        <tr>
            <td>Problem</td>
            <td>Solution</td>
            <td>blah</td>
            <td>derp</td>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<p>
  Some text to here
</p>

Css:

table {
  background-color: #aaa;
  width: 100%;
}

thead,
tbody {
  display: block; // Necessary to use overflow: scroll
}

tbody {
  background-color: #ddd;
  height: 150px;
  overflow-y: scroll;
}

tbody tr.hidden-to-set-col-widths,
tbody tr.hidden-to-set-col-widths td {
  visibility: hidden;
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
}

td {
  padding: 3px 10px;
}

0

Спробуйте цю jsfiddle . Для цього використовується jQuery і зроблена з відповіді Hashem Qolami. Спочатку складіть звичайну таблицю, потім зробіть її прокручуваною.

const makeScrollableTable = function (tableSelector, tbodyHeight) {
  let $table = $(tableSelector);
  let $bodyCells = $table.find('tbody tr:first').children();
  let $headCells = $table.find('thead tr:first').children();
  let headColWidth = 0;
  let bodyColWidth = 0;

  headColWidth = $headCells.map(function () {
    return $(this).outerWidth();
  }).get();
  bodyColWidth = $bodyCells.map(function () {
    return $(this).outerWidth();
  }).get();

  $table.find('thead tr').children().each(function (i, v) {
    $(v).css("width", headColWidth[i]+"px");
    $(v).css("min-width", headColWidth[i]+"px");
    $(v).css("max-width", headColWidth[i]+"px");
  });
  $table.find('tbody tr').children().each(function (i, v) {
    $(v).css("width", bodyColWidth[i]+"px");
    $(v).css("min-width", bodyColWidth[i]+"px");
    $(v).css("max-width", bodyColWidth[i]+"px");
  });

  $table.find('thead').css("display", "block");
  $table.find('tbody').css("display", "block");

  $table.find('tbody').css("height", tbodyHeight+"px");
  $table.find('tbody').css("overflow-y", "auto");
  $table.find('tbody').css("overflow-x", "hidden");

};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.