Простое горизонтальное меню на css. Горизонтально центрированное меню с использованием только CSS

От автора: приветствую вас на нашем блоге о сайтостроении. Это цикл статей, посвященный новой спецификации и сегодня я бы хотел вам рассказать, как сделать в html5 меню и чем этот процесс отличается от такого же в предыдущих версиях языка.

В чем отличия

Прежде всего я хотел бы сказать, что спецификация не является уж такой и новой – она начала свое становление еще в 2009 году. Собственно, с тех пор происходит постоянное развитие – в html5 появляются новые возможности, современные браузеры все больше и больше поддерживают эти самые возможности, так что уже скоро можно будет говорить о полной поддержке этой технология, хотя она и не является чем-то единым целым, это скорее набор новых возможностей, каждая из которых является самостоятельной.

Ну хорошо, а чем же отличается создание главной навигации (меню), раз уж вы читаете статью на эту тему, то какие-то отличия точно должны быть. Ну а как раньше создавалось меню? Обычно для этого использовали маркированный список, который помещали в дополнительный контейнер для всей навигации – обычный div.

Так вот, с появлением новых тегов теперь можно поступить более правильно – вместо тега div обернуть меню в nav – новый семантический элемент, который создан специально для того, чтобы собирать в него самые главные ссылки, группировать их вместе.

В nav можно поместить как список, так и просто набор ссылок. Мне кажется, это даже более простое и правильное решение, хотя во многих шаблонах по-прежнему видно реализацию меню с помощью тегов ul, li, a.

Интересно, что контейнер nav создан именно для приоритетных ссылок на странице. На самом деле таких конйтенеров на странице может быть больше одного, но помещать в них стоит только те ссылки, которые действительно формируют главную навигацию (например, верхнее главное меню и его дубль в футере страницы).

Как сделать с помощью html5 горизонтальное меню

Даже не нужно никакого обрамления в список, все изначально будет отображаться в одну строку, так как ссылки – строчные элементы.

Другое дело, что по оформлению они очень ограничены из-за своих строчных свойств. Вы сможете оперировать только такими свойствами как: цвет, размер шрифта, внешние отступы. Если же вы захотите задать определенный фоновый цвет, сделать разделители и добавить внутренние отступы (либо определить размер каждого пункта меню) то со строкой так сделать не получится.

Тут нам придется преобразовывать наши пункты в блочные элементы. Для этого им нужно записать свойство:

display : block ;

Теперь они идут сверху вниз, то есть наша навигация стала вертикальной. Чтобы вновь превратить ее в горизонтальную, нужно добавить определенные свойства. Например, вместо блочного типа определить для них блочно-строчный, либо задать им (float: left). Читайте подробнее об этих способах .

Вертикальная навигация

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

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

