Сделайте ширину таблицы 100% с помощью остатка заполнения последнего столбца без сдавливания других столбцов. - PullRequest
21 голосов
/ 01 октября 2011

Можно ли создать таблицу (в которой будет динамически создаваемый текст), например:

ширина таблицы 100% экрана 5 столбцов последний столбец пуст () первые четыре столбца имеют текст, а их ширина является динамической последний столбец является остатком ширины без сжатия текста в первых четырех столбцах

Пока у меня есть это, и оно раздавливает текст, которого я стараюсь избегать:

<table style="width:100%;" border="1">
<tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four Five</td>
    <td>Four Five Six</td>
    <td style="width:100%;">&nbsp;</td>
</tr>
</table>

Я не могу использовать «пробел: сейчас», так как хочу, чтобы текст был перенесен, если текста достаточно.

Редактировать: «Я бы просто хотел, чтобы [первые четыре] столбца были шириной, которой они были бы, если бы я удалил атрибут ширины из тега таблицы. Но все равно таблица должна быть 100% ширины страницы. «

Есть идеи? Решения CSS предпочтительнее!

Ответы [ 11 ]

9 голосов
/ 17 июня 2014

Вы можете использовать flexbox для этого

CSS

table {
    width:100%;
    border: 1px solid black;
    border-collapse: collapse;
}
td + td {
    border-left: 1px solid black;
}
tr {
    display: flex;
    align-items: stretch;
}
td:last-child {
    flex: 1;
    background: yellow;
    display:inline-block;
    /* to keep IE happy */
}

FIDDLE (Изменить размер окна браузерачтобы увидеть это в действии)

table {
  width: 100%;
  border: 1px solid black;
  border-collapse: collapse;
}
td + td {
  border-left: 1px solid black;
}
td:last-child {
  background: yellow;
}
<table>
  <tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four FiveThree Four FiveThree Four FiveThree Four FiveThree Four Five</td>
    <td>Four Five Six</td>
    <td>&nbsp;f</td>
  </tr>
</table>

Примечание:

В IE 10-11 есть проблема, заключающаяся в том, что встроенные элементы (и, по-видимому, также и ячейки таблицы) не обрабатываются как flex-items.

Эта проблема задокументирована Филиппом Уолтоном здесь , и обходной путь (из приведенного выше поста):

Эту проблему можно избежать, добавивне встроенное значение отображения элементов, например, блока, встроенного блока, сгибания и т. д.


Кстати: следующее выглядит так же, как та же скрипка вышекак без использования flexbox - Обратите внимание, что последний td на самом деле не заполняет оставшееся пространство, а скорее занимает свое собственное естественное пространство - это то, что ОП НЕ хотело.
6 голосов
/ 16 июня 2014

Просто добавьте

table-layout: fixed; 

к вашему столу, и все готово.

Если ваши тексты в других столбцах не приводят к увеличению ширины таблицы на 100%, ваш последний столбец всегда будет растягиваться, поэтому нет необходимости применять ширину к

.
3 голосов
/ 10 мая 2015

Это то, что у меня сработало (в FireFox, Chrome и старой 12.x Opera). Мои таблицы, которые я хотел бы иметь ширину 100% и последний столбец для заполнения остальных, имеют класс tableList и вот CSS:

.tableList { width: 100%; }
.tableList td { width: 1px; } /* min width, actually: this causes the width to fit the content */
.tableList td:last-child { width: 100%; } /* well, it's less than 100% in the end, but this still works for me */

Ниже приведен фрагмент кода:

.tableList { width: 100%; }
.tableList td { width: 1px; } /* min width, actually: this causes the width to fit the content */
.tableList td:last-child { width: 100%; background-color: yellow; } /* well, it's less than 100% in the end, but this still works for me */
<table class="tableList">
  <tr><td>game's</td><td>not</td><td>over</td></tr>
  <tr><td>one</td><td>two</td><td>three and more</td></tr>
</table>

Как заметил Рахат, если содержимое столбца, отличного от первого, содержит более одного слова, оно становится многострочным (одна строка на слово):

.tableList { width: 100%; }
.tableList td { width: 1px; } /* min width, actually: this causes the width to fit the content */
.tableList td:last-child { width: 100%; background-color: yellow; } /* well, it's less than 100% in the end, but this still works for me */
<table class="tableList">
  <tr><td>game's</td><td>not</td><td>over</td></tr>
  <tr><td>one</td><td>two plus plus</td><td>three and more</td></tr>
</table>

но он также предложил обходной путь - добавив white-space: nowrap:

.tableList { width: 100%; }
.tableList td { width: 1px; white-space: nowrap; } /* min width, actually: this causes the width to fit the content */
.tableList td:last-child { width: 100%; background-color: yellow; } /* well, it's less than 100% in the end, but this still works for me */
<table class="tableList">
  <tr><td>game's</td><td>not</td><td>over</td></tr>
  <tr><td>one</td><td>two plus plus</td><td>three and more</td></tr>
