display:table

03 Jul, 2005

До недавнего времени считал это свойство практически бесполезным. Подходящим лишь для игр с CSS в топ-броузерах. А на самом деле это свойство решило проблему нерешаемую практически никаким другим способом.

Проблема

К примеру есть на сайте набор вот таких блоков: картинка + заголовок + выдержка. В коде соответственно имеем:
  1. <div class="post">
  2. <img src="./i/image.jpg" alt="" />
  3. <h2><a href="#">Heading</a></h2>
  4. <p>text tex text text text text ext text text textt</p>
  5. </div>
Cуть проблемы в том что заказчик хочет картинку с одной стороны блока и текст с другой. И это при том что картинка может быть какого угодно размера. Итак первое и очевидное сделать float:left; картинке. Выйдет такое.
FF

Some kind of Heading

Some text. Dean then started to talk about the power of the enclosure element in RSS 2.0. What is great about it is that it enables one to syndicate all sorts of digital content. One can syndicate video, music, calen it is that it enables one to syndicate all sorts of digital content. One can syndicate video, music, calen Some text. Dean then started to talk about the power of the enclosure element in RSS 2.0.

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

Вот эту ситуацию я и считал практически нерешабельной в "стандартах" (без таблиц).

Решение

А решение оказалось таким же простым как и неочевидным. (спасибо Gunlaug Sørtun) Вот недостающий кусок CSS: (для выдержки что загибалась под картинку)
  1. div.post p{
  2. display: table;
  3. _height: 0;/*это для ИЕ5-6*/
  4. zoom: 1;/*это для ИЕ7*/
  5. }

В результате вышеуказанный пример превращается в такой

FF

Some kind of Heading

Some text. Dean then started to talk about the power of the enclosure element in RSS 2.0. What is great about it is that it enables one to syndicate all sorts of digital content. One can syndicate video, music, calen it is that it enables one to syndicate all sorts of digital content. One can syndicate video, music, calen Some text. Dean then started to talk about the power of the enclosure element in RSS 2.0.

Оттестировано на Opera 7-8, Firefox 1.0, Safari 1.2.4, IE/win. Остались только Unix+Linix броузеры и Ie5Mac. Но и там по идее все идеально.

Так как ИЕ7 не понимает хак _height:0 то для него следует использовать либо conditional comments либо другие виды хаков как то - $height. Спасибо Max за замечание!

Зато теперь какого бы размера ни была картинка - текст всегда будет отображен в стороне от неё.

Говоря русским языком свойство display:table обеспечивает "вертикальную целостность блока" или запрет на обтекание FLOATов. Текст внутри блока с этим свойством не будет обтекать float элементы.

Если кто то знает еще что то касательно этого свойства буду рад услышать.

Еще немного инфы

54 комментариев к “display:table”

