Центрирование нескольких блочных элементов

Кросс-браузерный способ для многострочного центрирования неизвестного количества блочных элементов

Работая над одним проектом, мне пришлось столкнуться с одной неприятной задачей: отцентрировать многострочный список (то есть один <ul>, много <li>) так, чтобы элементы списка (неизвестное количество, неизвестная ширина, одинаковая высота) были отцентрированы в каждой строчке:

menu.png

Как обычно, Google is your friend. Но, увы и ах, задача хорошо решается только для однострочных контейнеров (то есть в случае, если центрируемые элементы будут находиться на одной строке). Одно из таких решений представлено здесь.

Общая идея решения:

[-]
View Code CSS
#container {
    float: left;
    position: relative;
    left: 50%;
}

#container ul {
    list-style: none;
    position: relative;
    left: -50%;
}

#container li {
    float: left;
    position: relative; /* For IE */
}

/* IE Mac only styles \*//*/
#container {
    float: none;
    position: static;
}

#container ul {
    position:static;
    text-align: center;
}

#container li {
    float: none;
    position: static;
    display: inline-block;
}
/* End of IE Mac styles */
[-]
View Code HTML
<div id="container">
    <ul>
        <li>Item 1</li>
        <li>Long Item 2</li>
        <li>Very Long Item 3</li>
    </ul>
</div>

Второй способ более изощрённый (оттуда же):

[-]
View Code CSS
.navcentre ul {
    list-style: none;
    margin: 0 auto;
    padding: 0;
    display: table;
    white-space: nowrap;
}

.navcentre li {
    display: table-cell;
}
[-]
View Code CSS
/* Эти стили только для IE */
.navcentre ul { display: inline-block; }
.navcentre ul { display: inline; }
.navcentre li { display: inline-block; }
.navcentre li { display: inline; }
.navcentre { text-align: center; }
[-]
View Code HTML
<div class="navcentre">
    <ul>
        <li>Item 1</li>
        <li>Long Item 2</li>
        <li>Very Long Item 3</li>
    </ul>
</div>

Особое внимание следует обратить на этот :

[-]
View Code CSS
element { display: inline-block; }
element { display: inline; }

Магия здесь в следующем:

IE only understands display:inline-block on inline elements but fortunately if you first make the block level element display:inline-block and then declare it as display:inline in the next style block it now treats the block level element as display:inine-block. This is consistent in ie7 so we are safe for years to come.

Третий вариант предложен Stu Nichols, но у него (варианта) есть один серьёзный недостаток: "a centered floated left menu (unknown width)" в IE7, мягко говоря, не работает.

Итак, с однострочниками разобрались. Переходим к многострочникам.
На том же сайте я нашёл еще одну интересную статью: Center Multiple Divs (IE5.5 - 7 only). То, что нужно, но вот беда: работает только для IE. Плохо. Но идея замечательная:

[-]
View Code CSS
ul {
    list-style: none;
    text-align: center;
    margin: 0;
    padding: 0;
}

li {
    display: inline-block;
    padding: 5px;
    margin: 5px;
}

li {
    display: inline;
}
[-]
View Code HTML
<ul>
    <li>Item 1</li>
    <li>I am Item 2</li>
    <li>This is Item 3</li>
    <li>Very long Item 4</li>
    <li>Very very very long Item 5 etc</li>
</ul>

Работает в IE6/7, Opera 9, Safari… Только в FireFox и других Gecko-based браузерах не работает из-за кривой поддержки display: inline-block. Таким образом, всё, что нужно — найти замену inline-block для Mozilla. И здесь мне очень пригодился прошлый опыт работы с XUL: я помню, что Mozilla поддерживает очень много разных значений для display, которые применяются в XUL (но могут применяться и в , правда, возможны побочные эффекты). Полный список Мозилловских расширений для display можно найти здесь. Там же сказано, что Mozilla не поддерживает -moz-inline-block (и, как следствие, inline-block, ибо разработчики проводят испытания, как правило, на -moz-xxx). Но есть замечательное значение -moz-inline-box (не путать с -moz-inline-block). Путём многочисленных экспериментов (так как с документацией проблемы) было установлено, что -moz-inline-box делает (инлайновый) элемент блочным, который будет вести себя как инлайновый (кому интересна разница с inline-block, читайте спецификации W3C 2.1 :-) ). Патчим стили и получаем то, что нужно:

