DIV-ная таблица

Сразу оговорюсь, что я категорически против изготовления таблиц с помощью DIV. Но возникла необходимость разместить некий текст в двух-трех колонках, которые вели бы себя на экране как ячейки таблицы. При этом, отступить от принципа позволил тот факт, что эта часть кода все-таки больше относится к разметке, чем к представлению табличных данных. От применения свойства float или абсолютного позиционирования пришлось также отказаться по некоторым причинам, освещать их здесь нет смысла, просто нельзя и все. В этом примере я использовал стандартные CSS-свойства и хроническое нежелание адекватного восприятия связки HTML+CSS браузером Internet Explorer (5-6 версий).

Итак, сперва HTML-код:


<div class="cellsBlock">
  <div class="cellLeft">
    <h2>Ячейка 1</h2>
    <p>текст первой ячейки</p>
  </div>
  <div class="cellMiddle">
    <h2>Ячейка 2</h2>
    <p>текст второй ячейки</p>
  </div>
  <div class="cellRight">
    <h2>Ячейка 3</h2>
    <p>текст третьей ячейки</p>
  </div>
</div>

Для наглядности я сразу сделаю все блоки разноцветными, вот что получилось:

Ячейка 1

текст первой ячейки

Ячейка 2

текст второй ячейки

Ячейка 3

текст третьей ячейки

Немного рассуждений о браузерах, CSS, doctype

Если бы создатели Internet Explorer сделали свой браузер чуточку толковее, все обошлось бы еще проще. CSS-свойства display вполне достаточно для того, чтобы изменить внешний вид и поведение HTML-элемента. Но на пути возникает несколько трудностей. Первая трудность заключается в том, что IE до 6-й версии так и не понимает display: table-cell, как впрочем и display: table. Следующая: в очередной раз подтвердилась зависимость отрисовки в Internet Explorer одного и того же HTML+CSS кода от объявленного DOCTYPE. Как известно, он служит для браузера переключателем режима отрисовки страницы. Наиболее заметны результаты такого переключения в Internet Explorer.

Теперь CSS, doctype и результат


.cellsBlock {
  width: 100%;
  display: table;
}
.cellLeft, .cellMiddle, .cellRight {
  display: table-cell !important;
  display: inline; /* для IE */
}
.cellLeft, .cellRight {
  width:35%;
}
.cellMiddle {
  width:30%;
}

Показанные далее примеры различаются только наличием/отсутствием doctype и xml-объявления перед ним. Тип документа: XHTML 1.1.

Вариант 1.
Doctype с объявлением xml:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

pic01

Вариант 2.
Doctype без объявления xml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

pic02

Вариант 3.
Документ без doctype.

pic03

Теперь, когда три DIV размещены в ряд, настало время понаблюдать за поведением содержимого этих блоков. Например, можно увеличить высоту средней ячейки, добавив .cellMiddle {height:100px;}

pic04

Здесь видно, что в IE все DIV выравниваются по нижнему краю - обычное поведение строковых элементов. При этом высота изменена только у средней ячейки, как и определено в CSS. А вот Firefox и Opera увеличили высоту всех ячеек, что свойственно ячейкам таблицы, но текст выровняли по верхнему краю.

Если всем колонкам добавить в CSS { vertical-align: top; text-align: center; }, то получится так:

pic05

В заключение - небольшое замечание: предлагаемый CSS не понравится валидатору, но лишь по части переопределения свойства display. Размещать блочные элементы внутри строковых не верно, даже не смотря на то, что строковым стал элемент, который изначально блочный, хотя это и не нарушает правила разметки.



Много комментариев (21) к “DIV-ная таблица”

  1. Vasya :

    Начинать код страницы с этого:

    Аналогично тому, что вообще не писать доктайп, т.к. документ должен начинаться именно с


  2. Serj :

    Если нельзя float и display, зачем тогда всё это ???
    Может и еще пользоваться всем IE 4.
    Тогда зачем изобретать велосипед

    и везде работает. Не пойму вообще эту статью, к чему она вообще.
    Бред. в итоге все равно в IE не работает ( судя по скринам :) )


  3. 2b_raven :

    какая-то половинчатая статья…
    почему нельзя было довести до логического завершения?
    про то, что блоки в осле при ресайзе прыгают и как с этим бороться автор вообще забыл…


  4. astur :

    А в IE вообще реально сделать ячейки одной высоты при разном размере содержимого?


  5. Neodim :

    маленькая но полезная статья
    благодаря вам поборол слои
    большое спасибо


  6. Geronimo :

    IE не понимает XML-заголовок, поэтому он считает документы с XML заголовками невалидными и включает quirks mode.


  7. Andry :

    замечательно! все работает, хотя и несколько не по правилам w3c :)


  8. Vz :

    вставьте в среднюю колонку элемент [select][/select] и посмотрите, что произойдет с раскладкой в FF.


  9. Никита :

    Эх! IE 7 не понимает!


  10. Строительство котельных :

    Беда с этой версткой div`ами, всегда какие-то извращения получаються которые еще и не везде работают.

    В отличие от таблиц, но у них тоже куча минусов.


  11. noobie :

    а что мешет использовать position:relative если уж нельзя float’ы ??


  12. Mas :

    Это уже изврат…


  13. Иван :

    не понимаю я эти дивы…


  14. bvn :

    [quote]не понимаю я эти дивы…[/quote]
    Я другого не понимаю, почему все так кричат, что они рулез, а таблицы сакс?


  15. Alek :

    Я другого не понимаю, почему все так кричат, что они рулез, а таблицы сакс?
    Поддерживаю. Попробуйте в выше приведенном примере сделать sellspacing=1px …


  16. s1im :

    &rt;Alek :
    &rt;Поддерживаю. Попробуйте в выше приведенном примере сделать sellspacing=1px

    ОМГ! Срочно учить матчасть! И до этого, даже не прикасаться к верстке сайтов


  17. Тайгер :

    Я другого не понимаю, почему все так кричат, что они рулез, а таблицы сакс?
    И я тоже… В таблицах всё проще, а с дивами надо тр*хаться… бо они не предназначены для построения из них таблиц.


  18. Yubari :

    Статья сравнивает табличную и див’ную верстку. В ней все четко сказано.

    Но все же есть некоторые моменты когда дивами сверстать, да еще и в стрикте, нереально.


  19. keepper :

    Вы попробуйте сделать ячейки скажем 30px 100% 30px и в IE все это поплывет!!


  20. kydapodatsya :

    хорошая статья..


  21. ILOR :

    Отличная статья, нашел то что искал. Спасибо!



22 queries 0.201 seconds.