1.mourner | 07 Jul, 2005
Насколько я помню этот прикол с маленьким height в IE, если ты добавишь в свой пример еще один абзац, он окажется под картинкой.
2.kost | 04 Jul, 2005
Спасибо, интересно. Тоже волновала такая тема, но делал таблицами... Очевидно, автоматический расстановщик кавычек переусердствовал, и вставляет их в код: Heading
3.bsn | 04 Jul, 2005
могу под Линуксом потестить в фаерфоксе, опере, konqueror'e, в текстовых браузерах :)
4.ganges | 04 Jul, 2005
Аналогично 2 bsn :)
5.akella | 05 Jul, 2005
так посмотрите! Второй серый блок в посте и есть живой пример этой техники...
6.rpuwa | 08 Jul, 2005
Респект - полезно!
7.akella | 08 Jul, 2005
2 mourner: Ты конечно прав, по хорошему надо обернуть весь "правый" контент в ДИВ и для него использовать хак. Но в моей конкретной ситуации я знал что будет только 1 абзац p...
8.mourner | 09 Jul, 2005
2 akella, в таком случае всё отлично. :-)
9.agat | 10 Jul, 2005
Респект! Аплодирую стоя :) Очень понравился хак для IE.
10.akella | 12 Aug, 2005
Как выяснилось в некоторых версиях Konqueror под линухой текст отображается поверх картинки - пока не нашел решения. И хотя процент этих пользователей мизерен, это не совсем приятно и надо иметь ввиду... На всех остальных возможных платформах все отображается на ура!
11.konkov | 29 Aug, 2005
а прописать для абзаца float:left не пробовали? таки помогает!
12.Мендокуси | 29 Aug, 2005
Салют. Пробовали ли Вы использовать свойство { clear:left } для решения подобных задач?
13.akella | 29 Aug, 2005
Боюсь вы не до конца осознали проблему: 1. Размер картинки вам неизвестен (а вы ведь предлагаете указать ширину...) 2. Текст не должен обтекать картинку.
14.akella | 29 Aug, 2005
Это свойство(clear:left) предназначено для отображения блока после всех предыдущих блоков с float:left. И я не вижу никакой связи с проблемой описанной в статье... Извините.
15.ксойд | 27 Sep, 2005
в Safari 2.0 работает
16.cssing &raquo; Архив &raquo; Магия для IE | 11 Nov, 2005
[...] ИЕ уже не нужно выходит. Более того это свойство зарещает этому блоку обтекать что-либо. (подробнее здесь) Вдобавок этот же хак(в этом варианте известный как Holly Hack) с height: 1%(что [...]
17.4Ek | 20 Jan, 2006
У пикчи с лого Файрфокса адрес старый, не загружается...
18.akella | 20 Jan, 2006
хм - может временные проблемы с удаленным хостом - адрес поправил - должно теперь все работать... 2ксойд: благодарствую :)
19.Platosha | 01 Mar, 2006
а я решил эту проблему примерно таким образом: div.post p { margin-left: 100px; } результат выглядит также. правда это не поможет если заранее не известны размеры картинки :)
20.wil | 14 Apr, 2006
круто пахает. пасиба !
21.Игорь Фролов | 07 Jul, 2006
Возникла еще одна проблема. Допустим таких div'ов класса post у меня штук пять. При расположении друг под другом, если плавающая картинка будет достаточно большая, то она, "прорубит пол" у своего родительского div'a post и картинка следующего post'a прилипнет к ее правому краю. Хорошо бы было применить clear:[]. Да вот беда, у меня слева менюшка еще на плавающем слое. В итоге весь контент поедет вниз, пока не кончится высота менюшки. Пока сделал вертикальные отступы между post'ами побольше. Но это "кривое" решение, конечно. :-( А счастье было так возможно.
22.Fenix | 07 Jul, 2006
Спасибо, мне как раз пригодится сейчас. Полезная штука
23.akella | 10 Jul, 2006
Честно говоря не совсем понял в чем Ваша проблема - быть может если бы оставили ссылку на пример я бы смог сказать что то более конкретное а так по идее можно добавить overflow:auto и _height:0 или _width:100% для блоков содержащих картинки. с примером проблемы можно было бы сказать что то навернка...
24.Игорь Фролов | 07 Jul, 2006
Огромное спасибо! А то я долго бился над этой проблемой, чтобы не нужно было задавать width или тексту или картинке, но так и не придумал. Теперь все ясно.
25.Comicz | 20 Aug, 2006
Большое спасибо, совершенно случайно наткнулся на эту статью, то что описвается понадобится мне буквально в ближайшие 5 минут
26.max | 24 Oct, 2006
IE7 display:table не поддерживает, и underscore hack исправили поэтому надо писать $height:0;
27.kost | 31 Jan, 2007
Напишите код в таком виде -- можно будет скопировать и вставить. :) div.post p{ display: table; _height: 0; /*это для ИЕ5-6*/ zoom: 1; /*это для ИЕ7*/ }
28.akella | 16 Feb, 2007
Задай для дива div{ width:100%; overflow:hidden } должно помочь
29.ddvhouse | 16 Feb, 2007
А у меня вот zoom:1 не сработал для IE7. У меня картинка больше текста по высоте, и из-за флоата она выходит за низ div'а. Как див растянуть по высоте картинки? (её размеры заранее неизвестны)
30.ser2 | 06 Mar, 2007
хм... а как же в таком случае обойти проблему возникающую если CSS начинается вот так: *{margin:0px; padding:0px;} тогда вся верстка летит к чертям....
31.akella | 06 Mar, 2007
А в чем собственно проблема? у меня все ЦСС файлы начинаются с этой строчки и все работает... Проблема похоже в чем то другом. Если бы Вы показали код можно было бы сказать что то...
32.Deff | 26 Jan, 2010
Ой, а я и не заметил, что посту почти 5 лет
33.Deff | 26 Jan, 2010
Ещё пара комментов: 1. для ИЕ7 можно использовать не zoom:1, а min-height:1px. Те же яйца, но душу греет. 2. в ИЕ6 и ИЕ7 див, для которого задан display:table, занимает всю оставшуюся ширину, а в опере (10 - точно) и фф (3 - точно) див занимает ширину своего содержимого. если для этого дива не заданы бекграунды или бордеры, несущие дизайновую нагрузку, то это не принципиально. А вот когда есть, к примеру, подчёркивание под новостью, а превью новости короткое, то эта черта рисуется не на весь див-родитель (во всяком случае, у меня). 3. ИЕ6&ИЕ7 и опера&фф по-разному трактуют горизонтальные padding'и и margin'ы, заданные для дива с заданным display:block. поэтому я стараюсь задавать отступы для флоаченной картинки (той, что в примере выше). 4. с помощью display:table получаются неплохие двух- и трёхколоночные шаблоны, только код боковых колонок нельзя вынести после кода контента.
34.Антон | 23 Oct, 2009
Спасибо огромнейшее! Отлично работает в случае если нужно сделать меню И справа И слева И они могут быть, а могут и не быть (т.е. в разных вариациях)! До этого делал таблицами... :(
35.Виталий | 08 Sep, 2009
Новый адрес http://profi-web.ru/full_blog/32/display_table.news.php
36.Виталий | 04 Sep, 2009
[..]От чего и почему, теперь здесь, старая ссылка не работает[..]
37.Serhiy Valchuk | 28 Nov, 2007
Зараз стикнувся зі схожим завданням, що необхідно розмістити частину контенту у дві колонки, при цьому завдання трішки важче, тому що у лівій колоні розміщено малюнок, який може бути будь-якого розміру, а під ним підпис, який теж може бути будь-якої довжини. З цього приводу маю такі зауваження: 1. властивість zoom дії для ІЕ 5.5-7, відповідно у призначення додаткового height не бачу змісту. 2. E ІЕ7 ніби underscore hack виправили, а коли задаєш height 1%, то дана властивість призначає hasLayout, в тому числі і для ІЕ7 і деколи це необхідно використовувати. 3. Наскільки є семантичним використання display:table. Ніби сам контент розміщений у відповідних тегах, тобто структура зберігається, а за допомогою css задається вигляд як у таблиці. Тобто притензій до семантики не мало бути. Хотілося почути думки з цього приводу.
38.akella | 28 Nov, 2007
1. Возможно так, посту было уже больше года когда вышел 7й, я просто добавил по просьбе комментировавшего) нужно еще раз потестить.. 2. underscore hack насколько мне известно работает только для 5-6 ИЕ, и именно потому что его исправили в 7 =) 3. Я думаю что понятие семантики вообще имеет отношение только к HTML, и такая маленькая шалость как использование display:table ровным счетом никому не навредит в этом мире.
39.Игорь | 02 Feb, 2008
Дельная весчичка! Уже давненько ее пользую, благодаря автору :) Огромный респект!
40.Санча | 04 May, 2008
Спасибо
41.Allinne | 30 May, 2008
Если использовать так: .container { display:block; _height: 0; zoom: 1; width:100%; } .container DIV { float:left; width:12em;} ... ... То в FF 2.x block2 будет отрисовываться под block1. Воспроизводится с большим количеством таких блоков на странице, находящейся на удаленном сервере. Лечится не display:block и костылем для IE, а как указано у Ивана Сагалаева Либо float:left, либо position:absolute, либо overflow:hidden; width:100%.
42.Марат | 26 Mar, 2009
Огромное спасибо!!!
43.kurijov | 05 Aug, 2008
Решаемо без таблиц.
44.Семантическая верстка — советы и решения. Часть VI. Запрет на обтекание float’ов | 26 Aug, 2008
[...] display:table [...]
45.INOZ | 09 Dec, 2008
Как раз то, что нужно в данный момент. СПАСИБО! Но вот только я два часа убил на то, чтобы понять, почему у меня это не работает. Оказывается, упустил то, что надо поставить float: left для картинки. *краснею*
46.Display:table &laquo; Заметки html верстальщика | 08 Feb, 2009
[...] От чего и почему вы можете узнать здесь. [...]
47.Алексей | 09 Feb, 2009
Премного благодарен.
48.cssing :: Архив :: overflow:hidden | 26 Apr, 2010
[...] непопулярный трюк. Я уже писал про display:table. Так вот, это &#8212 [...]
49.Алексей | 14 Jul, 2010
По моему еще должно сработать если для блока задать display:inline-block; в этом случае для ие нужен хак небольшой _display:inline; zoom:1 или *display:inline; zoom:1 непомню понимает ли 7 ка просто инлайн блок)
50.Max Brown | 02 Jul, 2010
Автору респект. Изломал себе всю голову, пытаясь избежать заползания анонса под фотку. Моя идея насчёт {padding-left:[ширина фотки]px;} работала лишь частично. Решение, предложенное здесь, выручило.
51.Vpopulare.ru &raquo; Float&#8217;омагия: пробуем не «плавать» в спецификации, чтобы не утонуть в потоке | 21 Jan, 2012
[...] боксов). Именно поэтому классические уже приемы типа этого и этого работают стабильно, и мы можем смело их [...]
52.Владимир Старков | 07 Aug, 2012
А как быть если `h2` многострочный и контейнер содержащий все `p` из-за этого сдвигается и весь трюк перестаёт работать: http://img407.imageshack.us/img407/3770/60111849cd6441d7ac9aeca.png онлайн демо фейла — http://dabblet.com/gist/3283452 я ума не приложу как решить эту проблему. а использовать `padding-left` не хочу, так как совсем не гибко а использовать
53.overflow:hidden | Просто блог | 19 Feb, 2014
[...] непопулярный трюк. Я уже писал про display:table. Так вот, это &#8212 лучше. P.S.: оказалось трюк таки [...]
54.Helga | 03 Dec, 2013
просто отлично! вечно извращаешься с картинкой и флоатом, а тут такое лаконичное решение. спасибо!