Вертикальное меню выпадающее меню на css: Вертикальное меню на CSS с выпадающим подменю по клику на плюсик
27.02.1973
Разное
Выпадающее меню на HTML и CSS
Выпадающее меню можно сделать на CSS не используя скрипты и модули. Просто дописываем несколько строк в CSS файл и готово. Несмотря на простоту меню будет достаточно универсальным. Стили подходить под произвольное количество уровней вложенности. Хоть два хоть десять уровней. Код при этом остаётся тем же. В статье описаны три вида меню, но если вы только начинаете разбираться в вёрстке советую читать сначала. Так будет проще понять.
- Вертикальное выпадающее меню
- Горизонтальное выпадающее меню с одним уровнем вложенности
- Горизонтальное меню с несколькими уровнями вложенности
Сначала сделаем HTML разметку для меню. Принято делать меню списком. Это не стандарт просто так сложилось.
<ul>
<li><a href="#">пункт 1</a>
<ul>
<li><a href="#">пункт 1.1</a></li>
<li><a href="#">пункт 1.2</a></li>
</ul>
</li>
<li><a href="#">пункт 2</a>
<ul>
<li><a href="#">пункт 2.
1 многа букаф</a></li>
<li><a href="#">пункт 2.2</a>
<ul>
<li><a href="#">пункт 2.2.1</a></li>
<li><a href="#">пункт 2.2.2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">пункт 3</a></li>
<li><a href="#">пункт 4</a></li>
<li><a href="#">пункт 5</a></li>
</ul>
HTML файл мы больше трогать не будем. Все дальнейшие изменения производятся только за счёт CSS. Первое что нам нужно сделать — скрыть вложенные пункты.
ul.nav li ul {display: none;}
Ещё нужно убрать маркеры но это дело вкуса.
ul.nav li {list-style: none;}
Чтобы вложенные пункты появлялись при наведении на родительский пункт используем псевдокласс :hover, при этом нужно сделать так что бы появлялись только пункты первого уровня вложенности. Для этого используем знак >
ul.nav li:hover > ul {display: block;}
В этой строчке заключается вся магия нашего выпадающего меню, поэтому разберём её подробнее. Благодаря псевдоклассу :hover, при наведении курсора на пункт меню, он же элемент списка li, для первого вложенного списка ul значение display станет block. Так открывается первый уровень вложенности. Если на этом уровне есть пункты содержащие подпункты, то при наведении на них также откроется только один вложенный уровень.
С основной механикой разобрались. Осталось переопределить место где будут появляться вложенные пункты. Для этого воспользуемся свойством position: absolute. При таком позиционировании отсчёт координат ведётся от края окна браузера если только для родительского элемента не задано свойство position с значением fixed, relative или absolute. В этом случае отсчёт ведётся от края родительского элемента.
Используя свойство position мы переместим вложенные пункты в право на расстояние равное ширине меню. В рассматриваемом способе есть одно ограничение. При позиционировании нам придётся жёстко задать ширину. С другой стороны вертикальное меню размещается в сайдбаре ширина которого заранее определена, поэтому привязка к ширине не должна вызвать проблем.
/* Вертикальное выпадающее меню*/
body{
background: #DCDCDC;
}
/*блок меню*/
ul{
margin: 0;
padding: 0;
}
ul.nav li {
background: #B3B3FF;
border: 1px solid #FFFFFF;
list-style: none;
width: 150px; /*ширина блока меню*/
}
ul.nav li a {
text-decoration: none;
display: block;
padding: 5px 5px 5px 15px;
}
ul.nav li ul {
display: none; /*скрываем вложенные пункты*/
}
/*Выпадающее меню*/
ul.nav li:hover {
/* позиционирование вложенных элементов
* будет расчитыватьться относительно
* родительского элемента
*/
position: relative;
background: yellow;
}
ul.nav li:hover > ul {
display: block;
}
ul.nav li:hover ul{
position: absolute;
top: 0; /*Задаём координаты для вложенных пунктов*/
left: 150px; /*меню раскрывается вправо*/
}
Вот что должно получиться в результате. демка
Для горизонтального меню мы будем так же применять позиционирование но есть несколько нюансов. Что бы сделать меню горизонтальным используем свойство float. Меню будет раскрываться вниз значит при позиционировании нужно учитывать высоту. Для начала сделаем меню с одним уровнем вложенности. Вложенное меню также будет горизонтальным. Для этого вложенное меню позиционируем относительно списка а не родительского пункта и задаём для него ширину.
/*Горизонтальное выпадающее меню с одним уровнем вложенности*/
body{
background: #DCDCDC;
}
/* Блок меню*/
ul{
margin: 0;
padding: 0;
}
ul.nav li {
background: #B3B3FF;
border-right: 1px solid #FFFFFF;
float: left; /*делаем меню горизонтальным*/
height: 30px;
list-style: none;
}
ul.nav li a {
text-decoration: none;
display: block;
padding: 5px 5px 5px 15px;
}
ul.nav li ul {
display: none; /*скрываем вложенные пункты*/
}
ul.nav li:hover {
background: yellow;
}
/*Выпадающее меню*/
ul.
nav {
position: relative;
background: #B3B3FF;
height: 30px;
width: 600px;
}
ul.nav li:hover > ul {
background: #D0E0FF;
border-top: 1px solid white;
display: block;
width: 600px;
position: absolute;
top: 30px;
left: 0;
}
Вот что получиться в итоге демка.
Созданное в предыдущем пункте меню также может быть многоуровневым но выглядит оно при этом не очень. На мой взгляд многоуровневое меню должно открываться следующим образом — первый уровень вниз остальные вправо. Здесь, в отличии от предыдущего горизонтального меню, вложенные пункты позиционируем относительно родительского пункта и задаём для них ширину. Ширина нам нужна для второго и последующих уровней вложенности. В этом меню мы возьмём понемногу от предыдущих и немного добавим нового.
/*Горизонтальное выпадающее меню a*/ body{ background: #DCDCDC; } /* Блок меню*/ ul{ margin: 0; padding: 0; } ul.nav li { background: #B3B3FF; border-right: 1px solid #FFFFFF; float: left; /*делаем меню горизонтальным*/ height: 30px; list-style: none; } ul.
nav li a { text-decoration: none; display: block; padding: 5px 5px 5px 15px; } ul.nav li ul { display: none; /*скрываем вложенные пункты*/ } ul.nav { /*задаём высоту и ширину меню*/ background: #B3B3FF; height: 30px; width: 600px; } /*Выпадающее меню*/ ul.nav li:hover { background: yellow; position: relative; } ul.nav li:hover > ul { border-top: 1px solid white; display: block; position: absolute; top: 30px; /*первый уровень меню раскрывается вниз*/ left: 0; } /*Второй и последующие уровни вложенности*/ ul.nav li ul li{ border-bottom: 1px solid white; height: auto; width: 150px; } ul.nav li:hover ul li ul{ position: absolute; top: 0; left: 150px; /*второй и последующие уровни расскрываются вправо*/ }
Вот так будет выглядеть наше многоуровневое меню демка.
Плавно открывающееся меню с помощью CSS. Вертикальное выпадающее меню на css: как его сделать
От автора: всех приветствую. Почему-то выпадающее меню у веб-мастеров ассоциируется со скриптами, но уже давно сделать такую навигацию можно абсолютно спокойно на чистом css. Причем такое меню будет ничем не хуже. Сегодня я вам покажу, как создать в css выпадающее меню. Поделюсь, так сказать, рецептом.
План урока и разметка нашего меню
В общем-то, сначала определимся с тем, как будем создавать само меню. В html5 стандартным способом считается создавать его в контейнере nav с помощью маркированного списка. Давайте именно так и сделаем. Маркеры мы позже уберем с помощью css, в меню они нам совершенно не нужны.
Собственно, я сразу напишу в html разметку с вложенными списками. То есть наши список будет двухуровневым – в нем будут другие списки. А именно, на каждый пункт 1 список, который и будет формировать выпадающее меню.
Тут есть важный момент, который заключается в том, что вам, возможно, не нужно каждый пункт делать выпадающим, а лишь некоторые. Без проблем, тогда в пунктах без выпадения просто не создаем вложенных списков.
Собственно, вот она, вся разметка:
Пункт1 Подпункт Подпункт Подпункт Пункт2 Подпункт Подпункт Подпункт Пункт3 Подпункт Подпункт Подпункт Пункт4 Подпункт Подпункт Подпункт |
Я понимаю, что она огромна. В этом-то и проблема вложенных списков, что требуется писать много кода. Но учитывайте тот факт, что мы делаем 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 ; 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 . 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, чтобы вложенное меню находилось на одном уровне с пунктом, которому соответствуют.
Все, теперь все работает так, как надо. Можете протестировать. Как видите, я не врал, когда говорил, что придется переписать всего несколько строк кода.
Горизонтальное меню с несколькими уровнями
Используя примерно такой же подход вы можете создать больше уровней меню, если это сильно необходимо. Например, давайте создадим для четвертого пункта главного меню список, который будет вложен в один из подпунктов.
Михаил сб, 09/20/2014 — 12:28
Что-то мой комментарий не виден — дублирую:
===========
Спасибо, но у меня (под Инт.Экспл-8) меню не выпадает. Т.е. не работает строка «ul.nav li:hover ul {display: block;}»
Подскажите, в чем дело?
Есть пожедания по изложению материала:
Хорошо бы в этой строке (ul.aaaaa li:hover ul {display: block;}) растолковать, какая ее часть отвечает за «выпадение меню», а какая — за скрывание пунктов более глубокого уровня вложенности
Хорошо бы в примерах каждую строку снабжать комментарием, что она делает.
В частности, неясно, зачем нужна строка «
Большой обзор красивых многоуровневых меню с codepen / Хабр
Хабр, привет!
На С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 [work for mobile touch screen]
Решение неплохое, но слишком уж много используется классов. Радует, что нет 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
KVdKQJ (автор очень долго думал над названием)
Красивое решение с большим количеством кода (html, css и js). Придумано 3 формата подменю. Для интернет-магазинов решение хорошо подходит.
http://codepen.io/martinridgway/pen/KVdKQJ
CSS3 Menu Dropdowns (особенное решение)!
Темное горизонтальное меню с тринадцатью (13) вариантами анимации! Обязательно советую ознакомиться, пригодится в быту.
http://codepen.io/cmcg/pen/ofFiz
П. С.
Надеюсь, Вам понравилась сборка из 23 решений. Если хотите и дальше их читать, то пройдите снизу опрос.
Всем приятной работы.
Вертикальное выпадающее меню для блога|Простые советы.
<style type=»text/css»> <!—
/* CSS Document */
ul#menu-v,
ul#menu-v li,
ul#menu-v ul {
margin: 0;
border: 0 none;
padding: 0;
width: 260px;
list-style: none;
}
ul#menu-v:after {
clear: both;
display: block;
font: 1px/0px serif;
content: «.»;
height: 0;
visibility: hidden;
}
ul#menu-v li {
float: left;
display: block !important;
display: inline;
position: relative;
border:#ddcca2 1px solid;
}
ul#menu-v li ul li {
border:none;
border-bottom:#991500 2px solid;
}
/* Root Menu */
ul#menu-v a {
padding: 0 6px;
display: block;
background: #ebe0c7;/цвет коробки/
color: #991500;/цвет названия рубрик/
font: bold 12px/28px Verdana, Arial;
text-decoration: none;
height: auto !important;
height: 1%;
}
ul#menu-v a:hover,
ul#menu-v li:hover a,
ul#menu-v
li. iehover a {
background: #991500;
color: #ebe0c7;
}
/* 2nd Menu */
ul#menu-v li:hover li a,
ul#menu-v li.iehover li a {
background: #ebe0c7;
color: #991500;
border:#ddcca2 1px solid;
}
ul#menu-v li:hover li a:hover,
ul#menu-v li:hover li:hover a,
ul#menu-v li.iehover li a:hover,
ul#menu-v li.iehover li.iehover a {
background: #991500;
color: #ebe0c7;
border:#ebe0c7 1px solid;
}
ul#menu-v ul,
ul#menu-v ul ul,
ul#menu-v ul ul ul {
display: none;
position: absolute;
top: 0;
left: 240px;
}
ul#menu-v li:hover ul ul,
ul#menu-v li:hover ul ul ul,
ul#menu-v li.iehover ul ul,
ul#menu-v li.iehover ul ul ul {
display: none;
}
ul#menu-v li:hover ul,
ul#menu-v ul li:hover ul,
ul#menu-v ul ul li:hover ul,
ul#menu-v
li. iehover ul,
ul#menu-v ul li.iehover ul,
ul#menu-v ul ul li.iehover ul {
display: block;
}
—> </style>
<ul id=»menu-v»>
<li><a href=»#»>Вертикальное</a>
<ul>
<li><a href=»#»>Ссылка 1</a></li>
<li><a href=»#»>Ссылка 2</a></li>
</ul>
</li>
<li><a href=»#»>CSS</a>
<ul>
<li><a href=»#»>Ссылка 1</a></li>
<li><a href=»#»>Ссылка 2</a></li>
<li><a href=»#»>Ссылка 3</a></li>
<li><a href=»#»>Ссылка 4</a></li>
<li><a href=»#»>Ссылка 5</a></li>
</ul>
</li>
<li><a href=»#»>Меню</a>
<ul>
<li><a href=»#»>Ссылка 1</a></li>
<li><a href=»#»>Ссылка 2</a></li>
</ul>
</li>
</ul>
«Умное» раскрывающееся вертикальное меню на jquery за 2 минуты
Сейчас поговорим о том, как за 2 минуты сделать своё выпадающее меню, не обделённое мозгами, на скриптах, не прибегая к дополнительным модулям.
Допустим, у нас есть такое праймари меню:
- Топ 100
- Графика
- Абстракция
- Кино
- Компьютерная графика
Задача.
При нажатии на пункт меню, который не имеет подменю, должна открываться новая страница (как в обычном меню). А если пункт меню имеет подменю, то страница не должна открываться, а должно выезжать подменю. Надо написать «умный» скрипт, который будет за этим следить.
Решение
Сначала выводим в нужное нам место праймари меню. Можно через блок, можно через page.tpl.php, кому как удобнее. Я обычно вывожу вторым способом:
<?php if ($primary_links): ?> <div id = "menu"><?php print menu_tree('primary-links'); ?></div> <?php endif; ?>
В общем, вывели меню. Для него подойдёт следующий css:
div#menu ul { padding: 0; } div#menu ul li { display: block; border-bottom: 1px solid #211f1b; margin-bottom: 5px; padding: 0; } div#menu ul li a { color:#211F1B; display:block; font-family:Verdana; font-size:18px; font-weight:bold; padding:5px 0; } div#menu ul li a:hover, div#menu ul li a.active, div#menu ul li a:active { color: #005693; text-decoration: none; outline: none; } div#menu ul ul { display: none; /* собственно, самое важное :) */ } div#menu ul ul li { border: none; margin: 0; } div#menu ul ul li a { font-size: 11px; padding-left: 20px; } div#menu ul ul li a:hover, div#menu ul ul li.active-trail a { background: #b7b7b7; color: #fff; } div#menu ul ul li.active-trail ul li a { background: #fff; color: #000; }
Теперь осталось создать скрипт, который будет раздвигать пункты меню, имеющие подменю. Создаём файл menu.js и добавляем туда такой текст:
$(document).ready(function() { $('div#menu>ul>li>a').click(function() { if ($(this).parent().find('ul').length) { $(this).parent().find('ul').slideToggle(200); return false; } }); });
Подключаем наш скрипт в шаблон. Чистим кэш. Проверяем, наслаждаемся.
Таким же образом можно сделать и горизонтальное меню, слегка поменяв css.
Создание меню html / css
Основы верстки
Чаще всего меню создается на основе не упорядоченных списков ul
. В каждый пункт li
вкладывается гиперссылка a
.
Можно создавать меню и на основе блоков div
, таблиц table
или списков определений dl
.
Но традиционной является конструкция ul
.
Код простейшего меню будет выглядеть так:
<ul> <li><a href="#/">пункт 1</a></li> <li><a href="#/">пункт 2</a></li> <li><a href="#/">пункт 3</a></li> <li><a href="#/">пункт 4</a></li> <li><a href="#/">пункт 5</a></li> </ul>×
Примечание
В процессе разработки удобно указывать адрес гиперссылки — #/
. Во-первых, она никуда не ведет, а во-вторых — не происходит перехода к началу страницы.
Целью гиперссылки будет соответствующая страница вашего сайта или внешняя ссылка. Адрес внутренней страницы может быть как абсолютным, так и относительным. Внешней ссылки — только абсолютный. (Если забыли — смотрите Абсобютные и относительные ссылки).
Хорошим тоном считается все стили сайта оформлять одним сжатым файлом. Но на время разработки гораздо удобнее иметь отдельные файлы для определенных элементов страницы, в данном случае для навигационного меню.
Поэтому предварительно нужно создать файл, например my-menu.css, и подключить его.
<!-- Подключение таблицы стилей --> <!DOCTYPE html> <html> <head> ... <title>Создание меню</title> <link rel="stylesheet" href="css/MAIN.css" type="text/css" /> <link rel="stylesheet" href="css/my-menu.css" type="text/css" /> ... </head> <body> ... </body> </html>
Позже код можно будет перенести в общий файл, а этот удалить (или отключить).
Как прописываются стилевые правила для меню
Необходимо создать классы, и прописывать стили уже для них. Потому что если задавать стили непосредственно для тегов, например:
/* Не желательно! */ ul li a {color: #f00;}
то это правило будет распространяться и на все ссылки, включенные в списки за пределами меню! Кроме того, на сайте может быть несколько меню различного оформления.
Вторая причина, по которой желательно работать с классами, а не с тегами напрямую — возможность разбить стили по группам. За каждую тематическую группу стилей будет отвечать свой класс.
Например, можно создать класс .menu_color
, который будет отвечать за цветовое оформление. В дальнейшем это значительно упростит работу по изменению цветового оформления меню.
Каким тегам нужно присваивать классы
Хороший вопрос. Для начала, неплохо создать дополнительный контейнер-обертку и присвоить класс ему.
Да, это дополнительная разметка, но оформлять меню будет гораздо удобнее. Кроме того, если в качестве контейнера использовать не
div
, а nav
, то верстка будет более семантической (осмысленной) и удобной для поисковых систем (ПС), что является несомненным плюсом. Второй класс присваиваем тегу ul
.
<nav> <ul> <li><a href="#/">пункт 1</a></li> <li><a href="#/">пункт 2</a></li> <li><a href="#/">пункт 3</a></li> <li><a href="#/">пункт 4</a></li> <li><a href="#/">пункт 5</a></li> </ul> </nav>
Почему именно так?
Присвоение класса .menu_color
тегу nav
дает больше возможности для оформления, чем присовение его тегу ul
, а класс .my_menu
отвечает только за разметку меню и никакого отношения к содержащему контейнеру иметь не должен.
При этом всегда надо держать в уме, что навигационный блок находится в определенном внешнем блоке сайта и его местоположение и некоторые свойства, например связанные с внешними отступами или направлением выпадения подменю (подробнее об этом в материале «Выпадающее меню») зависят от внешних классов глобальной разметки сайта.
Какие имена должны быть у классов
Осмысленные. В идеале, любое имя класса должно давать представление об объекте и назначении. В приведенном выше примере используются классы nav.menu_color
и ul.my_menu
.
Первый отвечает за цветовое оформление всех элементов и, в тоже время, дает понять что относится к меню.
Второй идентифицирует список как собственно меню.
Внимание!
Старайтесь выбирать имена для классов не только внятные, но и уникальные. В противном случае они могут конфликтовать с уже существующими классами.
Имеено по-этому я выбрал класс .my_menu
, так как на сайте уже есть класс .menu
со своими стилями.
Это то, чем никогда не озадачиваются начинающие верстальщики, а опытные часто пренебрегают … А потом, когда нужно внести изменения в уже созданное меню чтобы адаптировать его для другого сайта, или вывести в другой позиции — долго и нудно переделывают.
На самом деле, все очень просто. Изначально, на этапе создания нужно группировать стили тематически и включать их в соответствующие классы.
Например, за цветовое оформление у нас отвечает класс .menu_color
/* === Группа цветового оформления === */ /* Цвет фона менд */ .menu_color { background: gray; } /* Оформление пункта меню */ .menu_color > ul > li > a { background: transparent; color: #f5f5f5; } ... /* === Группа разметки основного меню === */ /* Сброс и установка стилей по умолчанию */ .my_menu { list-style: none; margin: 0; padding: 0; } /* Разметка для пункта меню */ .my_menu li a { display: block; margin: 0; padding: 12px 20px; text-decoration: none; }
Т.е. все стили, определяющие цветовое оформление того или иного элемента меню, должны быть привязаны к классу .menu_color
, а стили отвечающие за разметку — соответственно .my_menu
.
При необходимости, для тега nav
также можно добавить дополнительный класс, чтобы не залезать на территорию «цветового оформления» . ..
Обычно выводится в одной из боковых колонок сайта. Чаще выполняет функции дополнительной навигации, реже — главное меню сайта.
Простое вертикальное меню
Исходный html-код меню будет выглядеть так:
<nav> <ul> <li><a href="#/">пункт 1</a></li> <li><a href="#/">пунтк 2</a></li> <li><a href="#/">пункт 3</a></li> <li><a href="#/">пункт 4</a></li> <li><a href="#/">пункт 5</a></li> </ul> </nav>
Кроме основных классов, рассмотренных в предыдущем материале, добавлен класс li.active
для активного пункта (ссылка на текущую страницу).
Сброс и установка стилей по умолчанию
Файл my-menu.css
/* Убираем маркеры и отступы */ .my_menu { list-style:none; margin:0; padding:0; } .my_menu li { margin:0; padding:0; position:relative; } /* Общие правила для пунктов меню */ .my_menu li a { display:block; margin:0; padding:12px 20px; text-decoration: none; } /*Наведение на активный пункт меню - курсор обычный */ .my_menu li.active > a:hover { cursor: default; }
Цветовое оформление
×Примечание
На практике не обязательно применять все стили, достаточно лишь некоторые. Например при наведении иногда достаточно изменение только цвета ссылки или добавить подчеркивание.
/* === Цветовое оформление menu_color === */ .menu_color { background:#555; } /* Оформление пункта */ .menu_color > ul > li > a { color:#999; background: rgba(0, 0, 0, 0); } /* Подсветка пункта при наведении */ .menu_color > ul > li > a:hover { color: #bbb; background: rgba(0, 0, 0, 0.1); } /* Активный пункт */ .menu_color > ul > li.active > a, .menu_color > ul > li.active > a:hover { color:#fff; background:rgba(0, 0, 0, 0.4); }
Пояснения:
- Если возникнет необходимость к определенным пунктам меню добавить подпункты, т.
е. сделать меню многоуровневым, то конструкция
.menu_color > ul > li > a
позволит ограничить применение стилей только к пунктам меню первого уровня. Для подменю можно будет прописать другие стили оформления. - Использование прозрачности при задании цвета фона —
background: rgba(0, 0, 0, 0.1)
. Это универсальное режение для любого темного бэкграунда. Если вы решите изменить цвет фона меню, фон активного пункта и подсветка пунктов при наведении изменятся автоматически. Впрочем, ничто не мешает вам задать понравившиеся цвета явно.
Замечание
Цвет фона меню задавать не обязательно, если он наследуется от родительского блока.
Разделители пунктов
/* Разделитель пунктов меню */ .menu_color > ul > li + li > a { border-top: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.15); }
Повторяем тот же трюк с использованием rgba. Цвета для верхней границы и тени заданы полупрозрачными — черный 15% прозрачности и белый 10% соответственно.
Это универсальное режение для любого темного бэкграунда. Если вы решите изменить цвет фона, то цвет рамки и тени изменится автоматически!
До этого момента рассматривалось простое одноуровневое меню. Как показывает практика, очень часто, через какое-то время возникает необходимость к одному или нескольким основным пунктам добавить подпункты. Поэтому:
Изначально любое меню нужно создавать как многоуровневое!
В последние годы реально-многоуровневые меню уходят в прошлое. Двух уровней, обычно, вполне достаточно, остальные — оформляются отдельным дополнительным меню.
HTML-код 2-х уровневого меню:
<nav> <ul> <li><a href="#/">пункт 1</a></li> <li><a href="#/">родительский пункт 2</a> <ul> <li><a href="#/">дочерний подпункт 1</a></li> <li><a href="#/">дочерний подпункт 2</a></li> </ul> </li> <li><a href="#/">пункт 3</a></li> <li><a href="#/">пункт 4</a></li> <li><a href="#/">пункт 5</a></li> </ul> </nav>
Добавлены классы li.
— родительский тег, содержащий подменю, и parent
ul.sub-menu
— вложенный список выпадающего меню.
Цветовое оформление
/* Оформление sub-menu */ .menu_color .sub-menu { background: #f5f5f5; border: 1px solid #f5f5f5; } /* Офррмление подпунктов */ .menu_color .sub-menu li a{ color: #555; background: rgba(0, 0, 0, 0); } /* Офррмление подпунктов при наведении */ .menu_color .sub-menu li a:hover{ color: #fff; background: #555; } /* Разделитель для пунктов sub-menu */ .menu_color .sub-menu > li + li > a { border-top: 1px solid #fff; box-shadow: 0 -1px 0 #ddd; padding-left: 40px /* Добавляем отступ для подпунктов */ }
Чтобы не усложнять код, размеры и отступы оставлены те же, что и в основном меню.
Позиционирование и скрытие
Позиционирование осуществляется относительно родительского li.parent
. (Именно для этого при сбросе и установке для него было задано position: relative;
)
/*Общие*/ .my_menu .sub-menu { display: none; position: absolute; top: 0; min-width: 200px; z-index: 9999; }
Вывод
В зависимости от расположения основного меню (левая/правая боковая колонка), подменю может выпадать как вправо, так и влево. Поэтому для определения стилевых правил используем класс родительского блока .sidebar_left
(В исходном html-коде класс не указан, т.к. к коду меню отношения не имеет).
/* Вывод */ .my_menu .parent:hover .sub-menu { display: block; top: 4px; } /* со смещением вправо */ .sidebar_left .my_menu .parent:hover .sub-menu { left: 100%; margin-left: -10px; }×
Информация
Если у родительского блока нет класса, или он применяется как к правой так и к левой колонкам — нужно этот класс добавить к тегу nav.menu_color.sidebar_left
.
Если навигационное меню расположено в правой колонке, то будет логично если подменю выпадает слева. В противном случаее оно может оказаться за пределами экрана.
/* Смещение влево */ .sidebar_right .my_menu .parent:hover .sub-menu { right: 100%; left: auto; margin-right: -5px; }
Простая анимация
Что мы будем анимировать. В данном случае, эффекты довольно простые:
Переопределение существующих стилей:
/* Оформление пункта */ .menu_color > ul > li > a { color: #999; background: rgba(0, 0, 0, 0); /* добавляем код */ -webkit-transition: all .3s; -moz-transition: all .3s; -o-transition: all .3s; transition: all .3s; } /* Офррмление подпунктов */ .menu_color .sub-menu li a{ color: #555; background: rgba(0, 0, 0, 0); /* добавляем код */ -webkit-transition: all .3s; -moz-transition: all .3s; -o-transition: all .3s; transition: all .3s; }
А вот с плавным появленем подменю проблема …
Дело в том, что использовать display: none;
для того чтобы скрыть подменю нельзя — анимация работать не будет. Поэтому рассмотрим другой способ.
Скрытие подменю. Вариант 2
Альтернативным способом является смещение меню в исходном состоянии за пределы экрана + полная прозрачность.
/* Переопределение sub-menu*/ .my_menu .sub-menu { display: block; /* переопределено */ position: absolute; top: 0; width: 200px; z-index: 9999; /* Добавить */ opacity: 0; -webkit-transition: opacity .5s, top .7s; -moz-transition: opacity .5s, top .7s; -o-transition: opacity .5s, top .7s; transition: opacity .5s, top .7s; } /* Смещение за экран */ .my_menu .sub-menu { left: -3000px; } /* Переопределяем эффект отображения при наведении*/ .my_menu .parent:hover > .sub-menu { display: block; top: 4px; /* Добавить */ opacity: 1; }
Раздвижное меню-аккордеон
×Несколько слов вступления
В данном примере рассмотрена технология создания аккордеон-меню, раскрывающегося по hover
.
Я бы не рекомендовал без необходимости использовать такое меню на сайте. Элементы страницы не должны жить своей жизнью (хлопающие как простыни на ветру подменю, раскрывающиеся аккордеоны, если его не аккуратно задеть мышкой …
Аккордеон должен раскрываться по click
, а это уже JS. А рассмотрение javascript выходит за рамки раздела HTML/CSS…
Попробуем создать аккордеон-меню из простого выпадающего меню, внеся минимальные изменения в код разметки и стили.
Добавлен класс my_accordion
к классу родительского контейнера, а класс .sub-menu
заменен на .sub-accordion-menu
. Можно было бы не заменять, а просто переопределить, но это усложнит пример для понимания.
<nav> <ul> <li><a href="#/">пункт 1</a></li> <li><a href="#/">родительский пункт 2</a> <ul#/">дочерний подпункт 1</a></li> <li><a href="#/">дочерний подпункт 2</a></li> </ul> </li> <li><a href="#/">пункт 3</a></li> <li><a href="#/">пункт 4</a></li> <li><a href="#/">пункт 5</a></li> </ul> </nav>
/* === Группировка классов === */ /* Убираем маркеры и отступы */ .my_menu, .sub-menu, .sub-accordion-menu { list-style:none; margin:0; padding:0; } /* Подсветка пункта при наведении */ .menu_color > ul > li > a:hover, .my_menu .parent .sub-accordion-menu li a:hover { color: #bbb; background: rgba(0, 0, 0, 0.1); } /* Разделитель пунктов меню */ .menu_color > ul > li + li > a, .menu_color .sub-accordion-menu li > a { border-top: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 -1px 0 rgba(0, 0, 0, 0.15); }
После этого добавим стили, для закрытого и раскрытого аккордеона:
/* === Закрытый ===*/ .sub-accordion-menu { display: block; position: static; width: auto; overflow: hidden; border: none; margin: 0!important; max-height: 0; /* Скрываем выпадающее подменю */ transition: max-height 1s; /* Задержка раскрытия */ } /* === Открытый ===*/ .sub-accordion-menu { max-height: 1000px; } .sub-accordion-menu > li > a { padding-left: 40px; /* Добавляем отступ для подпунктов */ }
Примечание.
Почему было использовано свойство max-height
, а не height
? Потому что мы не знаем высоту раскрывающегося подменю, а при использовании значения height: auto
— анимация не срабатывает.
Горизонтальное меню
По структуре горизонтальное меню ни чем не отличается от вертикального, html-код одинаковый. Теоретически, получить горизонтальное меню из вертикального можно заменой/добавлением класса содержащего контейнера.
Чтобы не усложнять разметку и оформление, последовательно создадим горизонтальное выпадающее меню с нуля, со своими классами.
В итоге наше меню будет выглядеть так:
За основу возьмем код вертикального выпадающего меню и заменим классы:
<nav> <ul> <li><a href="#/">punkt 1</a></li> <li><a href="#/">dropdown</a> <div> <ul> <li><a href="#/">sub punkt 1</a></li> <li><a href="#/">sub punkt 2</a></li> </ul> <div> </li> <li><a href="#/">punkt 3</a></li> <li><a href="#/">active</a></li> <li><a href="#/">punkt 5</a></li> </ul> </nav>
Разметка
/* === Разметка основного меню === */ .hz-bar ul { list-style: none; margin:0; padding:0; } .hz_menu > li { float: left; margin:0; padding:0; position:relative; } .hz_menu li a { display:block; margin:0; padding:15px 20px; text-decoration: none; }
Что было сделано:
- Сброс стилей по умолчанию для тега
ul
- Создание горизонтального меню, путем присвоения тегам
li
, содержащим пунткы основного меню, свойстваfloat: left
- Установка отступов для пунктов меню
Пояснения:
Конструкция .hz_menu > li
распространяется только на пункты основного меню и не затрагивает выпадающее, в то время как .hz_menu li a
задается для всех пунктов. Некоторые свойства, специфичные для подменю, будут переопределены в дальнейшем.
Разметка выпадающего меню
/* === Разметка выпадающего подменю === */ .dropdown_menu { display: block; position: absolute; left: -3000px; top: 100%; } .dropdown_menu > ul { border: 1px solid; margin-top: 10px; /* отступ от основного меню */ padding: 10px 1px; min-width: 140px; opacity: 0; transition: opacity .5s; /* анимация прозрачности */ } .dropdown_menu li a { white-space: nowrap; /* если не очень длинные заголовки */ z-index: 9999; padding: 10px 20px; } .parent_dropdown:hover .dropdown_menu { left: 0px; } .parent_dropdown:hover .dropdown_menu ul { opacity: 1; }
Рассмотрим некоторые особенности:
- Как было видно из html-кода, выпадающее меню обернуто в дополнительный контейнер
div.dropdown_menu
. Для чего? В принципе, можно вполне обойтись и без него, но эта обертка дает некоторые дополнительные возможности оформления. В частности, возможность задать отступ от основного меню.
Если задать отступ непосредственно для тегаul
без обертки, при перемещении курсора от основного пункта к подпункту hover-эффект прервется и подменю пропадет … Дополнительный контейнер обеспечивает, в данном случае, отсутствие разрыва. - Для подпункт определено правило
white-space: nowrap
. Дело в том что абсолютно позиционированное подменю имеет максимальную ширину родительского пункта, и, соответственно, текст подпунктов будет переноситься на новую строку. Это не очень удобно при коротких названиях основных пунктов.
Данное правило предотвращает перенос. Как альтернатива (дополнение), минимальная ширина подменю была задана явно.
Оформление
Перед тем как заняться цветовым оформлением, необходимо добавить еще несколько стилевых правил разметки. Я специально перенес их в офомление, чтобы был понятнее смысл.
Если основному контейнеру назанчить цвет фона, то мы его не увидим по одной простой причине:
Теги li
, которым присвоено float: left
, выпадают из основного потока, их для основного контейнера как-бы не существует, поэтому он «схлопывается» и имеет высоту 0. Соответственно, никакого цветового оформления мы не увидим.
Решение
/* Предотвращаем схлопывание */ .hz-bar:after { content: ''; display: table; clear: both; }
Теперь контейнер будет вести себя более дружелюбно и можно его оформлять
/* === Оформление меню === */ .menu_bordo { background: #7D0000; } .menu_bordo .hz_menu > li > a { color: #DBE6B7; } .menu_bordo .hz_menu > li > a:hover { color: #fff; } .menu_bordo .hz_menu .active a{ box-shadow: inset 0 15px 15px rgba(0, 0, 0, 0.2); color: #fff; cursor: default; }
Здесь все достаточно очевидно. Единственное, cursor: default
, следовало бы перенести в разметку, чтобы не привязывать к классу цветового оформления.
Для выделения активного пункта меню была применена тень.
/* === Оформление выпадающего подменю === */ .menu_bordo .dropdown_menu > ul { background: #fff; border-color: #ddd; } .menu_bordo .dropdown_menu > ul > li > a { color: #555; } .menu_bordo .dropdown_menu > ul > li > a:hover { background: #7D0000; color: #fff; }
На этом цветовое оформление можно считать завершенным. Теперь с легкостью можно подкорректировать цветовую гамму, или создать несколько классов для разных вариантов оформления.
Дополнительно
Необязательные стилиевые правила. Первое задает вертикальные разделители между пунктами (аналогично вертикальному меню), второе — дополнительный маркер для родительского пункта.
/* Дополнительно. Разделители пунктов + маркер */ .hz_menu > li + li > a { border-left: 1px solid rgba(255, 255, 255, 0.1); box-shadow: -1px 0 0 rgba(0, 0, 0, 0.15); } .parent_dropdown > a:after { display: inline-block; padding: 1px 0 0 3px; content: "\25BC "; font-size: 10px; vertical-align: top; }
Здесь вы можете скачать Код примера горизонтального меню
Выпадающее меню
Навигация в виде выпадающего меню может применяться при большом количестве ссылок, для экономии места на странице. Выпадающее вертикальное меню корректно отображается в браузерах Firefox, Opera и Internet Explorer. Автор меню мне неизвестен, поэтому и ссылки на оригинал не имеется.
<!—[if gte IE 5.5]>
<script language=»JavaScript» src=»nav-h.js» type=»text/JavaScript»></script>
<![endif]—>
<ul>
<li><a href=»index.html»>Главная</a></li>
<li><a href=»templates.html»>Шаблоны, рецепты +</a>
<ul>
<li><a href=»templates.html»>Шаблоны, заготовки +</a>
<ul>
<li><a href=»temp1.html»>Шаблон 1</a></li>
<li><a href=»temp2.html»>Шаблон 2</a></li>
<li><a href=»temp3.html»>Шаблон 3</a></li>
<li><a href=»temp4.html»>Шаблон 4</a></li>
<li><a href=»temp5.html»>Шаблон 5</a></li>
<li><a href=»temp6.html»>Шаблон 6</a></li>
<li><a href=»temp7. html»>Шаблон 7</a></li>
<li><a href=»temp8.html»>Шаблон 8</a></li>
</ul>
</li>
<li><a href=»faq.html»>Рецепты HTML</a></li>
<li><a href=»faq-css.html»>Рецепты CSS</a></li>
</ul>
</li>
<li><a href=»#»>Менюшки +</a>
<ul>
<li><a href=»#»>Вертикальные +</a>
<ul>
<li><a href=»menu1.html»>Вертикальное меню 1</a></li>
<li><a href=»menu2.html»>Вертикальное меню 2</a></li>
<li><a href=»menu3.html»>Вертикальное меню 3</a></li>
<li><a href=»menu4.html»>Вертикальное меню 4</a></li>
<li><a href=»menu5.html»>Вертикальное меню 5</a></li>
</ul>
</li>
<li><a href=»#»>Горизонтальные +</a>
<ul>
<li><a href=»menu6. html»>Горизонтальное меню 1</a></li>
<li><a href=»menu7.html»>Горизонтальное меню 2</a></li>
<li><a href=»menu8.html»>Горизонтальное меню 3</a></li>
</ul>
</li>
</ul>
</li>
<li><a href=»/gb»>Гостевая книга</a></li>
<li><a href=»submit.html»>Контакт</a></li>
</ul>
ul#navmenu-v,
ul#navmenu-v li,
ul#navmenu-v ul {
margin: 0;
border: 0 none;
padding: 0;
width: 160px;
list-style: none;
}
ul#navmenu-v:after {
clear: both;
display: block;
font: 1px/0px serif;
content: «.»;
height: 0;
visibility: hidden;
}
ul#navmenu-v li {
float: left;
display: block !important;
display: inline;
position: relative;
}
ul#navmenu-v a {
border: 1px solid #FFF;
border-right-color: #527337;
border-bottom-color: #527337;
padding: 0 6px;
display: block;
background: #A2C585;
color: #666;
font: bold 10px/22px Verdana, Arial, Helvetica, sans-serif;
text-decoration: none;
height: auto !important;
height: 1%;
}
ul#navmenu-v a:hover,
ul#navmenu-v li:hover a,
ul#navmenu-v li. iehover a {
background: #648B43;
color: #FFF;
}
ul#navmenu-v li:hover li a,
ul#navmenu-v li.iehover li a {
background: #648B43;
color: #BCD6A7;
}
ul#navmenu-v li:hover li a:hover,
ul#navmenu-v li:hover li:hover a,
ul#navmenu-v li.iehover li a:hover,
ul#navmenu-v li.iehover li.iehover a {
background: #648B43;
color: #FFF;
}
ul#navmenu-v li:hover li:hover li a,
ul#navmenu-v li.iehover li.iehover li a {
background: #648B43;
color: #BCD6A7;
}
ul#navmenu-v li:hover li:hover li a:hover,
ul#navmenu-v li:hover li:hover li:hover a,
ul#navmenu-v li.iehover li.iehover li a:hover,
ul#navmenu-v li.iehover li.iehover li.iehover a {
background: #648B43;
color: #FFF;
}
ul#navmenu-v li:hover li:hover li:hover li a,
ul#navmenu-v li.iehover li. iehover li.iehover li a {
background: #648B43;
color: #BCD6A7;
}
ul#navmenu-v li:hover li:hover li:hover li a:hover,
ul#navmenu-v li.iehover li.iehover li.iehover li a:hover {
background: #648B43;
color: #FFF;
}
ul#navmenu-v ul,
ul#navmenu-v ul ul,
ul#navmenu-v ul ul ul {
display: none;
position: absolute;
top: 0;
left: 160px;
}
ul#navmenu-v li:hover ul ul,
ul#navmenu-v li:hover ul ul ul,
ul#navmenu-v li.iehover ul ul,
ul#navmenu-v li.iehover ul ul ul {
display: none;
}
ul#navmenu-v li:hover ul,
ul#navmenu-v ul li:hover ul,
ul#navmenu-v ul ul li:hover ul,
ul#navmenu-v li.iehover ul,
ul#navmenu-v ul li.iehover ul,
ul#navmenu-v ul ul li.iehover ul {
display: block;
}
Вертикальное выпадающее меню при наведении с использованием CSS и HTML
Введение
В этой статье объясняется, как создать вертикальное раскрывающееся меню с помощью CSS и HTML.
Вы часто видите сайты, содержащие строку меню, которая раскрывается при наведении курсора и выглядит очень здорово, но обычно это горизонтальные раскрывающиеся меню. Эта статья поможет вам создать вертикальное раскрывающееся меню.
Его вывод будет примерно таким:
Теперь мы увидим процедуру создания такого выпадающего меню.
Этап 1
Прежде всего, добавьте таблицу стилей и форму или HTML-страницу.
Затем на странице HTML или веб-форме .NET добавьте «Div» и назовите его «divMenu».
После создания Div нам нужно добавить список элементов и еще один список в этих элементах, поэтому окончательный код будет примерно таким:
- Дом1
- Homea
- Домашняя страница
- Homec
- Дом2
- Home
- Дом
- Homef
- Дом3
- Homeg
- Хомэ
- Хомэй
- Главная4
- Главная5
- Homej
- Хомек
- Гомель
- Главная6
- дел>
Этап 2
Прямо сейчас ваш код не более чем этот:
Итак, чтобы он выглядел красиво и интересно, мы внесем изменения в таблицу стилей, которую мы добавили ранее.
Добавьте этот код в свою таблицу стилей:
- #divMenu, ul, li, li li {
- маржа: 0;
- заполнение: 0;
- }
- #divMenu {
- ширина: 150 пикселей;
- высота: 27 пикселей;
- }
- #divMenu ул
- {
- line-height: 25px;
- }
- #divMenu li {
- стиль списка: нет;
- должность: родственник;
- фон: #641b1b;
- }
- #divMenu li li {
- стиль списка: нет;
- должность: родственник;
- фон: #641b1b;
- слева: 148 пикселей;
- верх: -27px;
- }
- #divMenu ul li a {
- ширина: 148 пикселей;
- высота: 25 пикселей;
- отображение: блок;
- text-decoration: none;
- text-align: center;
- семейство шрифтов: Georgia,’Times New Roman’, serif;
- color:#ffffff;
- border:1px solid #eee;
- }
- #divMenu ul ul {
- позиция: абсолютная;
- видимость: скрыта;
- верх: 27 пикселей;
- }
- #divMenu ul li:hover ul {
- видимость: видимый;
- }
- #divMenu li:hover {
- цвет фона: #945c7d;
- }
- #divMenu ul li:hover ul li a:hover {
- цвет фона: #945c7d;
- }
- #divMenu a:hover {
- начертание шрифта: жирный;
- }
Здесь я использовал идентификатор
, другими словами «divMenu».Теперь все изменится, и ваша продукция будет совсем другой и интересной.
Выход
Решено с помощью CSS! Выпадающие меню | CSS-трюки
CSS становится все более мощным, и благодаря таким функциям, как сетка CSS и настраиваемые свойства (также известные как переменные CSS), мы наблюдаем появление действительно креативных решений.Некоторые из этих решений сосредоточены не только на том, чтобы сделать Интернет красивее, но и на том, чтобы сделать его более доступным и улучшить стилизацию доступных интерфейсов. Я определенно здесь для этого!
Распространенным шаблоном UI , который мы видим в Интернете, являются раскрывающиеся меню. Они используются для отображения связанной информации по частям, не перегружая пользователя кнопками, текстом и параметрами.
Поиск в Google по запросу «раскрывающееся меню» дает множество примеров.Где-то мы часто видим их внутри заголовков или областей навигации на веб-сайтах.
Давайте посмотрим, сможем ли мы создать одно из этих меню с помощью одного лишь CSS.Мы создадим список ссылок в навигационном компоненте, например:
.<навигационная роль="навигация"> <ул>
- Один
- Два
- Три
Теперь предположим, что нам нужно выпадающее подменю на втором элементе навигации. Мы можем сделать то же самое здесь и включить список ссылок в этот элемент списка:
<навигационная роль="навигация"> <ул>
- Один
- Два <ул>
- Sub-1
- Sub-2
- Sub-3
- Три
Теперь у нас есть двухуровневая система навигации.
Чтобы содержимое было скрыто и отображено, когда мы хотим, чтобы оно было видимым, нам нужно применить некоторые CSS. Все свойства стиля были удалены из следующего примера для ясности взаимодействия:
ли { дисплей: блок; продолжительность перехода: 0,5 с; } ли: наведите { курсор: указатель; } уль ли уль { видимость: скрытая; непрозрачность: 0; положение: абсолютное; переход: все 0,5 с легкости; поле-верх: 1re; слева: 0; дисплей: нет; } ул ли: наведите курсор > ул, уль ли уль:наведите { видимость: видимая; непрозрачность: 1; дисплей: блок; } уль ли уль ли { ясно: оба; ширина: 100%; }
Теперь раскрывающееся меню подменю скрыто, но будет отображаться и становиться видимым при наведении указателя мыши на соответствующий родительский элемент на панели навигации.С помощью стиля
ul li ul
у нас есть доступ к этому подменю, а с помощью стиляul li ul li
у нас есть доступ к отдельным элементам списка внутри него.Проблема
Это начинает выглядеть так, как мы хотим, но мы еще далеки от завершения. Веб-доступность — ключевая часть разработки вашего продукта, и прямо сейчас у вас будет прекрасная возможность поднять эту тему. Добавление
role="navigation"
— хорошее начало, но для того, чтобы панель навигации была доступна, нужно иметь возможность перемещаться по ней (и фокусироваться на нужном элементе в разумном порядке), а также иметь экран читатель точно читает вслух то, на что направлено внимание.Вы можете навести курсор на любой элемент списка и четко видеть, над чем он находится, но это не так для навигации по вкладкам. Идите вперед и попробуйте перейти к приведенному выше примеру. Вы теряете представление о том, где находится фокус визуально. При переходе к Two в главном меню вы увидите кольцо индикатора фокуса, но когда вы переходите к следующему элементу (одному из его подменю), этот фокус исчезает.
Теперь важно отметить, что теоретически вы сосредоточены на этом другом элементе, и что программа чтения с экрана сможет проанализировать это, прочитав Sub-One , но пользователи клавиатуры не смогут увидеть, что происходит, и будут потерять след.
Причина, по которой это происходит, заключается в том, что, пока мы стилизуем зависание родительского элемента, как только мы перемещаем фокус с родительского элемента на один из элементов списка в этом родительском элементе, мы теряем этот стиль. Это имеет смысл с точки зрения CSS, но это не то, что нам нужно.
К счастью, есть новый псевдокласс CSS, который даст нам именно то, что мы хотим в данном случае, и он называется
:focus-within
.Решение:
:фокус внутри
Псевдоселектор
.:focus-within
является частью спецификации селекторов CSS уровня 4 и указывает браузеру применять стиль к родителю, когда какой-либо из его дочерних элементов находится в фокусе.Таким образом, в нашем случае это означает, что мы можем перейти к Sub-One и применить стиль:focus-within
вместе со стилем:hover
родителя и увидеть, где именно мы находимся в раскрывающемся списке навигации.В нашем случае это будет
ul li:focus-within > ul
:ул li: hover > ул, ul li: фокус внутри > ul, уль ли уль:наведите { видимость: видимая; непрозрачность: 1; дисплей: блок; }
Сладко! Оно работает!
Быстрый обход! Если вы поддерживаете только современные браузеры, CSS, которые мы видели до сих пор, вполне подойдут.Но вы должны знать, что когда любой браузер не понимает часть селектора, он отбрасывает весь селектор. Поэтому, если вы хотите поддерживать IE 11, вы не можете смешивать часть
:focus-within
./* Этот составной селектор будет по-прежнему работать в IE 11, потому что :focus-within не смешивается */ ул ли: наведите курсор > ул, уль ли уль: парить, уль ли уль: фокус { видимость: видимая; непрозрачность: 1; дисплей: блок; } /* IE 11 этого не получит, но, по крайней мере, меню верхнего уровня будут работать */ ul li: фокус-внутри > ul { видимость: видимая; непрозрачность: 1; дисплей: блок; }
Теперь, когда мы переходим ко второму пункту, всплывает наше подменю, и когда мы переходим через подменю, видимость остается! Теперь мы можем добавить наш код, чтобы включить состояния
:focus
вместе с:hover
, чтобы предоставить пользователям клавиатуры те же возможности, что и пользователям мыши.В большинстве случаев, например, для прямых ссылок, мы обычно можем просто написать что-то вроде:
а:наведение, фокус { ... }
Но в этом случае, поскольку мы применяем стили наведения на основе родительского элемента
li
, мы снова можем использовать:focus-within
, чтобы получить тот же вид при переходе через табуляцию. Это потому, что мы не можем на самом деле сфокусировать наli
(если мы не добавимtabindex="0"
). На самом деле мы фокусируемся на ссылке (a
) внутри него.:focus-within
позволяет нам по-прежнему применять стили к родителюli
при фокусировании на ссылке (чертовски круто!):li:парить, li: фокус внутри { ... }
На этом этапе, поскольку мы применяем стиль фокусировки, мы можем сделать то, что обычно не рекомендуется (удалить стиль этого синего контурного кольца фокусировки).
Мы можем сделать это по:
li:фокус-внутри { контур: нет; }
Приведенный выше код указывает, что когда мы фокусируемся на элементах списка по ссылке (
Окончательное меню с использованием состоянийa
), не применяйте контур к элементу ссылки (a
).Это довольно безопасно писать таким образом, потому что мы стилизуем исключительно состояние наведения, а в браузерах, которые не поддерживают:focus-within
, ссылка все равно получит кольцо фокусировки. Теперь наше меню выглядит так::focus-inin
,:hover
и настройка исчезновения кольца фокусировкиЧто насчет АРИИ?
Если вы знакомы со специальными возможностями, возможно, вы слышали о метках и состояниях ARIA. Вы можете использовать их в своих интересах, чтобы одновременно создавать раскрывающиеся списки такого типа со встроенной доступностью! Здесь вы можете найти отличный пример Хейдона Пикеринга.
При включении разметки ARIA ваш код будет выглядеть примерно так:
<навигационная роль="навигация"> <ул>
- Один
- Два
- Три
Вы добавляете
aria-haspopup="true"
к родителю выпадающего меню, чтобы указать альтернативное состояние, и включаетеaria-label="submenu"
в само выпадающее меню (в данном случае наш список сclass="dropdown"
.Эти свойства сами по себе дадут вам функциональность, необходимую для отображения выпадающего меню, но недостатком является то, что они работают только с включенным JavaScript.
Предупреждение о поддержке браузера
Говоря о предостережениях, давайте поговорим о поддержке браузера.
В то время как
:focus-within
действительно имеет довольно хорошую поддержку браузера , важно отметить, что Internet Explorer и Edge не поддерживаются, поэтому ваши пользователи на этих платформах не смогут видеть навигацию.Desktop
Chrome Firefox IE Край Safari 60 52 Нет 79 10,1 Mobile / Tablet
Android Chrome Android Firefox Android iOS Safari 97 90.4397 95 Окончательным решением здесь будет использование как разметки ARIA, так и CSS
:focus-within
, чтобы обеспечить надежное раскрывающееся меню для ваших пользователей.Если вы хотите использовать эту функцию в будущем, проголосуйте за нее в Edge User Voice! И проголосуйте за
:focus-ring
, пока вы это делаете, чтобы мы могли стилизовать это кольцо фокусировки и создать красивый интерактивный веб-опыт для всех 😀Подробнее о
: focus-within
и A11YCSS горизонтальное меню с выпадающими списками
Ранее на этой неделе я искал простое руководство по горизонтальному выпадающему меню только с CSS, предназначенное для новичков в CSS.И я не смог найти его, так что вот как построить это меню….
Я собираюсь сделать это в два этапа:
Создание простого горизонтального меню — без раскрывающегося списка
Прежде чем мы перейдем к раскрывающимся спискам, давайте просто отсортируем часть горизонтального меню. Начнем с html-разметки, которая представляет собой стандартный неупорядоченный список. Пусть у нас будет четыре пункта меню:
<ул>
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 4
В этом нет ничего захватывающего.
.Теперь давайте посмотрим на css:
ул#горизнав{ маржа: 0; заполнение: 0; тип стиля списка: нет; высота: 32px } #горизонт ли{ плыть налево; ширина: 150 пикселей } #горизнав ли а{ дисплей:блок; ширина: 150 пикселей; высота строки: 30 пикселей; выравнивание текста: по центру; белый цвет; текстовое оформление: нет; цвет фона:#EA9531; граница: 1px сплошной белый } #horiznav li a:hover{ цвет:#333333 }
См. комментарии в css для объяснения.Главное, что делает меню горизонтальным, — это плавающий элемент
. Этот код дает нам это:Добавление раскрывающегося списка
Теперь добавим раскрывающийся список. Элементы раскрывающегося списка включены как дополнительные элементы
, вложенные в соответствующий элемент
. Вот так:<ул>
- Элемент 1
- Элемент 2 <ул>
- Элемент 2.1
- Элемент 2.
2
- Элемент 3 <ул>
- Элемент 3.1
- Элемент 3.2
- Элемент 3.3
- Элемент 4 <ул>
- Элемент 4.1
- Элемент 4.2
- Элемент 4.3
Правильно, теперь CSS. Нам нужно сделать несколько дополнений — отмечены красным:
ул#горизонт, #горизонт ул{ маржа: 0; заполнение: 0; тип стиля списка: нет; высота: 32px } #горизонт ли{ плыть налево; ширина: 152 пикселя; должность: родственник } #горизнав ли а{ дисплей:блок; ширина: 150 пикселей; высота строки: 30 пикселей; выравнивание текста: по центру; белый цвет; текстовое оформление: нет; цвет фона:#EA9531; граница: 1px сплошной белый } #horiznav li a:hover{ цвет:#333333 } #горизонт ли ул{ дисплей:нет; положение: абсолютное; слева:0; верх: 32px } #horiznav li: hover ul { дисплей: блок } #horiznav li ul a{ цвет фона: # FFB33B }
См.
.пояснения в комментариях к коду.Удивительно малое количество css, на самом деле. Выпадающие списки обычно скрыты и появляются при наведении курсора на родительский элемент
. Итак, это дает нам (то же самое, что и вверху страницы):Вы увидите, что использование абсолютного позиционирования приводит к тому, что раскрывающийся список появляется поверх всего остального на странице — это то, что нам нужно. И это прекрасно работает практически во всех популярных сегодня браузерах. В частности, я тестировал в IE7, IE8, FF3, Chrome, Opera9, Opera 10, Safari4. Вы заметите, что чего-то не хватает.Никаких призов за угадывание браузера, вызывающего дополнительные трудности…
Работа с раскрывающимся списком в IE6
IE6 не поддерживает :hover, за исключением элементов
Я лично считаю, что версия 2 этого программного обеспечения является наиболее надежной.
Добавление анимации с помощью jQuery
Чтобы добавить анимацию — затухание, слайды и т. д. — взгляните на мой плагин jQuery здесь, который позволяет использовать более сложную анимацию для пользователей javascript, сохраняя при этом подход css для тех, у кого его нет.
выпадающих списков · Bootstrap
Переключение контекстных наложений для отображения списков ссылок и многого другого с помощью плагина раскрывающегося списка Bootstrap.
Обзор
Выпадающие списки — это переключаемые контекстные наложения для отображения списков ссылок и многого другого. Они сделаны интерактивными с помощью прилагаемого плагина JavaScript с раскрывающимся списком Bootstrap. Они переключаются щелчком, а не наведением курсора; это преднамеренное дизайнерское решение.
Раскрывающиеся списки основаны на сторонней библиотеке Popper.js, который обеспечивает динамическое позиционирование и обнаружение области просмотра.
Обязательно включите popper.min.js перед JavaScript Bootstrap или используйте
bootstrap.bundle.min.js
/bootstrap.bundle.js
, который содержит Popper.js. Popper.js не используется для позиционирования раскрывающихся списков на панелях навигации, поскольку динамическое позиционирование не требуется.Если вы собираете наш JavaScript из исходного кода, требуется
util.js
.Доступность
Стандарт WAI ARIA определяет фактический виджет
С другой стороны, раскрывающиеся списки Bootstraprole="menu"
, но он специфичен для меню, похожего на приложение, которое запускает действия или функции. Меню ARIA могут содержать только элементы меню, элементы меню флажков, элементы меню переключателей, группы переключателей и подменю.предназначены для использования в различных ситуациях и структурах разметки.
Например, можно создавать раскрывающиеся списки, которые содержат дополнительные входные данные и элементы управления формами, такие как поля поиска или формы входа. По этой причине Bootstrap не ожидает (и не добавляет автоматически) каких-либо атрибутов роли
aria-
, необходимых для настоящих меню ARIA .Авторы должны будут сами включать эти более конкретные атрибуты.Тем не менее, Bootstrap добавляет встроенную поддержку для большинства стандартных взаимодействий с меню клавиатуры, таких как возможность перемещаться по отдельным элементам
.dropdown-item
с помощью клавиш курсора и закрывать меню с помощью клавиши ESC .Примеры
Оберните переключатель раскрывающегося списка (вашу кнопку или ссылку) и раскрывающееся меню внутри
.dropdown
или другого элемента, который объявляетposition: relative;
.Выпадающие списки могут быть вызваны элементамиОдна кнопка
Любой отдельный
.btn
можно превратить в раскрывающийся список с некоторыми изменениями разметки. Вот как вы можете заставить их работать с<дел>
<дел> Выпадающая ссылка
Самое приятное то, что вы можете сделать это с любым вариантом кнопки:
<дел>
Кнопка разделения
Аналогичным образом создайте раскрывающиеся списки с разделенными кнопками практически с той же разметкой, что и раскрывающиеся списки с одной кнопкой, но с добавлением .
для правильного интервала вокруг каретки раскрывающегося списка. dropdown-toggle-split
Мы используем этот дополнительный класс, чтобы уменьшить горизонтальный отступ
по обе стороны от каретки на 25% и удалить margin-left
, добавленный для обычных раскрывающихся списков кнопок. Эти дополнительные изменения сохраняют курсор в центре разделенной кнопки и обеспечивают область нажатия более подходящего размера рядом с основной кнопкой.
<дел>