24 февраля 2010 :Плавающие блоки с фиксированной ширинойИтак, долгожданная статья. Вопреки заголовку свойства display:float здесь не используется, что не отменяет результата. Неделю назад мне потребовался эффект для создания плавающих блоков фиксированной ширины, примерно как на картинке:
Если вы пробовали верстать что-то похожее, то знаете в чём подвох. В общем случае, сверстать этот макет было бы плёвым делом. Фиксированная ширина, фиксированная высота,
Так как первый блок выше чем другие, пятый блок, обтекает его слева, вместо того чтобы быть ниже. Я потратила немало времени в поисках нужной реализации, и в конце концов вспомнила про свойство Начнём с простой страницы, с не сортированным списком, и установим свойство отображения
<ul>
<li>
<h4>This is awesome</h4>
<img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
alt="lobster" width="75" height="75"/>
</li>
...
<ul>
<style>
li {
width: 200px;
min-height: 250px;
border: 1px solid #000;
display: inline-block;
margin: 5px;
}
</style>
Это выглядит неплохо в Firefox 3, Safari 3 и Опере:
Легко заметить, что что-то не так с вертикальным выравниванием (статью о котором я написала недавно, см. ссылку). Точнее не совсем не так, потому что это правильное отображение, но не то что мы хотели. Выравнивание здесь проходит по базовой линии каждого элемента <li> относительно родителя <ul>. Что такое базовая линия можно увидеть на картинке:
Говоря проще значением по умолчанию для vertical-align в режиме inline или inline-block элемента, является базовая линия, что означает что базовая линия элемента будет расположена также как у родительского. Базовая линия в нашем случае показана на следующем изображении:
В любом случае, чтобы поправить это нам нужно просто указать
За исключением конечно
Начнём с Firefox 2. Firefox 2 не поддерживает
<style>
li {
width: 200px;
min-height: 250px;
border: 1px solid #000;
display: -moz-inline-stack;
display: inline-block;
vertical-align: top;
margin: 5px;
}
</style>
(Не путайте также свойство ‘-moz-inline-stack’ с ‘-moz-inline-box’ обсуждаемым в тематическом топике на хабре, это разные вещи). К сожалению в отображении небольшой баг:
Чтобы исправить его нужно просто обернуть всё что находится внутри <li> в <div>.
<li>
<div>
<h4>This is awesome</h4>
<img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
alt="lobster" width="75" height="75"/>
</div>
</li>
Это поправит всё внутри <li> и заставит их отображаться нормально.
Теперь разберёмся с IE 7. IE 7 тоже не поддерживает inline-block, но мы можем заставить его отображать <li> как если бы он был строчно-блоковым. Как? Технически, наличие hasLayout у элемента означает что он отвечает за своё собственное отображение и отображение дочерних элементов. (В комбинации с min-height и width, вы можете получить что-то похожее на display:block). Это похоже на волшебную пыль, которой вы можете посыпать глюки отображения и они изчезнут. Когда мы добавим zoom:1 и
<style>
li {
width: 200px;
min-height: 250px;
border: 1px solid #000;
display: -moz-inline-stack;
display: inline-block;
vertical-align: top;
margin: 5px;
zoom: 1;
*display: inline;
}
</style>
Почти готово! Остался только IE 6:
Поскольку в данном примере мы хотели использовать min-height, которое не поддерживается IE 6, но благодаря его неверному отображению свойства height, мы можем использовать его. Установим значение Итак, после всех усилий, вот финальные стили CSS и разметка HTML:
<style>
li {
width: 200px;
min-height: 250px;
border: 1px solid #000;
display: -moz-inline-stack;
display: inline-block;
vertical-align: top;
margin: 5px;
zoom: 1;
*display: inline;
_height: 250px;
}
</style>
<li>
<div>
<h4>This is awesome</h4>
<img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
alt="lobster" width="75" height="75"/>
</div>
</li>
|
Либо волшебно используйте ваш логин в Google, Яндекс, рамблер или ЖЖ чтобы войти через Open_ID











Комментарии:
selenit2 (selenit)
26.02.2010 03:50:44
Елена Лунная
01.03.2010 15:33:06
selenit2 (selenit)
02.03.2010 02:54:14
Елена Лунная
02.03.2010 12:42:02