Кроссбраузерное использование inline block

Хочу поделиться с вами найденным решением проблемы, с которой я сталкивался раньше не один раз, но нормального выхода не находил. Проблема была связана с вёрсткой нескольких блоков, которые располагаются друг за другом.

Например так:

Кроссбраузерное использование inline block

Если высота одинакова для всех блоков, то проблем возникнуть не должно. Решалось это путём использования плавающих блоков и указания им необходимой ширины и высоты. Но что делать, если в каждом блоке разный объём контента и соответственно разная высота. В результате вёрстка могла «поехать»:

Кроссбраузерное использование inline block

Как написал автор оригинала: «Необходимо правильное и семантичное решение с гибкостью, которой обладают таблицы».

Использовать будем такую структуру:

1
2
3
4
5
6
7
<ul>
    <li>
        <img src="photo.jpg" width="75" height="75" alt="" />
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
    </li></ul>

и следующие стили:

1
2
3
4
5
6
7
li {
    width:130px;
    border: 1px solid #ссс;
    display: inline-block;
    margin: 5px;
    padding: 5px
}

В FF3, Safari 3, Opera и IE8b2 выглядит вроде нормально, но что-то не так с вертикальным выравниванием:

Кроссбраузерное использование inline block

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

1
2
3
4
5
6
7
8
li {
    width: 130px;
    border: 1px solid #ссс;
    display: inline-block;
    margin: 5px;
    padding: 5px;
    vertical-align: top
}

Кроссбраузерное использование inline block

То что нужно. Однако в IE6 и IE7 всё совсем не так.

Кроссбраузерное использование inline block

IE6 и IE7 не поддерживают inline-block, поэтому с помощью условных комментариев прописываем для них display:inline.

1
2
3
4
5
6
7
<!--[if lte IE 7]>
<style type="text/css">
    ul li {
        display: inline
    }
</style>
<![endif]-->

Оригинал: Cross-Browser Inline-Block.

Обсуждение:

  1. ArtShok

    Спасибо!
    Ушло в избранное. Была аналогичная проблема, но решение так и не было найдено ))

  2. jeenART

    Спасибо конечно за красивую иллюстрацию, но мы и так знали что 2х2 это 4. )))

  3. Alex

    jeenART, безусловно у вас выдающиеся познания в математике, но всё-таки комментируйте пожалуйста по существу.

  4. asse

    тот же самый эффект достигается с помощью:
    li {
    width: 130px;
    border: 1px red solid;
    margin: 20px;
    position: relative;
    float: left;
    }

    с теме же оговорками для IE

  5. skiff36

    Помнится ранее для FF приходилось дописывать display:-moz-inline-stack;, т.к. и он не поддеживал display:inline-block;. Как давно у него появилась поддержка последнего?

  6. Alex

    Pepelsbey, спасибо за ссылку. Одно не понятно, разве для hasLayout уже недостаточно указания ширины.

    ASSE, в начале статьи об этом.

    skiff36, я не стал писать про FF2, но в оригинале автор как раз пишет о display:-moz-inline-stack для FF2.

  7. jeenART

    Извиняюсь за метафорическое ворожение мыслей. Если по существу, то каждый верстальщик должен просто помнить, что если используют inline-block, то необходимо указывать в

    main.css: … {display: inline-block; display: -moz-inline-box;}
    ie6.css: … {display: inline;}

    И всё, никаких проблем не будет ни в каком браузере.

  8. Alex

    jeenART, ок спасибо ;) . Возможно я выбрал неправильный заголовок для статьи, т.к. не хотел описывать как нужно использовать inline-block, а задача была показать как реализовать конкретный вышеописанный пример, который одним этим свойством не реализовать. Хотя может это тоже общеизвестный приём, но как я вижу, уже как минимум 2 человека о нём не знали.

  9. DStarkoff

    Отличное решение недавно столкнулся с тойже проблемой плавающих блоков! Это обалденное решение! Автору спасибо!

  10. Чистяков Денис

    Добавлю к вышесказанному, что {display: -moz-inline-box;} — не панацея, т.к. display: -moz-inline-box, как и также часто рекомендуемый для FF2 display: -moz-inline-stack; != display: inline-block; поэтому они часто ведут себя «совершенно не так» как ожидаешь, и каждый раз надо очень тщательно тестировать именно в FF2, т.к. при некоторых обстоятельствах все блоки сбиваются «в кучу».
    Пример в демке несколько притянутый за уши, табличка 2?3 фиксированной ширины через инлайновые блоки — семантика ради семантики, инлайновые блоки имеет смысл только если не известно ни количество изображений ни ширина контейнера (что бы они аккуратно выстраивались и «плавали» при ресайзе), либо как они изначально и планировались — для блочных элементах внутри текста, например кнопок, о чем хорошо и подробно написано у Никиты Селецкого в статье Cтрочная кнопка как ссылка.

  11. Чистяков Денис

    Прошу прощения за пару опечаток, поторопился.

  12. WebMast

    Большое спасибо за пример. Я тоже о нем не знал, хотя нужды пока в нем не испытывал! Спасибо большое…

  13. Alex

    Денис, я обычно сталкивался с этой проблемой когда нужно сверстать каталог товаров для магазина. Обычно у каждого товара свой блок с описанием. А ширина внешнего контейнера не обязательно фиксированная, это всего лишь пример ;)

    WebMast, пожалуйста.

  14. Dmitry

    2 Alex: вам слово AIK о чем-нибудь говорит? :) (просто больно знакомые картинки и проблема)

  15. Alex

    Dmitry, не знаю о чём вы говорите. Изображения и демо я подготовил сам. Ссылка на оригинал статьи в конце статьи.

  16. SPG

    Спасибо, хорошая статья. Использовал приведенный в статье пример для создания карты сайта. Вроде неплохо получилось.

  17. Roman Khan

    Цитирую: «IE6 и IE7 не поддерживают inline-block»
    Откровенная чушь. Я точно знаю, что это не так, потому как пользуюсь этим свойством в каждой верстке, надо просто знать один секрет. Гуглите чаще, товарищи )))

    • Alex

      Ну коли знаете, так расскажите неведующим.

  18. mihdan

    В firefox 2.0.0.4 не работает, хотя вопрос решился добавлением еще одной обертки

    • Alex

      Про ff ниже 3-й версии выше отписали.

  19. Sober

    Это происходит из такого свойства осликов как — hasLayout
    Вместо display: inline, можно поставить zoom: 1; — что так же заставит появится hasLayout (взаимодействие между элементами имеющих это свойство) и блоки встанут как надо. Вообще это для многих ситуаций срабатывает.

  20. Green Dragon

    Спасибо вам за ваш урок)

  21. Виталий

    Новый сафари все обламал. что делать? он не учитывает font-size: 0px;

  22. Виталий

    http://piccy.info/view3/1835851/98019dfa35be00ef4bed577c301589da/

    win7 32 =) сафари начал делать отступ и перестал учитывать значение шрифта в 0 пикселей =) пока спасает только посдвигать тэги в кучу там, где это возможно.. ну а где генерятся автоматом, там думаю .что делать.

    еще спасает если шрифт сделать в 1px но тогда опера итд вылетает. пробовал написать исключение для сафари, но шото с ним явно не то. не понимает он их…=/

  23. vovans

    Спасибо, дайствительно помогло!

    Как, оказывается, это просто решается :)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*