Как правильно сверстать меню
Дата публикации: 10.02.2010
Меню — это неотъемлемая часть каждого сайта, ну или почти каждого. Меню (или навигация) позволяет быстро перемещаться по основным разделам сайта, что очень похоже на оглавление в книгах. Особенно сходство заметно на картах сайта (разновидность навигации):
Меню может выглядеть по разному. Может быть горизонтальным
…вертикальным
…многоуровневыми
…содержащими пиктограммки
…меню может быть очень разнообразным и сверстать его можно очень по разному: таблицами, блоками, просто сcылками, возможно ссылками с <br / >…можно придумать массу «извращенных» способов и большинство из них будут соответствовать принципам блочной (бестабличной) верстки. Но в профессиональных кругах почему-то считается, что навигация должна быть на основе неупорядоченных списков — теги <ul> и <li>.
Почему в навигации следует использовать ul?
Первое объяснение приходит, если просто логически подумать: меню — это перечень ссылок (разделов). А если не просто подумать, а заглянуть в словарь, например Ожегова:
- Перечень — Перечисление кого- чего-нибудь по порядку
- Перечень — Список с таким перечислением
становится ясно, что мы на правильном пути (для тех кто забыл, семантический код — это в первую очередь логически (по смыслу) правильно построенный код).
Если мучают сомнения, обратимся за помощью к авторитетам. W3C о списках:
Списки могут содержать:
- не упорядоченный перечень
- упорядоченный перечень
- навигацию
- определения
Был еще такой тег <menu>, специально предназначенный для построения меню. Но сейчас он запрещен и сами отцы веб стандартов настоятельно рекомендуют вместо <menu> использовать <ul>. По крайней мере пока не оживет HTML5, списки — самый подходящий элемент для навигации.
Как использовать списки для построения навигации?
Список в не обработанном виде может выглядеть пугающе не похожим на меню, который нарисовал дизайнер
Отчаиваться не стоит, стоит учиться. CSS способно творить чудеса.
Пойдем по пути от простого к сложному.
Простое горизонтальное меню
<ul class="navigation"> <li><a href="#">Главная</a></li> <li><a href="#">HTML и CSS приемы</a></li> <li><a href="#">Обучение</a></li> <li><a href="#">HTML справочник</a></li> </ul>
Если у тебя пункты меню являются обычными ссылками (как на mpbox.ru), тогда достаточно просто избавиться от маркеров и выстроить пункты в один ряд.
.navigation { list-style: none; /* прячем маркеры */ } .navigation li { display: inline; /* выстраиваем элементы списка в один ряд */ margin-right: 15px; /* делаем отступ чтобы пункты меню не сливались */ }
Демо пример. Кстати о маркерах, не припомню ни одного меню, где бы они использовались. Вывод — придется часто прятать маркеры и я бы рекомендовал выносить их устранение в reset.css. Для тех кто не в курсе, list-style задает вид маркера, а так же позволяет его скрыть.
По умолчанию элементы списка (<li>) являются… элементами спискаdisplay: list-item. А каждый такой элемент начинается с новой строки. Чтобы это исправить, меняем отображение элемента на строчный (display: inline).
Заметка
Можно конечно выстроить в одну строку элементы списка еще несколькими способами (например, с помощью float: left или display: inline-block), но другие способы усложняют жизнь когда дело касается вопросов кроссбраузерности. Самый простой и предсказуемый способ выстроить элементы в один ряд — display: inline.
Горизонтальное меню с ссылками в виде блоков
<ul class="navigation"> <li><a href="#">Главная</a></li> <li><a href="#">HTML и CSS приемы</a></li> <li><a href="#">Обучение</a></li> <li><a href="#">HTML справочник</a></li> </ul>
HTML оставляем без измененений, а CSS немного усложниться:
.navigation { list-style: none; /* прячем маркеры */ } .navigation li { float: left; /* выстраиваем элементы списка в один ряд */ margin-right: 15px; /* делаем отступ чтобы пункты меню не сливались */ } .navigation li a { display: block; /* меняем отображение на блок, чтобы иметь возможность задавать внутренние отступы */ padding: 3px 5px; background: #ccc; color: #000; position: relative; /* для IE6, чтобы ссылка была кликабильной по всей своей площади */ } .navigation li a:hover { background: #999; color: #fff; }
Демо пример. В данном примере выстраиваем меню вряд используя float, при этом не стоит забывать, что теперь следующие за меню (<ul>) элементы, будут пытаться его обтекать. Это можно устранить используя clearfix или любой другой способ обновления потока.
Верстка вертикального меню
<ul class="navigation"> <li><a href="#">Главная</a></li> <li><a href="#">HTML и CSS приемы</a></li> <li><a href="#">Обучение</a></li> <li><a href="#">HTML справочник</a></li> </ul>
HTML оставляем тот же. Работаем только с CSS:
.navigation { list-style: none; /* прячем маркеры */ width: 200px; /* ограничиваем ширину меню */ } .navigation li { margin-bottom: 5px; /* делаем отступ чтобы пункты меню не сливались */ zoom: 1; /* чтобы в IE отступ между пуктами был как у всех браузеров */ } .navigation li a { display: block; /* меняем отображение на блок, чтобы иметь возможность задавать внутренние отступы */ padding: 3px 5px; background: #ccc; color: #000; position: relative; /* для IE6, чтобы ссылка была кликабильной по всей своей площади */ } .navigation li a:hover { background: #999; color: #fff; }
Меню с картинками
<ul class="navigation"> <li class="chrysler"><a href="#">Chrysler</a></li> <li class="audi"><a href="#">Audi</a></li> <li class="bugatti"><a href="#">Bugatti</a></li> </ul>
.navigation { list-style: none; /* прячем маркеры */ margin: 30px; } .navigation li { float: left; /* выстраиваем элементы списка в один ряд */ margin-right: 15px; /* делаем отступ чтобы пункты меню не сливались */ } .navigation li a { display: block; text-align: center; padding-top: 100px; /* внутренний остту чтобы текст был вне фона */ color: #ff0000; background-position: center top; /* выравниваем фон вверх и по центру */ background-repeat: no-repeat; width: 200px; /* размеры указываем чтобы картинки полностью отобразились */ height: 50px; } * html .navigation li a { /* хак для IE6, который иначе трактует блочную модель */ height: 150px; } .navigation .chrysler a { background-image: url(path-to/menu-chrysler.jpg); } .navigation .audi a { background-image: url(path-to/menu-audi.jpg); } .navigation .bugatti a { background-image: url(path-to/menu-bugatti.jpg); } .navigation li a:hover { color: #0000CC; }
Демо пример. Данную задачу можно реализовать разными способами. Прем, приведенный в этом примере, на мой взгляд самый простой, часто им пользуюсь. Обрати внимание, что в меню кликабилен не только текст ссылки, но и сама картинка. И при этом используется минимум элементов — еще раз подтверждает, что CSS это мощь.
Примеры проверены в:
Ложка дёгтя
К сожалению, нынешнее развитие технологий верстки не позволяет реализовать с помощью списков все задумки дизайнера. Поэтому на нынешний день, использование для меню списков — это не стандарт, а рекомендация, которую можно нарушить без последствий. Но я рекомендую прибегать к «нарушениям» только при крайней необходимости.
Заметка
Меню, которое нельзя реализовать на списках, встречается крайне редко.
Выводы
- меню следует верстать используя списки
- меню практически любой сложности и вида можно реализовать на <ul>
- если встретилось меню, которое нереально сверстать списками, не страшно, если будет сделано на чем-то другом
Материалы
По теме
- Выпадающее меню с помощью CSS
- Выравнивание горизонтального меню по середине
- Выравнивание навигации из блоков по центру