Выпадающее меню на CSS

HTML код выпадающего меню (уровней может быть меньше):
<ul class="vyp-menu">
  <li><a href="#1">пункт 1</a></li>
  <li><a href="#2">пункт 2</a>
        <ul>
          <li><a href="#2.1">подпункт 2.1</a>
                <ul>
                  <li><a href="#2.1.1">подпункт 2.2.1</a></li>
                  <li><a href="#2.2.2">подпункт 2.2.2</a></li>
                  <li><a href="#2.2.3">подпункт 2.2.3</a>
                      <ul>
                        <li><a href="#2.2.3.1">подпункт 2.2.3.1</a></li>
                        <li><a href="#2.2.3.2">подпункт 2.2.3.2</a></li>
                        <li><a href="#2.2.3.3">подпункт 2.2.3.3</a></li>
                      </ul>
                  </li>
                </ul>
          </li>
          <li><a href="#2.2">подпункт 2.2</a></li>
          <li><a href="#2.3">подпункт 2.3</a></li>
        </ul>
  </li>
  <li><a href="#3">пункт 3</a></li>
</ul>

Пример

CSS для простого многоуровневого выпадающего списка

<style type="text/css">
.vyp-menu, .vyp-menu li, .vyp-menu ul, .vyp-menu a, .vyp-menu:after {
  margin: 0; 
  padding: 0;
  z-index: 200;
  display: block;
}

.vyp-menu:after { /* убираем после меню действие float */ 
  clear: both;
  content: "";}

.vyp-menu > li { float: left; } /* горизонтальное размещение пунктов */

.vyp-menu li {
  white-space: nowrap; /* содержимое на одной строке */ 
  position: relative;
}

.vyp-menu > li, .vyp-menu > li > ul > li, .vyp-menu > li > ul > li > ul > li { overflow: hidden; } /* всё, что за пределами элемента, скрыто */
.vyp-menu > li:hover, .vyp-menu > li > ul > li:hover, .vyp-menu > li > ul > li > ul > li:hover {overflow: visible;}

.vyp-menu li ul li, .vyp-menu li ul li a { width: 100%; }  /* фон подпунктов равной ширины */

.vyp-menu ul { position: absolute; }

.vyp-menu ul ul { left: 100%; top: 0; } /* третий и четвёртый список позиционируется не вниз, а вправо. Можно часть списков повернуть и влево, но тогда width должен быть задан в px */
</style>

Пример.

В дополнение к вышеуказанному CSS для красивого меню

