Установить постоянную ширины столбца таблицы независимо от количества текста в ее ячейках?

535

В моей таблице я установил ширину первой ячейки в столбце 100px.
Однако когда текст в одной из ячеек в этом столбце слишком длинный, ширина столбца становится больше, чем 100px. Как я могу отключить это расширение?

Миша Морошко
источник
5
stackoverflow.com/questions/1258416/word-wrap-in-a-html-table может помочь указать вам правильное направление
Джастин
2
В моем случае произошло не расширение, а наоборот: нежелательное сжатие ширины, несмотря на мое явное объявление ширины. Смешной!
Чаба Тот
Единственное правильное решение - использовать colgroup с cols и установить ширину cols.
MightyPork
table-layout:fixed;такое решение
emfi

Ответы:

607

Я немного поиграл с этим, потому что мне было трудно понять это.

Вы должны установить ширину ячейки (либо thили tdработал, я установил оба) и установить table-layoutв fixed. По некоторым причинам ширина ячейки, кажется, остается неизменной, только если ширина таблицы тоже установлена ​​(я думаю, что это глупо, но все же).

Также полезно установить overflowсвойство так, чтобы hiddenлюбой дополнительный текст не выходил из таблицы.

Вы также должны оставить все границы и размеры для CSS.

Итак, вот что у меня есть:

table {
  border: 1px solid black;
  table-layout: fixed;
  width: 200px;
}

th,
td {
  border: 1px solid black;
  width: 100px;
  overflow: hidden;
}
<table>
  <tr>
    <th>header 1</th>
    <th>header 234567895678657</th>
  </tr>
  <tr>
    <td>data asdfasdfasdfasdfasdf</td>
    <td>data 2</td>
  </tr>
</table>

Вот это в JSFiddle

У этого парня была похожая проблема: ширина ячейки таблицы - фиксирование ширины, перенос / усечение длинных слов

ptpaterson
источник
77
Важно отметить следующее: «Браузер будет устанавливать ширину столбцов на основе ширины ячеек в первом ряду таблицы», из stackoverflow.com/questions/570154/…
daniloquio
12
Это работает, когда ширина таблицы не фиксирована. jsfiddle.net/lavinski/CGCFW/3 Вам просто нужен динамический ряд, чтобы занять оставшееся пространство.
Даниэль Литтл
2
@DanielLittle или вы можете установить ширину таблицы в 1px; с overflow: visibleдля таблиц динамического размера, до тех пор , пока размер ячеек фиксирован и перелив виден , что не имеет значение , если размер самой таблицы больше или меньше , чем фактические клетки.
Ман
Что вы могли бы сделать, если ваш тд имеет "ширина = 30%;"
71GA
Пожалуйста, добавьте переполнение: hidden @ RokoC.Buljan
Алекс Гранде
178

Смотрите: http://www.html5-tutorials.org/tables/changing-column-width/

После тега таблицы используйте элемент col. вам не нужен закрывающий тег.

Например, если у вас было три столбца:

<table>
  <colgroup>
    <col style="width:40%">
    <col style="width:30%">
    <col style="width:30%">
  </colgroup>  
  <tbody>
    ...
  </tbody>
</table>
Hyathin
источник
26
Эта! Это ответ HTML5, и он безумно работает без необходимости прыгать через глупые обручи. Кроме того, вы можете использовать <col class = "someClassName"> вместо этого, чтобы сохранить ширину в CSS и не загрязнять ваш HTML информацией о стиле.
Джон Мюнш,
2
@ Сэм, возможно, у вас возникли другие проблемы, такие как CSS, встроенный стиль или неправильный тип документа и т. Д. Это определенно работает, это стандартный способ установки стилей столбцов.
Самер Алибхай
Я не уверен, что это «путь HTML5» вообще. Похоже, что colgroup / col в html5 действительно используется только для маркировки промежутков. MDN не упоминает об использовании атрибута style в тегах col (кроме того, что он наследует его от глобальных атрибутов) и говорит только о bgcolor: «... использовать свойство CSS ... в соответствующих элементах <td>». developer.mozilla.org/en-US/docs/Web/HTML/Element/col .
Стивен Панцер
5
Работал для меня со стилем таблицы table-layout: fixed; width: 100%;. Спасибо!
Nrodic
Это не конец / окончательно, но w3schools также не упоминает использование colдля этого. Он предлагает использовать CSS для <td>(или <th>) - w3schools.com/tags/att_td_width.asp
Дон Чидл
128

Просто добавьте <div>тег внутрь <td>или <th>определите ширину внутри <div>. Это поможет вам. Больше ничего не работает.

например.

<td><div style="width: 50px" >...............</div></td>
Kasun
источник
2
Я объединил это решение с указанием min-width / max-width для той же ширины пикселей, чтобы быть на безопасной стороне. Наконец-то это работает. Я не знаю, почему я должен запустить все эти дополнительные раунды, просто чтобы это было действительно исправлено, смешно ...
Чаба Тот
1
Неуверенный , как это лучше , чем установка того же CSS style="width: 50px"на<td>
Дон Чидл
2
@mmcrae Это лучше, потому что это работает, а установка ширины <td>- нет.
Madbreaks
66

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

