CSS-ячейка таблицы равной ширины


148

У меня есть неопределенное количество элементов ячейки таблицы внутри контейнера таблицы.

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

Есть ли чистый способ CSS сделать ячейки таблицы равными по ширине, даже если в них есть контент разного размера?

Спасибо.

Изменить: Наличие максимальной ширины повлечет за собой знание того, сколько ячеек у вас есть, я думаю?


Как определяется количество столбцов: на стороне клиента или сервера?
iambriansreed

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

Ответы:


299

Вот рабочая скрипка с неопределенным количеством ячеек: http://jsfiddle.net/r9yrM/1/

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

Хитрость заключается в том, чтобы использовать table-layout: fixed;и некоторую ширину каждой ячейки, чтобы вызвать ее, здесь 2%. Это вызовет другую таблицу algorightm, в которой браузеры очень стараются соблюдать указанные размеры.
Пожалуйста, проверьте с 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 */
}

РЕДАКТИРОВАТЬ (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

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

Вероятно, вы правы и, кстати, это почти два года назад @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>

Посмотрите на все проблемы, связанные с попытками заставить div работать как таблицы. Они должны были добавить table-xxx, чтобы имитировать расположение таблиц

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

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

Очень поздний ответ, я знаю, но озвучивать стоит.


2
+1, потому что это работает, и потому что CSS все еще, в 2014 году не делает это правильно во всех браузерах.
гадость

6
Иногда вам нужен табличный макет для вещей, которые не являются табличными данными. например , элементы навигации , которые следует использовать <nav>, <ul>и т.д.
Бен

1
Для отзывчивого идеала иметь макет на основе div. Отображение таблиц в мобильных устройствах - это боль в заднице.
Пабло Ринкон

Попытка эмулировать таблицу исключает адаптивный дизайн. Я согласен, если вы хотите адаптивный дизайн, таблицы не являются выбором.
DeveloperChris

2
Таблицы были созданы для отображения табличных данных: были, есть и будут элементы HTML, которые будут использоваться для отображения табличных данных, зачем кому-то отказываться от них (для этой цели)? Макет таблицы не подражает : он уже некоторое время является частью рекомендации CSS2, и бывает, что макет таблиц HTML по умолчанию таков display: table-etc(вполне естественно). Я не трачу свои дни на создание ссылок, имитирующих div или div, имитирующих таблицы, span-ы или входные данные: я просто использую 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/

Вы не можете использовать width: 100px, потому что дисплей - ячейка таблицы. Однако вы можете использовать Max-width: 100px. тогда ваша коробка никогда не станет больше, чем 100px. но вам нужно добавить переполнение: скрытый, чтобы контекст не кровоточил в другие ячейки. Вы также можете добавить пробел: nowrap, если вы хотите, чтобы высота не увеличивалась.


0

Это можно сделать, установив стиль ячейки таблицы в значение width: auto, и содержимое будет пустым. Столбцы теперь равны по ширине, но не содержат содержимого.

Чтобы вставить содержимое в ячейку, добавьте с divпомощью css:

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

Вы также должны добавить position: relativeв ячейки.

Теперь вы можете поместить фактический контент в div, о котором говорилось выше.

https://jsfiddle.net/vensdvvb/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.