Высота ячейки растяжного стола IE8 - PullRequest
7 голосов
/ 14 мая 2011

У меня есть макет страницы, основанный на таблицах, и сколько бы я ни хотел перестроить его с помощью более современной разметки, это не вариант.Макет использует ячейку, которая занимает две строки в качестве боковой панели с правой стороны, в то время как верхняя левая ячейка содержит простой заголовок, а нижняя левая ячейка содержит основное содержимое страницы.Верхняя левая ячейка имеет фиксированную высоту, а высота нижней и правой ячейки не указана.Я создал упрощенный пример, который иллюстрирует мою проблему:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<style type="text/css">
.fixed { height: 100px; }

table { border: 1px solid #000; }
td { border: 1px solid #ddd; vertical-align: top; }
tr { border: 1px solid #cfc; }
* { padding: 15px; }
</style>
</head>
<body>

<table>
<tr class="fixed">
<td>left</td><td rowspan="2"><div style="height: 500px;">right</div></td>
</tr>

<tr class="stretch">
<td>left</td>
</tr>

<tr class="footer">
<td colspan="2">footer</td>
</tr>

</table>

</body>
</html>

Я установил высоту правого столбца в строке на 500 пикселей, чтобы имитировать содержимое, которое выше высоты двух левых столбцов.Это ведет себя так, как и ожидалось в современных браузерах: высота верхней левой ячейки остается фиксированной, а нижняя ячейка растягивается, чтобы заполнить дополнительное пространство.Но в IE8 обе левые ячейки растянуты по вертикали.Мне нужна верхняя ячейка, чтобы сохранить ее фиксированную высоту.Как заставить IE8 соблюдать высоту, указанную для верхней левой ячейки, используя только CSS?

Редактировать: Вместо того, чтобы устанавливать высоту в правом столбце td, я устанавливаю высоту наdiv внутри правого столбца.

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Я думаю, что Jeroen прав, что нет простых решений CSS для этой проблемы. Каждый раз, когда в таблице есть ячейки с установленным rowspan, IE будет игнорировать любые явные высоты, установленные в этих строках. Решение состоит в том, чтобы никогда не использовать rowspan. В моей ситуации я смог обойти проблему, поместив содержимое, занимающее две строки во второй строке, оставив пустую ячейку в первой строке, и используя отрицательное поле для перемещения начала содержимого вверх в первую строку. , Я надеюсь, что это полезно для кого-то еще. Если у кого-то есть чистое решение CSS, я приму это в качестве ответа.

2 голосов
/ 14 мая 2011

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

<td style="min-height: 500px;">left</td>

Надеюсь, это поможет.

PS.IE9 имел ту же проблему.

1 голос
/ 24 ноября 2011

Даже если ячейка содержит только изображение, вы должны знать, что их высота вычисляется в соответствии с положением базовой линии text ;и текущий стиль текста влияет на вычисление этой базовой позиции и межстрочного интервала после нее.Вы можете подумать, что установки «line-height: 1» было бы достаточно, чтобы избежать такого межстрочного интервала, то есть пропуска полей, который всегда происходит ниже каждой строки текста.Этого недостаточно.Самое простое решение - установить " line-height: 0.8 " (или ниже) для ячейки, содержащей изображение, так, чтобы по умолчанию на 0,2em добавлялся пробел ниже базовой линии (который по-прежнему выводится по умолчанию из-заотсутствие текста) приведет к подгонке базовой линии по высоте ячейки.Затем вы можете правильно разместить изображение (или любой элемент с фиксированной высотой) в ячейке, высота которой будет определять высоту ячейки, не растягивая высоту ячейки.

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

Протестировано в Google Chrome (текущая версия 15)

Пример (HTML5):

<!DOCTYPE html>
<html><head>
  <title>Examples of image transforms (rotations and mirroring)</title>
  <style>
  table,tbody,tr,td,image{margin:0;border:1px solid #999;border-collapse:collapse;border-spacing:0;background:#FFF;color:#000;padding:0;vertical-align:middle;text-align:center;}
  td.z{line-height:0;}
  </style>
</head><body>
  <table border="0" cellspacing="0" cellpadding="0">
  <tbody><tr>
    <td style="border-bottom:hidden">Normal 0° (1,0,0,1,0,0)</td>
    <td style="border-bottom:hidden">Mirrored 0° (-1,0,0,1,0,0)</td>
    <td style="border-bottom:hidden">Mirrored 90° (0,1,1,0,0,0)</td>
    <td style="border-bottom:hidden">Normal &minus;90° (0,1,-1,0,0,0)</td>
  </tr><tr>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(1,0,0,1,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(-1,0,0,1,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(0,1,1,0,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(0,1,-1,0,0,0);"/></td>
  </tr><tr>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(1,0,0,-1,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(-1,0,0,-1,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(0,-1,1,0,0,0);"/></td>
    <td class="z"><image alt="" src="Avatar-220px.jpg" style="-webkit-transform:matrix(0,-1,-1,0,0,0);"/></td>
  </tr><tr>
    <td style="border-top:hidden">Mirrored 180° (1,0,0,-1,0,0)</td>
    <td style="border-top:hidden">Normal 180° (-1,0,0,-1,0,0)</td>
    <td style="border-top:hidden">Normal 90° (0,-1,1,0,0,0)</td>
    <td style="border-top:hidden">Mirrored &minus;90° (0,-1,-1,0,0,0)</td>
  </tr></tbody>
  </table>
</body></html>

Обратите внимание на трюк с классом «z» для ячеек таблицы (line-height: 0), содержащих только изображение, чтобы они точно соответствовали размеру изображения.Изображения, показанные в этом примере, представляют собой небольшую квадратную фотографию в 8 различных ориентациях.Существует только тонкая серая граница 1px, заключающая каждую фотографию, и ее метка, отображаемая выше или ниже, фотографии вписываются точно в границы ячейки.

Обратите внимание, что при переориентации используются стили WebKit (для Safari и Chrome);вы можете добавить эквивалентные свойства для IE и Firefox, изменив префикс;для CSS3 префикс не понадобится.Если не эти преобразования не поддерживаются, изображения не будут переориентированы / зеркально отражены, но они все равно будут точно соответствовать ячейке без дополнительных внутренних пробелов.

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