scrrr
источник
Это работало для меня, когда установка ширины явно с table-layout: fixed;не.
Джордан Мак
Ебена мать! Ни одно из других решений не работало или не было слишком неуклюжим! Это сработало отлично! Див тоже не требуется!
NeilRoy
29

Вам нужно написать это внутри соответствующего CSS

table-layout:fixed;
Винот Кумар
источник
лучше сортировать таблицу с тегами div, тогда внутри div использовать переполнение: auto
vinoth kumar
Сработало для меня, когда я объединил его с группами столбцов: <table style = "table-layout: fixed"> <colgroup> <col style = "width: 50%"> <col style = "width: 50%"> </ COLGROUP> <TBODY> ... </ TBODY> </ table>.
Расс Бейтман
Эта статья Криса Койера объясняет это хорошо: css-tricks.com/fixing-tables-long-strings
cssyphus
24

Что я делаю это:

  1. Установите ширину тд:

    <td width="200" height="50"><!--blaBlaBla Contents here--></td>
  2. Установите ширину td с помощью CSS:

    <td style="width:200px; height:50px;">
  3. Установите ширину снова как max и min с помощью CSS:

    <td style="max-width:200px; min-width:200px; max-height:50px; min-height:50px; width:200px; height:50px;">

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

.td_size {    
  width:200px; 
  height:50px;
  max-width:200px;
  min-width:200px; 
  max-height:50px; 
  min-height:50px;
  **overflow:hidden;** /*(Optional)This might be useful for some overflow contents*/   
}

тогда:

<td class="td_size">

Поместите атрибут класса в любое место <td>.

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

Я использовал это

.app_downloads_table tr td:first-child {
    width: 75%;
}

.app_downloads_table tr td:last-child {
    text-align: center;
}
Святослав Маринов
источник
Не забудьте ntch-child (2) (или 3, 4 и т. Д.)
таблица td nth-child (n + 1) {...} охватит все, кроме первого столбца
Эд Рэндалл,
2

Если вы не хотите фиксированный макет, укажите класс для размера столбца соответственно.

CSS:

.special_column { width: 120px; }

HTML:

<td class="special_column">...</td>
mcdado
источник
2

Помогает также вставить последнюю "ячейку-заполнитель" с шириной: авто . Это займет оставшееся пространство и оставит все другие размеры, как указано.

Митя Густин
источник
2

Сделайте так, чтобы принятый ответ отвечал для маленьких экранов, когда они меньше фиксированной ширины

HTML:

<table>
  <tr>
    <th>header 1</th>
    <th>header 234567895678657</th>
  </tr>
  <tr>
    <td>data asdfasdfasdfasdfasdf</td>
    <td>data 2</td>
  </tr>
</table>

CSS

table{
    border: 1px solid black;
    table-layout: fixed;
    max-width: 600px;
    width: 100%;
}

th, td {
    border: 1px solid black;
    overflow: hidden;
    max-width: 300px;
    width: 100%;
}

JS Fiddle

https://jsfiddle.net/w9s3ebzt/

Вилли Ричардсон
источник
2

Установка этого:

style="min-width:100px;" 

Работал на меня.

Приянка Арора
источник
1

KAsun имеет правильную идею. Вот правильный код ...

<style type="text/css">
  th.first-col > div, 
  td.first-col > div {
    overflow:hidden;
    white-space:nowrap;
    width:100px
  }
</style>

<table>
  <thead><tr><th class="first-col"><div>really long header</div></th></tr></thead>
  <tbody><tr><td class="first-col"><div>really long text</div></td></tr></tbody>
</table>
Аарон Аверилл
источник
1

Согласно моему ответу здесь , также возможно использовать заголовок таблицы (который может быть пустым) и применять относительную ширину для каждой ячейки заголовка таблицы. Ширина всех ячеек в теле таблицы будет соответствовать ширине заголовка их столбца. Пример:

HTML

<table>
  <thead>
    <tr>
      <th width="5%"></th>
      <th width="70%"></th>
      <th width="15%"></th>
      <th width="10%"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Some text...</td>
      <td>May 2018</td>
      <td>Edit</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Another text...</td>
      <td>April 2018</td>
      <td>Edit</td>
    </tr>
  </tbody>
</table>

CSS

table {
  width: 600px;
  border-collapse: collapse;
}

td {
  border: 1px solid #999999;
}

Посмотреть результат

В качестве альтернативы используйте colgroupкак предложено в ответе Hyathin.

eicksl
источник
0

Я использую элемент :: after в ячейке, где я хочу установить минимальную ширину независимо от присутствующего текста, например:

.cell::after {
    content: "";
    width: 20px;
    display: block;
}

Мне не нужно устанавливать ширину на родительском столе или использовать макет таблицы.

Дэн Макак
источник
-4

Я нашел, что ответ KAsun работает лучше, используя vw вместо px, вот так:

<td><div style="width: 10vw" >...............</div></td>

Это был единственный стиль, который мне нужен, чтобы настроить ширину столбца.

user3229980
источник
-5

Вам не нужно устанавливать "fixed"- все, что вам нужно, это установить, overflow:hiddenтак как ширина столбца установлена.

Владимир Хала
источник
3
Который будет скрывать контент за границами ячеек, не очень хорошая идея.
Mystrdat