CSS-комірка таблиці однакової ширини


148

У мене є невизначена кількість елементів комірок таблиці всередині контейнера таблиці.

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

Чи існує чистий CSS спосіб отримати комірки таблиці рівними по ширині, навіть якщо в них вміст різного розміру?

Дякую.

Редагувати: Максимальна ширина означає, що я думаю, скільки у вас є комірок?


Як визначається кількість стовпців: клієнтська чи серверна сторони?
Ямбріансвіт

Після того, як я спробував кілька методів, я думаю, якщо ви хочете мати кілька рядків і хочете, щоб вони були однакової ширини, використовуйте flexbox замість таблиці
Ерік

Відповіді:


299

Ось робоча загадка з невизначеною кількістю комірок: http://jsfiddle.net/r9yrM/1/

Ви можете зафіксувати ширину для кожного з батьків div( таблиці ), інакше це буде 100%, як зазвичай.

Хитрість полягає у використанні table-layout: fixed;та деякій ширині кожної комірки для її запуску, тут 2%. Це призведе до іншої алгоритми таблиці, тієї, де браузери дуже намагаються дотримуватися вказаних розмірів.
Перевірте Chrome (і IE8 - якщо потрібно). З останнім Safari все гаразд, але я не можу згадати сумісність цього фокусу з ними.

CSS (відповідні інструкції):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

EDIT (2013): Остерігайтеся Safari 6 в OS X, він має table-layout: fixed; помилку (або, можливо, просто інший, сильно відрізняється від інших браузерів. Я не перечитав макет таблиці таблиць CSS2.1 REC;)). Будьте готові до різних результатів.


1
Дякую, це здається відповіддю. Я не знаю чому, але якщо я встановив ширину на 2%, він фактично видаляє кожен стовпчик на 2%. Але 100%, здається, працює чудово. Будь-яка ідея, що там відбувається?
Гаррі

3
Я зіткнувся з тією ж проблемою, що потрібно використовувати 100% ширину на стільниках таблиці. Це сталося через чіткий виправлення, застосований до батьківського елемента з display: table. Оскільки комірки зі 100% шириною не працюють в IE8, для мене виправлення було видалити очищення. Сподіваємось, це комусь допомагає.
Алекс Барретт

Щоб розширити цю проблему, це працює для простих макетів (1x1, 2x2, 3x3 тощо), але для складних макетів (1x3x1, 1x2x3x4 тощо) потрібні додаткові divs, display:tableщоб вони використовувались так, як ніби вони були рядками, а не display:tabl-rowяк деякі могли очікувати. Приклад тут .
filoxo

2
100% ширина не працювала на IE8 (здивування), але початкова пропозиція на 2% дає правильні результати.

1
100% ширина також не працювала в IE10. Він зробив роботу в IE11. І 1% -на ширина, зроблена Mobile Safari, демонструє надто вузькі колонки. Тож я в кінцевому підсумку використовував CSS-хак, орієнтований на IE9 та IE10: Злом .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }CSS звідси: stackoverflow.com/a/24321386/6962
Henrik N

29

HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

DEMO.


Тут не працює загадка. У клітинах завжди 25%.
netAction

Це рішення не дуже масштабоване для нічого динамічного, наприклад, навігації по сайту, керованої клієнтом.
Ерік К

Напевно, ви праві і btw, це майже два роки anser @QuantumDynamix. Маєте щось краще на увазі? Чому б просто не поділитися своєю ідеєю, нехай світ знає кращі речі :-)
Альфа

15

Просто використання max-width: 0в display: table-cellелементі працювало для мене:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>


1
Тут просто закидають, але 0pxце не є дійсною одиницею. Це просто повинно бути 0.
Гевін

Це працювало для мене, але ви могли б пояснити, як це працює?
Еммануал

6

Замініть

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

з

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

Подивіться на всі проблеми, які намагаються змусити діви виконуватись як таблиці. Вони повинні були додати table-xxx, щоб імітувати макети таблиць

Таблиці підтримуються і працюють дуже добре у всіх браузерах. Навіщо їх ровити? той факт, що вони повинні були імітувати, це доказ того, що вони зробили свою справу і добре.

На мою думку, використовуйте найкращий інструмент для роботи, і якщо ви хочете табличні дані або щось, що нагадує табличні таблиці, просто працюйте.

Дуже пізня відповідь, яку я знаю, але яку варто озвучити.


2
+1 тому, що це працює і тому, що CSS все ще працює, у 2014 році це не робиться правильно у всіх браузерах.
Юк

6
Іноді потрібно мати табличний макет для речей, які не є табличними даними. наприклад , елементи навігації , які слід використовувати <nav>, <ul>і т.д.
Бен

1
Для чуйності ідеально мати розкладку на основі діва. Відображення таблиць у мобільних пристроях - це біль у дупі.
Пабло Рінкон

Намагання наслідувати таблицю виключає чуйний дизайн. Я згоден, якщо ви хочете чуйний дизайн, столи - це не вибір.
DeveloperChris

2
Таблиці були створені для відображення табличних даних: це було, і це будуть HTML-елементи, які використовуються для відображення табличних даних, чому б хто-небудь викидав їх (з цією метою)? Макет таблиці не імітується : він вже деякий час є частиною рекомендації CSS2, і трапляється, що розташування таблиць HTML за замовчуванням є display: table-etc(цілком природно). Я не витрачаю своїх днів на створення посилань, що імітують діви чи диви, що імітують таблиці, прольоти чи входи: я просто використовую CSS для стилізації. Нарешті, удачі з IE9 для застосування будь-якого іншого значення displayвластивості до елементів таблиці, tr, td.
FelipeAls

1

це спрацює для всіх

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

Це також буде працювати для даних таблиць, створених ітерацією


0

Ось вам:

http://jsfiddle.net/damsarabi/gwAdA/

Ви не можете використовувати ширину: 100 пікселів, оскільки дисплей є стільниковою коміркою. Однак ви можете використовувати Max-width: 100px. то ваша коробка ніколи не набере більше 100 пікс. але вам потрібно додати переповнення: приховано, щоб переконатися, що конкурент не кровоточить в інші клітини. Ви також можете додати пробіл: spacerap, якщо хочете утримати висоту від збільшення.


0

Це можна зробити, встановивши стиль стільника комірки на width: autoта вміст порожнім. Стовпці тепер однакові, але вміст не містить.

Щоб вставити вміст у комірку, додайте divcss:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

Також потрібно додати position: relativeдо комірок.

Тепер ви можете розмістити фактичний вміст у розказаному діві вище.

https://jsfiddle.net/vensdvvb/

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