<style type="text/css">
.vyp-menu {
  background: #808080;
  background: -webkit-linear-gradient(#fff, #808080);
  background: -moz-linear-gradient(#fff, #808080);
  background: -o-linear-gradient(#fff, #808080);
  background: -ms-linear-gradient(#fff, #808080);
  background: linear-gradient(#fff, #808080);
  border-radius: 5px;
}

.vyp-menu > li:first-child {border-radius: 5px 0 0 5px; border-left: none;}

.vyp-menu > li {border-left: 1px solid #ccc;}

.vyp-menu > li:hover {background: #fff;}

.vyp-menu li li {background: #fff content-box; padding: 1px 1px 0px 0px; border-right: 1px solid #ccc;}

.vyp-menu li li:last-child {border-radius: 0 0 5px 5px;}

.vyp-menu li a {
  line-height: 40px;
  padding: 0 14px;
  text-decoration: none;
}
</style>
Можно добавить эффект постепенного появления. Вместо
.vyp-menu > li, .vyp-menu > li > ul > li, .vyp-menu > li > ul > li > ul > li { overflow: hidden; }
.vyp-menu > li:hover, .vyp-menu > li > ul > li:hover, .vyp-menu > li > ul > li > ul > li:hover {overflow: visible;}
пишем
.vyp-menu > li > ul > li, .vyp-menu > li > ul > li > ul > li, .vyp-menu > li > ul > li > ul > li > ul > li {
  height: 0px;
  -moz-transition: 0.3s; -o-transition: 0.3s; -webkit-transition: 0.3s; -ms-transition: 0.3s;
  overflow: hidden;}

.vyp-menu > li:hover > ul > li, .vyp-menu > li > ul > li:hover > ul > li, .vyp-menu > li > ul > li > ul > li:hover > ul > li {
  height: 40px;
  overflow: visible;}

Пример

С помощью псевдоэлементов в примере выше были добавлены знаки +-.

CSS

<style type="text/css">
.strelka:after {
  content: "\2b";
  position: absolute;
  right: 1px; bottom: -4px;
}

.strelka:hover:after {content: "\2d";}
</style>

HTML того li, который будет содержать список

<li class="strelka">...</li>


Похожие статьи:
  1. Горизонтальное выпадающее меню для Blogger
в f t
наверх ↑

16 комментариев:

Анонимный
Выпадающее меню не работает IE 9 и неправильно отображается, что надо сделать?
NMitra
"неправильно отображается" - с эти пока ничего не поделаешь, IE пока не все свойства поддерживает
"не работает" - не выпадает?
Антон Сергеев
Наталья, скажите, нужно ли удалять ту часть html-кода, которая задаёт параметры прежнего меню шаблона?
NMitra
Вам решать, не запутаетесь ли потом. Я оставляю только необходимое.
Анонимный
Круто
Анастасия
А как делать меньше пунктов? А то я пробовала, и фигня получилась...
NMitra
После праздников подумаю.
Нина Зоркина
Наташа,скажите, подпункт 2.1 и 2.1.1 оба должны быть ярлыками? Можно сделать сначала меню, а потом использовать его, догадываюсь,что нет.Существующие Главная, Карта сайта, Обо мне-их тоже сюда внести? Допустим пункт1, пункт3,пункт4. Внести три кода- html, css для простого и css для красивого? На тестовом блоге нет таких сообщений, как на основном, поэтому спрашиваю.
NMitra
Выпадающее меню на Blogger http://shpargalkablog.ru/2011/10/gorizontalnoye-vypadayushcheye-menyu.html
Вместо "адрес_куда_ведёт_Пункт" пишите URL-адрес ярлыка
Нина Зоркина
Наташа! По рекомендованной ссылке вообще ничего не вышло. Сделала по этой стр. Выпадающие пункты не выпадают, как исправить? Добавила html в футер-там видна структура меню, но без рамочек( сделала для наглядности). Пробовала еще 2 источника, тоже не выпадают, а в футере выпадают. Помогите! http://ninazorkina.blogspot.com/
NMitra
Нина, так много блоггеров, которым подсказывала и которые блоги забросили. Сейчас стала ценить своё время в рублях. Если желаете, напишите на почту n.mitra@yandex.ru
Анонимный
Наташа, Вы - супер!!
NMitra
Благодарю! Только с этим меню поаккуратнее, так его и не довела до ума.
Анонимный
Все понятно, но если сделать меню справа в блоке, а выпадающие пункты влево (далее код) :

<html>
<head>
<style>

ul, li {
margin:0;
padding:0;
list-style-type:none;
}


#menu {
display:block;
float: right;

}


#menu > li {
display:inline-block;
position:relative;
}


#menu > li > ul {
display:none;
}
#menu > li > ul > li > ul {
display:none;
}


#menu > li:hover > ul {
display:block;
float:left;
}
#menu > li > ul > li:hover > ul {
display:block;
float:left;
}

</style>
</head>
<body>
<ul id="menu">
<li><a href="#">МЕНЮ</a>
<ul>
<li><a href="#">Раздел1</a></li>
<li><a href="#">Раздел2</a></li>
<li><a href="#">Раздел3</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>
<li><a href="#">Подраздел6</a></li>
<li><a href="#">Подраздел7</a></li>
</ul>

</li>
</ul>
</li>

</ul>
</body>
</html>

, то при наведении на раздел 3 выпадает список с подразделами, однако пункты раздел 1 и раздел 2 тоже уезжают влево на уровень подразделов. Как не бился не могу исправить...
NMitra
Посмотрите как делает http://www.cssplay.co.uk/menus/cssplay-responsive-multi-level.html (см. правые пункты) У него много вариантов, когда пункты выезжают влево
Анонимный
---лирическое отступление в область социальной психологии человекообразных приматов:
"...все таки я не перестаю удивляться, тому насколько глубоко люди озадачены своими мыслями, что абсолютно не видят ни чего вокруг, кроме своих иллюзорных мыслей и переворачивают смысл любой идей под свою фантазию!"

NMitra, вот покажи мне в моем сообщении, где я просил каки-то примеры со ссылками. Если ты не в состоянии читать по русски и определенно понимать русскоязычные тексты, не лезь в верстку! Изучи грамматику русского языка для начала, желательно с ее основ... Я сам тебе могу кучу ссылок навалить с примера меню и слева и справа и снизу и сверху, твоя ссылка одна из самых неинформативных из всех, которые можно найти. Я разве просил тебя выполнить тут для меня роль поисковой машины? Слава Богу, я и сам в состоянии ввести в поисковую строку необходимые буквы! И ситуация с быдлоумниками по всему ру сигменту сети именно вот такая. У меня есть вопросы в сети, наподобие этого, на которые не ответили до сих пор, а некоторым вопросам уже больше года, а некоторым еще больше. И везде наблюдается вот такая тенденция, умничает какая-то непонятная субстанция и что самое интересное, совершенно не в тему. Я не пойму совершенно, для чего и для кого пользователи ищущие, ответа у более мудрых верстальщиков, выкладывают свой рабочий код? Может ты знаешь? Наверное просто, для украшения своего сообщения, да?
Последний шанс тебе, NMitra, чтоб реабилитироваться - на своем неудачном примере, покажи мне решение моего вопроса, или вообще больше не отвечай мне, дабы не позорится.