</table>
0 голосов
/ 16 июля 2014

попробуйте, он будет занимать 100% ширины без сдавливания последнего столбца

<table style="width:100%" border=1>
  <tr style="visibility:hidden">
    <td width=20%></td>
    <td width=20%></td>
    <td width=20%></td>
    <td width=20%></td>
    <td width=20%></td>
  </tr>

  <tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four Five</td>
    <td>Four Five Six</td>
    <td></td>
  </tr>
</table>

оставьте пятую колонку пустой, и ширина будет разделена поровну

0 голосов
/ 15 июля 2014

попробуйте это ( Демо )

table {
    width:100%;   
    table-layout: fixed; 
}
td:last-child {
    background: yellow;
    width:200px;
    layout:
}


<table border="1">
<tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four FiveThree Four FiveThree Four FiveThree Four FiveThree Four Five</td>
    <td>Four Five Six</td>
    <td></td>
</tr>
</table>
0 голосов
/ 12 июля 2014

Попробуйте этот метод, может сработать для вас.

.myTable {
  width: 100%;
}
.myTable td:last-child {
  width: auto;
}
<table class="myTable" border="1">
  <tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four Five</td>
    <td>Four Five Six</td>
    <td>&nbsp;</td>
  </tr>
</table>

Или через CSS:

table {
  width: 100%;
}

table td:nth-child(-n+4) div
{
  min-width: 100px;
}
0 голосов
/ 11 июля 2014

Возможно, вместо того, чтобы установить последний столбец на 100%, установите его в автоматический режим?

<table style="width:100%;" border="1">
  <tr>
    <td>One Two Three</td>
    <td>Two Three Four</td>
    <td>Three Four Five</td>
    <td>Four Five Six</td>
    <td style="width:auto;">&nbsp;</td>
  </tr>
</table>
0 голосов
/ 29 мая 2014

Это зависит от имеющихся у вас технологий, но, возможно, вы могли бы попробовать

/* CSS3 method */
table {
   width: 100%;
}
table td:nth-child(-n+4) {
   min-width: 25%; /* Or set the minimum PX/Percent width */
}

/* CSS2 without nth-child selector */

table {
   width: 100%;
}
table td,
table td + td,
table td + td + td,
table td + td + td + td {
   min-width: 25% /* Or set the minimum PX/Percent width */
}       

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

Другим способом может быть что-то подобное, если вы можете поместить контент в свои таблицы.

/*Markup*/ 
<table width="100%" border="1">
   <tr>
      <td>
         <div>One</div>
      </td>
      <td>
         <div>Two</div>
      </td>
      <td>
         <div>Three</div>
      </td>
      <td>
         <div>Four</div>
      </td>
      <td>
         <div>Five</div>
      </td>
      <td>
         <div>&nbsp;</div>
      </td>
   </tr>
</table>


/* CSS3 method */

table {
   width: 100%;
}
table td:nth-child(-n+4) div {
   min-width: 100px;
}

/* CSS2 without nth-child selector */

table {
   width: 100%;
}
table td div,
table td + td div,
table td + td + td div,
table td + td + td + td div {
   min-width: 100px;
}   
0 голосов
/ 20 мая 2014

Я решил ту же проблему с помощью max-width = 99% для последнего столбца и присвоил фиксированные размеры другим столбцам.

<table style='width: 100%' border='1'>
  <tr>
    <td style='width:60px'><b>Label 1</b></td>
    <td style='width:120px;'><b>Label 2</b></td>
    <td style='max-width:99%;'><b>Label 3</b></td>
  </tr>
</table>
0 голосов
/ 10 апреля 2013

Да, это не так сложно, хотя иногда разные браузеры отображают это немного по-разному.Есть несколько способов сделать это, но это мой любимый.Первые строки - это просто список имен полей, а также установка ширины каждого столбца ... кроме последнего.

<table style='width: 100%' border='1'>
<tr>
 <td style='width:100px;'><b>Label 1</b></td>
 <td style='width:120px;'><b>Label 2</b></td>
 <td style='width:60px;'><b>Label 3</b></td>
 <td style='width:100px;'><b>Label 4</b></td>
 <td><b>Label 5</b></td>
</tr>

 <!-- insert dynamically generated rows -->

</table>

Я обнаружил, что это работает хорошо, особенно если вам нужен только один изполя будут занимать остаток.Все, что вам нужно сделать, это установить размеры полей, которые вам нужны, и оставить то, что вам не нужно.

Другой способ сделать это - определить классы CSS с определенной шириной, но это просто еще один способдействительно форматируем одну и ту же таблицу стилей!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...