[-]
View Code CSS
li {
    display: -moz-inline-box;
}

li {
    display: inline-block; /* Для Оперы, Сафари и семейства Ишаков. Mozilla не понимает inline-block, поэтому для нее display останется -moz-inline-box */
}

* html li {
    display: inline; /* Для IE6 */
}

*:first-child+html li {
    display: inline; /* Для IE7 */
}

Тестовая страница с ужасной разметкой и расцветкой

Как это все смотрится в других браузерах (еще можно посмотреть здесь):

BonEcho 2.0.0.12 (PLD 2.0)Dillo 0.8.5 (Ubuntu 7.10)Epiphany 2.18 (Ubuntu 7.04)Epiphany 2.20 (FreeBSD 6.3)Epiphany 2.20 (Ubuntu 8.04 LTS)FireFox 1.0.8 (PLD 2.0)FireFox 1.5 (Windows 2000)FireFox 1.5.0.13pre (Ubuntu 6.06 LTS)FireFox 2.0.0.11 (Ubuntu 7.10)FireFox 2.0.0.12 (MAC OS X 10.5)FireFox 2.0.0.4 (Windows 2000)FireFox 3.0 (Ubuntu 7.10)FireFox 3.0 (Windows XP)Flock 0.7.14 (PLD 2.0)Flock 0.9.1.5 (PLD 2.0)Flock 1.0 (Ubuntu 7.10)Flock 1.0.8 (Windows 2000)Flock 1.1 (Windows XP)Galeon 1.3.20 (Debian 3.1)Galeon 2.0.2 (Ubuntu 7.10)Galeon 2.0.4 (FreeBSD 6.3)Gran Paradiso 3.0 (Ubuntu 7.10)Iceape 1.0.9 (Debian 4.0)Iceape 1.1.5 (Ubuntu 7.10)IceWeasel 2.0.0.3 (Ubuntu 7.04)K-Meleon 1.1.4 (Windows 2000)Kazehakase 0.2.7 (Debian 3.1)Kazehakase 0.4.3 (Ubuntu 7.04)Kazehakase 0.5.1 (PLD 3.0)Konqueror 3.3 (Debian 3.1)Konqueror 3.5 (Ubuntu 7.10)Minefield 3.0b4pre (PLD 3.0)Mozilla 1.7.13 (PLD 2.0)Internet Explorer 4.01 (Windows XP)Internet Explorer 5.01 (Windows XP)Internet Explorer 5.5 (Windows 2000)Internet Explorer 6.0 (Windows 2000)Internet Explorer 7.0 (Windows XP)Internet Explorer 8.0 (Windows XP)Netscape Navigator 4.8 (PLD 2.0)Netscape Navigator 9.0.0.5 (Ubuntu 8.04 LTS)Netscape Navigator 9.0.0.5 (Windows 2000)Opera 9.23 (Windows XP)Opera 9.24 (Windows XP)Opera 9.25 (FreeBSD 6.3)Opera 9.25 (Ubuntu 6.06 LTS)Opera 9.25 (Windows XP)Opera 9.26 (PLD 3.0)Opera 9.26 (Windows 2000)Opera 9.50 (Ubuntu 7.10)Safari 1.3.2 (MAC OS X 10.3)Safari 2.0.4 (MAC OS X 10.4)Safari 3.0 (Windows XP)Safari 3.0.4 (MAC OS X 10.4)SeaMonkey 1.0.9 (PLD 2.0)SeaMonkey 1.1.7 (FreeBSD 6.3)SeaMonkey 1.1.8 (Ubuntu 7.10)SeaMonkey 1.1.8 (Windows XP)SeaMonkey 2.0a1pre (PLD 3.0)

Вложения:

  • (image/png)
Автор: ; опубликовано в: CSS, HTML; метки: CSS, HTML, XHTML, ошибка, хак
10
Мар
2008

RSS Комментарии к статье «Центрирование нескольких блочных элементов» (2)  »

  1. [...] метод центрования колнок внутри контейнера описан здесь. [...]

  2. Алексей

    Когда окончательно откажуться от IE6 и IE7? :) )))

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Центрирование нескольких блочных элементов»

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

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा