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


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.