Многим новичкам кажется очень сложным выровнять горизонтальное меню (пейджер) по центру веб-страницы. Из-за этого появилось много вариантов центрирования с помощью хаков и с использованием яваскрипт-программирования. На самом деле все намного проще. Это делается с использованием чистого CSS. Необходимо немного разобраться с относительным позиционированием и с правилом float. Итак, имеем html-код:
<div> <ul> <li><a href="#">Вкладка один</a></li> <li><a href="#">Вкладка два</a></li> <li><a href="#">Вкладка три</a></li> <li><a href="#">Вкладка четыре</a></li> </ul> </div>
Для начала, применим обычные правила CSS, чтоб выстроить меню по горизонтали:
div {border-bottom:1px solid orange; float:left; width:100%}
ul {margin:0;padding:0;}
ul li {float:left;list-style:none;}
ul li a {display:block;padding:5px;text-decoration:none; border-right:1px solid #fff;background:yellow}
Имеем такое меню.
Пункты меню прижались к левой стороне браузера. Это поведение легко предсказуемо.
Сейчас нужно обратить внимание на 2 момента, на которых и строится способ центрирования меню:
1. В относительном позиционировании, процент смещения зависит от ширины родителя.
2. Ширина родителя, к которому применено свойство float, будет соответствовать сумме длин дочерних плавающих элементов.
Этого вполне хватит, чтоб добиться желаемого результата.
Применим к ul свойство float:left и его ширина будет равна сумме длин всех li которые находятся внутри. Затем применим к нему относительное позиционирование и сместим его вправо на 50%. Список сместится на половину ширины окна браузера. После этого применим относительное позиционирование к самим пунктам меню li и сместим их влево на 50%, но сейчас смещение произойдет не на половину ширины окна браузера, а наполовину ширины элемента ul. Таким образом мы получим горизонтальное меню, выровненное по центру окна браузера. Остался последний штрих. Из-за смещения элемента ul, могла появится горизонтальная полоса прокрутки, поэтому для обертывающего элемента div необходимо применить свойство overflow:hidden. Еще 1 штрих - к контейнеру div применяем свойство position:relative, чтоб решить проблемы кроссбраузерности в ие7 и ниже (спасибо Dench).
Получился такой CSS:
div {border-bottom:1px solid orange; float:left; width:100%; overflow:hidden;position:relative}
ul {margin:0;padding:0; float:left; position:relative; left:50%}
ul li {float:left;list-style:none; position:relative; right:50%}
ul li a {display:block;padding:5px;text-decoration:none; border-right:1px solid #fff;background:yellow}
Можно посмотреть на результат.
Этот способ корректно отображается всеми популярными браузерами и с успехом проходит проверку на валидаторе. Буду рад, если пост оказался кому-то полезен.
Rss-подписка
Email
Re: Выравнивание горизонтального меню по центру страницы
Спасибо! То что нужно. Почти во каждый раз мучаюсь с такой проблемой, но ваш способ самый лучший!
Re: Выравнивание горизонтального меню по центру страницы
Пожалуйста :)
Re: Выравнивание горизонтального меню по центру страницы
АААА!!!Ты даже не представляешь сколько я часов убил, чтоб найти решение.. а потом решил по инету полазить и бац, просто готовинькое решение.. Очень-очень-очень Благодарен за этот пост.
Re: Выравнивание горизонтального меню по центру страницы
Это просто супер! Спасибо, чувак! )))
Re: Выравнивание горизонтального меню по центру страницы
Этот способ хорошо работает если ширина всего меню не больше 50% ширины страницы, иначе вылазит горизонтальная полоса прокрутки. Попробуйте в IE уменьшить ширину браузера или добавить несколько пунктов меню. Или это у меня только так в IE 5,6,7,8?
Пока что поставил себе в боди overflow-x: hidden; Но это не выход и надо искать решение.
Re: Выравнивание горизонтального меню по центру страницы
Горизонтальная полоса не может появляться, потому что для контейнера стоит overflow:hidden. При уменьшении ширины браузера, когда ширина контейнера div становится равной ширине браузера, пункты меню просто складываются один под другой и ширина div уменьшается. Вы тестировали мой код, или уже на своем сайте?
Re: Выравнивание горизонтального меню по центру страницы
Я тестировал Ваш код, сразу по вашей ссылке. Использовал программу IETester. Но вот странно, возможно глюк какой то был, теперь в 5,6,8 все норм, но вот в 7 появляется полоса прокрутки. Попросил знакомого чтоб у себя посмотрел в 7, у него тоже появилась. Вот его скриншот: http://uaimage.com/image/a927b8b9
Re: Выравнивание горизонтального меню по центру страницы
Вот оно что, данный глюк это следствие нововведений в IE7, так как только в режиме Strict Mode появляется горизонтальная прокрутка, а вот если убрать DOCTYPE и перейти таким образом в режим Quirks Mode, все работает отлично.
Неужели еще одна бессонная ночь?(
Re: Выравнивание горизонтального меню по центру страницы
ИЕтестер - самая страшная прога, из придуманных человечеством! :) Объективности её тестов чуть больше, чем нисколько. Используйте ИЕколлекшн.
Re: Выравнивание горизонтального меню по центру страницы
Действительно, я это здесь упустил. На самом деле все намного проще. Применяем к контейнеру div свойство position:relative и проблема исчезает. Поправки уже внес в статью, спасибо :).
Re: Выравнивание горизонтального меню по центру страницы
О, спасибо! Теперь это самый крутой код в интернете))
Re: Выравнивание горизонтального меню (или пейджера) по ...
Ипическая сила! Я то каждый раз центрировал отступом через свойство margin! Разреши пожмать тебе руку за ЭТО творение! Терь всегда буду им пользоваться!
Re: Выравнивание горизонтального меню (или пейджера) по ...
Вот засада!... :( У меня в в некоторых элементах li есть вложенные пункты меню (выпадающее подменю) в тегах div:
И свойство overflow:hidden скрывает их напрочь. Вернуть их я не смог.
Re: Выравнивание горизонтального меню (или пейджера) по ...
Предназначение свойства overflow:hidden - это предотвратить появление горизонтальной полосы прокрутки на СТРАНИЦЕ.
Поэтому думаю, тут стоит перенести его из обертывающего меню тега div в тег, обертывающий всю страницу или даже в тег body.
Попробуйте, у меня получилось.
Re: Выравнивание горизонтального меню (или пейджера) по ...
О! так работает! Большое спасибо!
Re: Выравнивание горизонтального меню (или пейджера) по ...
Респект и уважуха! Я мозг сломал выравнивать меню по центру, пару раз хотел поюнуть и в таблицу засунуть :) но не стал, решил найти таки ответ... и нашел!
Re: Выравнивание горизонтального меню (или пейджера) по ...
Спасибо большое!!! Очень помогли, долго не могла выровнять пейджер по центру, так как много дивов других. Позиционирование самое сложное для новичков...
Хи-хи))
Re: Выравнивание горизонтального меню (или пейджера) по ...
Большое спасибо за статью.
Очень помогло.
Re: Выравнивание горизонтального меню (или пейджера) по ...
не могли бы вы подсказать как доработать код для случая закруглённых углов? я пытаюсь добавить блоки с изображением-фоном углов и позиционировать их абсолютно относительно родительского div-а, но почему то родителем считается окно браузера. вот страничка [url=http://h23771.srv3.test-hf.ru/test23/nav.php]http://h23771.srv3.test-hf.ru/test23/nav.php[/url], на которой реализовано то, что я описал
Re: Выравнивание горизонтального меню (или пейджера) по ...
Думаю, самое правильное - присвоить первому и последнему элементам списка классы, допустим .first и .last, и для них прописать в цсс свои свойства для фона.
Re: Выравнивание горизонтального меню (или пейджера) по ...
спасибо большое, так и сделал.
но вообще говоря не очень удобно на cms натягивать когда .first и .last есть