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


175

Многие люди до сих пор используют таблицы для разметки элементов управления, данных и т. Д. Одним из примеров этого является популярная jqGrid. Тем не менее, происходит какое-то волшебство, которое я не могу понять (его таблицы для громкого крика, сколько магии может быть?)

Как можно установить ширину столбца таблицы и подчиниться ей так, как это делает jqGrid !? Если я попытаюсь повторить это, даже если я установлю каждый <td style='width: 20px'>, как только содержимое одной из этих ячеек станет больше 20 пикселей, ячейка расширится!

Есть идеи или идеи?

Ответы:


249

Вы можете попробовать использовать <col>теги управления стилем таблицы для всех строк, но вам нужно будет установить table-layout:fixedстиль для <table>класса css или таблиц и установить overflowстиль для ячеек.

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col

<table class="fixed">
    <col width="20px" />
    <col width="30px" />
    <col width="40px" />
    <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
    </tr>
</table>

и это будет ваш CSS

table.fixed { table-layout:fixed; }
table.fixed td { overflow: hidden; }

15
col не будет работать в html5, вместо этого установите ширину отдельного td встроенными классами css или css
Pankaj Phartiyal

10
Принятый ответ не работает, если вы явно не примените ширину для желаемой таблицы. Работает отлично, используете ли вы единицу или процент. Подумал, что я укажу на это, поскольку ответ @ totymedli не набрал ни одного голоса, и я не хотел, чтобы пользователи игнорировали его. Тем не менее, предложение прерывания слова не является необходимым, если только это не то, к чему вы стремитесь.
thebdawk05

Что происходит, когда у вас есть строки только с одним элементом TD, который охватывает несколько столбцов? Используя ваш пример кода, если бы у вас было <TD colspan="3">подряд, было бы 90px?
sab669

Спасибо, это помогло. Для перекрытия данных добавьте это table.fixed td { word-wrap: break-word; }.
Параг Тяги

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

101

Теперь в HTML5 / CSS3 у нас есть лучшее решение проблемы. На мой взгляд, это чисто CSS решение рекомендуется:

table.fixed {table-layout:fixed; width:90px;}/*Setting the table width is important!*/
table.fixed td {overflow:hidden;}/*Hide text outside the cell.*/
table.fixed td:nth-of-type(1) {width:20px;}/*Setting the width of column 1.*/
table.fixed td:nth-of-type(2) {width:30px;}/*Setting the width of column 2.*/
table.fixed td:nth-of-type(3) {width:40px;}/*Setting the width of column 3.*/
<table class="fixed">
    <tr>
        <td>Veryverylongtext</td>
        <td>Actuallythistextismuchlongeeeeeer</td>
        <td>We should use spaces tooooooooooooo</td>
    </tr>
</table>

Вам нужно накрыть стол widthдаже в решении преследователя . Иначе это не сработает.
Кроме того, новая функция , которая CSS3 VSync предложил это: word-break:break-all;. Это также разбивает слова без пробелов на несколько строк. Просто измените код следующим образом:

table.fixed { table-layout:fixed; width:90px; word-break:break-all;}

Конечный результат

Представленный стол


Если вы добавите строку с colspan, это, кажется, нарушит это решение. Любые предложения о том, как использовать это решение с таблицей, которая содержит colspan> 1?
Эрик К

@QuantumDynamix Я исправил это, добавив в качестве первой строки строку без colspans, только все отдельные столбцы с шириной. Затем я спрятал эту строку с 0 высотой, границей: нет, видимостью: скрытой, отступами: 0px и т. Д., Затем вторая строка - первая, которую я хочу видеть, где есть colspans. Первый ряд с отдельными ячейками фиксированной ширины устанавливает ширину.
AaronLS

@totymedli Любые идеи, как заставить мою таблицу взять сумму всех моих столбцов ширины? Моя таблица генерируется динамически, и я не могу заранее рассчитать ширину таблицы, но я не хочу использовать 100%, потому что это растягивает некоторые элементы.
AaronLS

14
table td 
{
  table-layout:fixed;
  width:20px;
  overflow:hidden;
  word-wrap:break-word;
}

9
Вы уверены, что можете использовать table-layoutэлемент td?
Ник

@ Ник - все работает хорошо. Однако мне нужно добавить свойство min-width и max-width (то же значение, что и width), и тогда оно станет действительно фиксированной шириной.
Денис Хай

11

У меня была одна длинная таблица ячеек td, это заставило стол к краям браузера и выглядело ужасно. Я просто хотел, чтобы этот столбец был только фиксированного размера и разбивал слова, когда он достигал указанной ширины. Так что это хорошо сработало для меня:

<td><div style='width: 150px;'>Text to break here</div></td>

Вам не нужно указывать какой-либо стиль таблицы, tr элементов. Вы также можете использовать переполнение: скрытый; как подсказывают другие ответы, но это приводит к исчезновению лишнего текста.


2
Или вы можете использовать максимальную ширину вместо ширины, где это необходимо. Это позволит вам не нарушать текст, если вы не достигнете своего предела ширины. И ячейка таблицы не будет иметь пустого пространства, если ваш текст меньше указанной ширины. <td> <div style = 'max-width: 150px;'> Текст для разрыва здесь </ div> </ td>
Tarik


0

для таблицы ширины FULLSCREEN:

  • ширина стола ДОЛЖНА быть 100%

  • если нужно N столбцов, то это должно быть N + 1

пример для 3 столбцов:

table.fixed {
      table-layout: fixed;
      width: 100%;
    }
    table.fixed td {
      overflow: hidden;
    }
  <table class="fixed">
      <col width=20 />
      <col width=20 />
      <col width=20 />
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>FREE</th>
    </tr>
    <tr>
      <td>text111111111</td>
      <td>text222222222</td>
      <td>text3333333</td>
    </tr>
  </table>


-2
table
{
  table-layout:fixed;
}
td,th
{
  width:20px; 
  word-wrap:break-word;
}

: first-child ...: nth-child (1) или ...

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