Ars Longa, Vita Brevis

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

Работая над одним проектом, мне пришлось столкнуться с одной неприятной задачей: отцентрировать многострочный список (то есть один <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 (но могут применяться и в XHTML, правда, возможны побочные эффекты). Полный список Мозилловских расширений для display можно найти здесь. Там же сказано, что Mozilla не поддерживает -moz-inline-block (и, как следствие, inline-block, ибо разработчики проводят испытания, как правило, на -moz-xxx). Но есть замечательное значение -moz-inline-box (не путать с -moz-inline-block). Путём многочисленных экспериментов (так как с документацией проблемы) было установлено, что -moz-inline-box делает (инлайновый) элемент блочным, который будет вести себя как инлайновый (кому интересна разница с inline-block, читайте спецификации W3C CSS 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)

Update: ура, это даже кому-то помогло: Смещение позиции cpanel. Вот и первая обратка с "Форума русской поддержки Joomla! CMS" :-)

Связанные записи

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

  1. [March 18, 2008 18:29] Легко изменяемый макет фиксированной ширины | Ars Longa, Vita Brevis:

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

    #1

RSS feed for comments on this post. TrackBack URL

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

Изображения должны быть включены!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

Subscribe without commenting