a{ text-decoration: none; color: #fff; padding: 5px; font-size: 22px; display: block; background: linear-gradient(to right, rgba(96,108,136,1) 0%,rgba(63,76,107,1) 100%); width: 200px; text-align: center }

text - decoration : none ;

color : #fff;

padding : 5px ;

font - size : 22px ;

display : block ;

background : linear - gradient (to right , rgba (96 , 108 , 136 , 1 ) 0 % , rgba (63 , 76 , 107 , 1 ) 100 % ) ;

width : 200px ;

text - align : center

Задача

Сделать горизонтальное меню, пункты которого имеют произвольный наклон (рис. 1).

Рис. 1. Вид меню с наклонными пунктами

Решение

За трансформацию элемента отвечает стилевое свойство transform , в качестве его значения используется функция skewX , которая и задаёт нужный наклон. Угол наклона проще устанавливать в градусах, к примеру, 30deg - это 30º от вертикали. Трансформация действует и на все дочерние элементы, поэтому текст внутри элемента также будет наклонён, что не лучшим образом отражается на его читабельности и красоте. Поэтому к тексту важно ещё раз применить наклон, но уже в другую сторону, для этого достаточно просто поменять знак перед значением градусов.

Браузеры поддерживают свойство transform преимущественно со своими префиксами, так что для универсальности в стилях следует повторить его несколько раз с одним и тем же значением, добавляя -moz- для Firefox, -webkit- для Safari и Chrome, -o- для Opera и -ms- для браузера Internet Explorer как показано в примере 1.

Пример 1. Наклон пункта меню

HTML5 CSS3 IE Cr Op Sa Fx

Меню

  • Джокер
  • Пазузу
  • Палпатин
  • Доктор Дум

В данном примере горизонтальное меню создаётся с помощью маркированного списка. Чтобы список был именно горизонтальным, в стилях к элементу li добавляется свойство display со значением inline-block . Для наклона применяется свойство transform с функцией skewX и значением -30º. К ссылкам внутри списка также применяется это свойство, но уже с положительным значением 30º, это обеспечивает правильное, а не наклонное отображение букв.

Браузеры Chrome, Safari и Firefox используют свойство transform для блочных или строчно-блочных элементов, поэтому для ссылок задано свойство display со значением block .

Спецификация

Описание

Тег

предназначен для отображения списка пунктов меню. Аналогично тегам
    и
      внутри контейнера список формируется с помощью тегов
    • .

      В HTML4 тег

      вышел из употребления, вместо него рекомендуется использовать тег
        . В HTML5 тег вновь включен, но уже в другом качестве. Теперь он выступает контейнером для тега и создания меню.

        Синтаксис

        HTML
      • пункт меню
      • пункт меню
      • HTML5 ...

        Атрибуты

        Устанавливает видимую метку для меню. Задает тип меню.

        Закрывающий тег

        Обязателен.

        Валидация

        Использование этого тега осуждается спецификацией HTML4, валидный код получается только при использовании переходного . В HTML5 применение тега

        корректно.

        HTML 4.01 IE Cr Op Sa Fx

        Тег MENU

        В этом выпуске:

      • Русская кухня. Уха бурлацкая
      • Украинская кухня. Вареники
      • Молдавская кухня. Паприкаш
      • Кавказская кухня. Суп-харчо
      • Прибалтийская кухня. Вертиняй
      • Результат данного примера показан на рис. 1.

        Рис. 1. Вид списка, созданного с помощью тега

        HTML5 IE Cr Op Sa Fx

        Тег MENU

      • Хабр, привет!

        На Сodepen появляется много хороших решений от разных специалистов, и я считаю, что лучшие из них нужно собирать в одном месте. Поэтому 2 года назад начал сохранять у себя на компьютере интересные скрипты по разным тематикам.

        Раньше я их выкладывал в группе продукта облачной IDE mr. Gefest , это были сборки из 5-8 решений. Но теперь у меня стало скапливаться по 15-30 скриптов в разных тематиках (кнопки, меню, подсказки и так далее).

        Такие большие наборы следует показывать большему числу специалистов. Поэтому выкладываю их на Хабр. Надеюсь они будут Вам полезны.

        В этом обзоре мы рассмотрим многоуровневые меню.

        Flat Horizontal Navigation

        Красивая навигационная панель с плавно появляющимся подменю. Код хорошо структурирован, используется js. Судя по использованным возможностям, работает в ie8+.
        http://codepen.io/andytran/pen/kmAEy

        Material Nav Header w/ Aligned Dropdowns

        Адаптивная панель ссылок с двухколонным подменю. Все сделано на css и html. Применены css3 селекторы, которые не поддерживаются в ie8.
        http://codepen.io/colewaldrip/pen/KpRwgQ

        Smooth Accordion Dropdown Menu

        Стильное вертикальное меню с плавно раскрывающимися элементами. Используется transition, transform js-код.
        http://codepen.io/fainder/pen/AydHJ

        Pure CSS Dark Inline Navigation Menu

        Темная вертикальная навигационная панель с иконками из ionicons. Применяется javascript. В ie8 скорее всего будет работать без анимации.
        http://codepen.io/3lv3n_snip3r/pen/XbddOO

        Pure CSS3 Mega Dropdown Menu With Animation

        Стильное меню с двумя форматами вывода: горизонтальным и вертикальным. Используются иконки и css3-анимация. В ie8 точно будет ужасно выглядеть, но зато в других браузерах все круто.
        Ссылка на вертикальную: http://codepen.io/rizky_k_r/full/sqcAn/
        Ссылка на горизонтальную: http://codepen.io/rizky_k_r/pen/xFjqs

        CSS3 Dropdown Menu

        Горизонтальное меню с большими элементами и выпадающим списком ссылок. Чистый и минималистичный код без js.
        http://codepen.io/ojbravo/pen/tIacg

        Simple Pure CSS Dropdown Menu

        Простое, но стильное горизонтальное меню. Используется font-awesome. Все работает на css и html, без js. В ie8 будет работать.
        http://codepen.io/Responsive/pen/raNrEW

        Bootstrap 3 mega-dropdown menu

        Отличное решение для интернет-магазинов. Отображает несколько уровней категорий и большие изображения (например, товар по акции). В его основе лежит boostrap 3.
        http://codepen.io/organizedchaos/full/rwlhd/

        Flat Navigation

        Стильная навигационная панель с плавным подменю. В старых браузерах отобразится с проблемами.
        http://codepen.io/andytran/pen/YPvQQN

        3D nested navigation

        Горизонтальное меню с очень крутой анимацией без js!
        http://codepen.io/devilishalchemist/pen/wBGVor

        Responsive Mega Menu - Navigation

        Горизонтальное адаптивное меню. Выглядит неплохо, но мобильная версия немного "хромает". Используется css, html и js.
        http://codepen.io/samiralley/pen/xvFdc

        Pure Css3 Menu

        Оригинальное меню. С простым и чистым кодом без js. Применяйте для "вау" эффектов.
        http://codepen.io/Sonick/pen/xJagi

        Full CSS3 Dropdown Menu

        Красочное выпадающее меню с одним уровнем вложенности. Используются иконки из font-awesome, html и css.
        http://codepen.io/daniesy/pen/pfxFi

        Css3 only dropdown menu

        Достаточно неплохое горизонтальное меню с тремя уровнями вложенности. Работает без js.
        http://codepen.io/riogrande/pen/ahBrb

        Dropdown Menus

        Минималистичное меню с оригинальным эффектом появления вложенного списка элементов. Радует, что это решение тоже без javascript.
        http://codepen.io/kkrueger/pen/qfoLa

        Pure CSS DropDown Menu

        Примитивное, но эффективное решение. Только css и html.
        http://codepen.io/andornagy/pen/xhiJH

        Pull Menu - Menu Interaction Concept

        Интересный концепт меню для мобильного телефона. Я такого ещё не видел. Используется html, css и javascript.
        http://codepen.io/fbrz/pen/bNdMwZ

        Make Simple Dropdown Menu

        Чистый и простой код, без js. В ie8 точно работать будет.
        http://codepen.io/nyekrip/pen/pJoYgb

        Pure CSS dropdown

        Решение неплохое, но слишком уж много используется классов. Радует, что нет js.
        http://codepen.io/jonathlee/pen/mJMzgR

        Dropdown Menu

        Симпатичное вертикальное меню с минимальным javascript-кодом. JQuery не используется!
        http://codepen.io/MeredithU/pen/GAinq

        CSS 3 Dropdown Menu

        Горизонтальное меню с дополнительными подписями может хорошо украсить Ваш сайт. Код простой и понятный. Javascript не применяется.
        http://codepen.io/ibeeback/pen/qdEZjR

        Красивое решение с большим количеством кода (html, css и js). Придумано 3 формата подменю. Для интернет-магазинов решение хорошо подходит.
        http://codepen.io/martinridgway/pen/KVdKQJ

        CSS3 Menu Dropdowns (особенное решение)!

        Темное горизонтальное меню с тринадцатью (13) вариантами анимации! Обязательно советую ознакомиться, пригодится в быту.
        http://codepen.io/cmcg/pen/ofFiz

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

        От автора: всех приветствую. Почему-то выпадающее меню у веб-мастеров ассоциируется со скриптами, но уже давно сделать такую навигацию можно абсолютно спокойно на чистом css. Причем такое меню будет ничем не хуже. Сегодня я вам покажу, как создать в css выпадающее меню. Поделюсь, так сказать, рецептом.

        План урока и разметка нашего меню

        В общем-то, сначала определимся с тем, как будем создавать само меню. В html5 стандартным способом считается создавать его в контейнере nav с помощью маркированного списка. Давайте именно так и сделаем. Маркеры мы позже уберем с помощью css, в меню они нам совершенно не нужны.

        Собственно, я сразу напишу в html разметку с вложенными списками. То есть наши список будет двухуровневым – в нем будут другие списки. А именно, на каждый пункт 1 список, который и будет формировать выпадающее меню.

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

        Собственно, вот она, вся разметка:

        < nav id = "nav" >

        < ul >

        < li > < a href = "#" > Пункт1 < / a >

        < ul class = "second" >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < / ul >

        < / li >

        < li > < a href = "#" > Пункт2 < / a >

        < ul class = "second" >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < / ul >

        < / li >

        < li > < a href = "#" > Пункт3 < / a >

        < ul class = "second" >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < / ul >

        < / li >

        < li > < a href = "#" > Пункт4 < / a >

        < ul class = "second" >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < li > < a href = "#" > Подпункт< / a > < / li >

        < / ul >

        < / li >

        < / ul >

        < / nav >

        Я понимаю, что она огромна. В этом-то и проблема вложенных списков, что требуется писать много кода. Но учитывайте тот факт, что мы делаем 4 основных пункта и для каждого будет выпадающее меню.

        Собственно, я задал всей навигации идентификатор nav, а всем вложенным спискам – стилевой класс second, чтобы понимать, что они являются вложенными.

        Отлично, разметка у нас готова, можно посмотреть на результат:

        Да уж, выглядит ужасно. Но сейчас мы включим в работу css и уже через несколько минут наша навигация преобразится. Давайте работать.

        Пишем css-стили

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

        *{ margin: 0; padding: 0; }

        margin : 0 ;

        padding : 0 ;

        #nav{ height: 70px; } #nav ul{ list-style: none; }

        #nav{

        height : 70px ;

        #nav ul{

        list - style : none ;

        Теперь нам нужно, собственно, решить, каким будет наше меню. Горизонтальным или вертикальным? Я предлагаю сначала сделать горизонтальное и посмотреть все на его примере. Для этого нужно написать такие стили:

        #nav > ul > li{ float: left; width: 180px; position: relative; }

        #nav > ul > li{

        float : left ;

        width : 180px ;

        position : relative ;

        Заметьте, что с помощью знака > мы обращаемся к пунктам списка, который непосредственно вложены в ul, а тот непосредственно вложен в nav. Это очень важно, так как позволяет не применить стиль к пунктам вложенных списков. Дело в том, что по моей задумке в главном списке пункты будут располагаться горизонтально, а во вложенных – вертикально.

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

        В любом случае, вышеприведенный код, я надеюсь, вы понимаете. Он заставляет пункты главного списка прижиматься к левому краю, так что все они встают в одну строку, хотя и являются блочными элементами. Также я задал им явную ширину и относительное позиционирование.

        Для чего позиционирование? Оно необходимо для того, чтобы потом абсолютно позиционировать вложенные списки. Если вы изучали позиционирование в css, то наверняка знаете, что если задать блоку относительное позиционирование, то все элементы в нем можно будет позиционировать абсолютно внутри именно этого блока, а не всего окна браузера.

        Тем временем, вот что у нас уже получилось:

        По этому скриншоту вы можете уже представить себе примерный результат. Конечно, нам еще предстоит красиво оформить пункты, чтобы глаза не умоляли о пощаде при просмотре навигации.

        #nav li a{ display: block; background: #90DA93; border: 1px solid #060A13; color: #060A13; padding: 8px; text-align: center; text-decoration: none; } #nav li a:hover{ background: #2F718E; }

        #nav li a{

        display : block ;

        background : #90DA93;

        border : 1px solid #060A13;

        color : #060A13;

        padding : 8px ;

        text - align : center ;

        text - decoration : none ;

        #nav li a:hover{

        background : #2F718E;

        Во-первых, сами ссылки нужно сделать блочными. Это необходимо для того, чтобы работали внутренние отступы и корректно применялись все свойства. Далее указываю цвета фона, текста, параметры рамки, внутренние отступы и выравнивание текста по центру. Наконец, отменяю подчеркивание ссылок.

        Все эти параметры не обязательно прописывать так, как это сделал я. Цвета вы можете выбрать произвольно, рамку сделать другую или вообще не использовать, отступы можно уменьшать или увеличивать.

        Заметьте, что в данном случае мы не использовали знак >, поэтому указанные правила применятся ко всем ссылкам, в том числе и тем, что находятся во вложенных пунктах. Итак, теперь имеем следующее:

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

        #nav li .second{ display: none; position: absolute; top: 100%; }

        #nav li .second{

        display : none ;

        position : absolute ;

        top : 100 % ;

        Во-первых, скрываем полностью вложенные списки. Во-вторых, задаем им абсолютное позиционирование и координату top: 100%. Это означает, что выпадающее меню будет отображаться четко под основным пунктом, которому принадлежит, четко под 100% высоты этого пункта.

        Теперь мы видим на веб-странице только основное меню, что нам и нужно.

        Реализуем выпадение

        Нам осталось сделать самое главное – реализовать само выпадение. В этом нет ничего сложного, смотрите на этот код:

        #nav li:hover .second{ display: block; }

        #nav li:hover .second{

        display : block ;

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

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

        #nav li li{ width: 180px; }

        #nav li li{

        width : 180px ;

        Все, проблема решена:

        Все работает отлично. При наведении на основной пункт появляется соответствующее ему выпадающее меню. Если убрать курсор в сторону – оно пропадает. Если перевести курсор на сами вложенные пункты, то можно будет по ним кликнуть и перейти в нужный раздел сайта. Таким образом, мы сделали с вами очень простое и легкое выпадающее меню абсолютно без скриптов.

        Переделываем меню в вертикальное

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

        Во-первых, вам нужно будет убрать float:left у главных пунктов списка. Именно это свойство способствует тому, что наши пункты отображаются в одну строку, но зачем нам это, если навигация должна быть вертикальной?

        Теперь остается изменить правила для селектора #nav li .second, то есть для вложенных списков, а именно, их нужно немного по-другому позиционировать. Вот так:

        #nav li .second{ display: none; position: absolute; left: 100%; top: 0; }

        #nav li .second{

        display : none ;

        position : absolute ;

        left : 100 % ;

        top : 0 ;

        То есть необходимо прописать две координаты вместо одной. Во-первых, в случае с горизонтальной навигацией я говорил, что по задумке пункты вложенных меню должны отображаться под основными пунктами. В случае с вертикальным меню это не подходит – пункты должны отображаться сбоку.

        Поэтому изменяем top: 100% на left: 100%. Кроме этого, координата top нам тоже нужна. Задаем ей 0, чтобы вложенное меню находилось на одном уровне с пунктом, которому соответствуют.

        Все, теперь все работает так, как надо. Можете протестировать. Как видите, я не врал, когда говорил, что придется переписать всего несколько строк кода.

        Горизонтальное меню с несколькими уровнями

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