Ваша проблема автоматическое расположение таблиц . Браузеру сложно просмотреть все ячейки и определить, какую ширину они получат от своего контента; это двойная сложность, когда есть кольспаны (особенно в этом примере, где нет никакого способа определить, насколько широкими должны быть столбцы 3 и 4); и это тройной труд, когда вы бедный старый трудолюбивый Internet Explorer, благослови.
Не заставляйте браузер бороться, хрипеть и рендерить медленно: используйте fixed
table-layout
и точно объявляйте ширину каждого столбца. Обычно это делается с <col>
элементами:
#thing { width: 950px; table-layout: fixed; border-spacing: 0; }
#thing .wide { width: 295px; }
#thing .narrow { width: 180px; }
#thing.box { border: solid black 1px; }
<table id="thing">
<col class="narrow" /><col class="wide" /><col class="wide" /><col class="narrow" />
<tr>
<td colspan="1"><div class="box">1</div></td>
<td colspan="3"><div class="box">2</div></td>
</tr>
<tr>
<td colspan="4"><div class="box">3</div></td>
</tr>
<tr>
<td colspan="2"><div class="box">4</div></td>
<td colspan="2"><div class="box">5</div></td>
</tr>
</table>
Однако в Webkit есть ошибка, которая игнорирует ширину <col>
, когда в этом столбце нет ни одной незаполненной ячейки. Это довольно необычно для таблиц, но это имеет место в приведенном выше примере: только первый столбец содержит нераспределенную ячейку. Чтобы обойти это, вы можете либо заменить элементы <col>
на пустую строку в начале, стилизованную так, чтобы иметь минимальную высоту:
#thing .cols td { height: 1px; line-height: 1px; font-size: 1px; }
<tr class="cols">
<td class="narrow"></td><td class="wide"></td><td class="wide"></td><td class="narrow"></td>
</tr>
Или, иногда менее навязчиво, оставьте <col>
s и добавьте пустую строку внизу:
<tr class="cols"><td></td><td></td><td></td><td></td></tr>