Colspan messes с таблицей с фиксированной шириной

Я хочу таблицу с фиксированной шириной с 1 маленьким и двумя большими столбцами:

|..|....|....|
|..|....|....|
|..|....|....|

используя

td.small { width: 20% }
td.large { width: 40% }

Затем я хочу добавить дополнительный большой col с colspan = 2, подобный

|.......|....|
|..|....|....|
|..|....|....|

используя

td.small { width: 20% }
td.large { width: 40% }
td.extralarge { width: 60% } /* 20+40=60 */

Но я продолжаю:

|.......|....|
|...|...|....|
|...|...|....|

Более графический пример находится на jsbin

js-bin screenshot

** изменить **

Извините, я пропустил одну деталь: Я должен использовать (или так я думаю..?) table-layout: fixed, так как у меня есть некоторые особые переполняющие свойства ячеек:

td {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}

Обновлен jsbin, найденный здесь.

Ответы

Ответ 1

Вы также можете использовать colgroup и col, чтобы установить ширину:

<table>
    <colgroup>
        <col class="short" />
        <col span="2" class="long" />
    </colgroup>
    <tr>
        <td>Short</td>
        <td>Long long long long</td>
        <td>Long long long long</td>
    </tr>
    <tr>
        <td>Short</td>
        <td>Long long long long</td>
        <td>Long long long long</td>
    </tr>
    <tr>
        <td>Short</td>
        <td>Long long long long</td>
        <td>Long long long long</td>
    </tr>
</table>

С этим CSS:

table { width: 100%; }
.short {
    background: lightblue;
    width: 20%
}
.long {
    background: lightgreen;
    width: 40%;
}
.multiCells { background: #F3A633; }

Таким образом, вам не нужно давать каждому td класс, это упрощает, когда вы хотите изменить имя класса.

Демонстрация JSFiddle

Colgroup MDN Статья

Ответ 2

измените таблицу-макет: зафиксировано на авто

table {
  table-layout: auto;
}

Найдите рабочую демонстрацию здесь: http://jsbin.com/atohug/2/edit

Ответ 3

LinkinTED предоставил работоспособное решение, но этот пример напрямую не решает проблему OP и не объясняет, почему он работает. Пример должен выглядеть следующим образом (заимствуя тот же синтаксис)

<table>
    <colgroup>
        <col class="short" />
        <col span="2" class="long" />
    </colgroup>
    <tr>
        <td colspan=2>Extra long content</td>
        <td>Long long long long</td>
    </tr>
    <tr>
        <td>Short</td>
        <td>Long long long long</td>
        <td>Long long long long</td>
    </tr>
</table>

Проблема OP заключалась в том, что при использовании макета таблицы: исправлено, таблица ожидает, что каждая ширина ячейки будет четко определена в первой строке, поэтому ей не нужно изменять размер столбцов, поскольку в последующие ячейки добавляется больше содержимого строк. Однако, если вы используете colspan = 2 в первой строке, он не имеет представления о ширине этих двух ячеек, поэтому по умолчанию он составляет 50% их общей ширины, и это решение является фиксированным для остальной части таблицы. Используя colgroup и указав ширину для каждого столбца, таблица может фиксировать ширину столбцов заранее, и вы можете использовать colspan = 2 (или более) в первой строке.

Одно предостережение. col width = поддерживает только пиксели и%. Если вам нужно использовать другие единицы измерения ширины, свяжите col со стилем, как указано выше.

Ответ 4

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

<table>
<tr class="hidden-row">
    <td>Short</td>
    <td>Long long long long</td>
    <td>Long long long long</td>
</tr>
<tr>
    <td colspan=2>Extra long content</td>
    <td>Long long long long</td>
</tr>
<tr>
    <td>Short</td>
    <td>Long long long long</td>
    <td>Long long long long</td>
</tr>

tr.hidden-row td {
    height: 0;
}