display:table
До недавнего времени считал это свойство практически бесполезным. Подходящим лишь для игр с CSS в топ-броузерах. А на самом деле это свойство решило проблему нерешаемую практически никаким другим способом.
Проблема
К примеру есть на сайте набор вот таких блоков: картинка + заголовок + выдержка.
В коде соответственно имеем:
- <div class=”post”>
- <img src=”./i/image.jpg” alt=”" />
- <h2><a href=”#”>Heading</a></h2>
- <p>text tex text text text text ext text text textt</p>
- </div>
Cуть проблемы в том что заказчик хочет картинку с одной стороны блока и текст с другой. И это при том что картинка может быть какого угодно размера.
Итак первое и очевидное сделать float:left; картинке. Выйдет такое.
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: (для выдержки что загибалась под картинку)
- div.post p{
- display: table;
- _height: 0;/*это для ИЕ5-6*/
- zoom: 1;/*это для ИЕ7*/
- }
В результате вышеуказанный пример превращается в такой
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 элементы.
Если кто то знает еще что то касательно этого свойства буду рад услышать.
Еще немного инфы
- Pup’s Float Hack - CSS игры на эту тему
- Развитие темы + display: table-cell; и т д
Спасибо, интересно. Тоже волновала такая тема, но делал таблицами…
Очевидно, автоматический расстановщик кавычек переусердствовал, и вставляет их в код:
Heading
могу под Линуксом потестить в фаерфоксе, опере, konqueror’e, в текстовых браузерах :)
Аналогично 2 bsn :)
так посмотрите!
Второй серый блок в посте и есть живой пример этой техники…
Насколько я помню этот прикол с маленьким height в IE, если ты добавишь в свой пример еще один абзац, он окажется под картинкой.
Респект - полезно!
2 mourner:
Ты конечно прав, по хорошему надо обернуть весь “правый” контент в ДИВ и для него использовать хак.
Но в моей конкретной ситуации я знал что будет только 1 абзац p…
2 akella, в таком случае всё отлично. :-)
Респект! Аплодирую стоя :) Очень понравился хак для IE.
Как выяснилось в некоторых версиях Konqueror под линухой текст отображается поверх картинки - пока не нашел решения. И хотя процент этих пользователей мизерен, это не совсем приятно и надо иметь ввиду…
На всех остальных возможных платформах все отображается на ура!
а прописать для абзаца float:left не пробовали? таки помогает!
Боюсь вы не до конца осознали проблему:
1. Размер картинки вам неизвестен (а вы ведь предлагаете указать ширину…)
2. Текст не должен обтекать картинку.
Салют.
Пробовали ли Вы использовать свойство { clear:left } для решения подобных задач?
Это свойство(clear:left) предназначено для отображения блока после всех предыдущих блоков с float:left. И я не вижу никакой связи с проблемой описанной в статье… Извините.
в Safari 2.0 работает
[…] ИЕ уже не нужно выходит. Более того это свойство зарещает этому блоку обтекать что-либо. (подробнее здесь) Вдобавок этот же хак(в этом варианте известный как Holly Hack) с height: 1%(что […]
У пикчи с лого Файрфокса адрес старый, не загружается…
хм - может временные проблемы с удаленным хостом - адрес поправил - должно теперь все работать…
2ксойд: благодарствую :)
а я решил эту проблему примерно таким образом:
div.post p {
margin-left: 100px;
}
результат выглядит также. правда это не поможет если заранее не известны размеры картинки :)
круто пахает. пасиба !
Огромное спасибо! А то я долго бился над этой проблемой, чтобы не нужно было задавать width или тексту или картинке, но так и не придумал. Теперь все ясно.
Спасибо, мне как раз пригодится сейчас. Полезная штука
Возникла еще одна проблема. Допустим таких div’ов класса post у меня штук пять. При расположении друг под другом, если плавающая картинка будет достаточно большая, то она, “прорубит пол” у своего родительского div’a post и картинка следующего post’a прилипнет к ее правому краю. Хорошо бы было применить clear:[]. Да вот беда, у меня слева менюшка еще на плавающем слое. В итоге весь контент поедет вниз, пока не кончится высота менюшки. Пока сделал вертикальные отступы между post’ами побольше. Но это “кривое” решение, конечно. :-( А счастье было так возможно.
Честно говоря не совсем понял в чем Ваша проблема - быть может если бы оставили ссылку на пример я бы смог сказать что то более конкретное а так по идее можно добавить overflow:auto и _height:0 или _width:100% для блоков содержащих картинки. с примером проблемы можно было бы сказать что то навернка…
Большое спасибо, совершенно случайно наткнулся на эту статью, то что описвается понадобится мне буквально в ближайшие 5 минут
IE7 display:table не поддерживает, и underscore hack исправили
поэтому надо писать $height:0;
Напишите код в таком виде — можно будет скопировать и вставить. :)
div.post p{
display: table;
_height: 0; /*это для ИЕ5-6*/
zoom: 1; /*это для ИЕ7*/
}
А у меня вот zoom:1 не сработал для IE7.
У меня картинка больше текста по высоте, и из-за флоата она выходит за низ div’а.
Как див растянуть по высоте картинки? (её размеры заранее неизвестны)
Задай для дива
div{
width:100%;
overflow:hidden
}
должно помочь
хм… а как же в таком случае обойти проблему возникающую если CSS начинается вот так:
*{margin:0px; padding:0px;}
тогда вся верстка летит к чертям….
А в чем собственно проблема? у меня все ЦСС файлы начинаются с этой строчки и все работает… Проблема похоже в чем то другом. Если бы Вы показали код можно было бы сказать что то…
Зараз стикнувся зі схожим завданням, що необхідно розмістити частину контенту у дві колонки, при цьому завдання трішки важче, тому що у лівій колоні розміщено малюнок, який може бути будь-якого розміру, а під ним підпис, який теж може бути будь-якої довжини.
З цього приводу маю такі зауваження:
1. властивість zoom дії для ІЕ 5.5-7, відповідно у призначення додаткового height не бачу змісту.
2. E ІЕ7 ніби underscore hack виправили, а коли задаєш height 1%, то дана властивість призначає hasLayout, в тому числі і для ІЕ7 і деколи це необхідно використовувати.
3. Наскільки є семантичним використання display:table. Ніби сам контент розміщений у відповідних тегах, тобто структура зберігається, а за допомогою css задається вигляд як у таблиці. Тобто притензій до семантики не мало бути.
Хотілося почути думки з цього приводу.
1. Возможно так, посту было уже больше года когда вышел 7й, я просто добавил по просьбе комментировавшего) нужно еще раз потестить..
2. underscore hack насколько мне известно работает только для 5-6 ИЕ, и именно потому что его исправили в 7 =)
3. Я думаю что понятие семантики вообще имеет отношение только к HTML, и такая маленькая шалость как использование display:table ровным счетом никому не навредит в этом мире.
Дельная весчичка! Уже давненько ее пользую, благодаря автору :) Огромный респект!
Спасибо
Если использовать так:
.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%.
Решаемо без таблиц.
[…] display:table […]