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

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

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

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

Рассматриваемый нами фреймворк позволит вам сделать не только горизонтальное, но еще и вертикальное, и линейное меню. Файлы стилей разбиты таким образом, что вам останется только добавить свой стиль и меню готово.

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

HTML

Для начала рассмотрим как должна выглядеть HTML разметка нашего меню. Здесь все очень просто — все меню это вложенные списки.

<ul class="dropdown">
<li ><a href="/html-css/css-drop-down-menu/">Вернуться к статье</a></li>
<li><a href="./" class="dir">Посмотреть разделы сайта</a>
<ul>
<li><a class="dir" href="/html-css/">HTML и CSS</a>
<ul>
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
</ul>
</li>
<li><a href="/js/">JavaScript</a></li>
<li><a href="/photoshop/">Photoshop</a></li>
<li><a href="/design/">Дизайн</a></li>
<li><a href="/misc/">Разное</a></li>
</ul>
</li>
</ul>

Класс dir ставится на тех элементах, которые содержат вложенности.

CSS

У нас будет 2 файла со стилями. Один отвечает за расположение элементов меню, второй — за внешнее оформление (что-то вроде скина).

Посмотрим первый.

@charset "UTF-8";

/**
* Horizontal CSS Drop-Down Menu Module
*
* @file dropdown.css
* @package Dropdown
* @version 0.7.1
* @type Transitional
* @stacks 597-599
* @browsers Windows: IE6+, Opera7+, Firefox1+
* Mac OS: Safari2+, Firefox2+
*
* @link http://www.lwis.net/
* @copyright 2006-2008 Live Web Institute. All Rights Reserved.
*
*/

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

ul.dropdown {
position: relative;
z-index: 597;
float: left;
}

ul.dropdown li {
float: left;
line-height: 1.3em;
vertical-align: middle;
zoom: 1;
}

ul.dropdown li.hover,
ul.dropdown li:hover {
position: relative;
z-index: 599;
cursor: default;
}

ul.dropdown ul {
visibility: hidden;
position: absolute;
top: 100%;
left: 0;
z-index: 598;
width: 100%;
}

ul.dropdown ul li {
float: none;
}

ul.dropdown ul ul {
top: 1px;
left: 99%;
}

ul.dropdown li:hover > ul {
visibility: visible;
}

JavaScript

Как вы смогли заменить по CSS, мы используем псевдо класс :hover для того, чтобы показывать куски меню. Этот самый псевдо класс работает во всех браузера, кроме… да, вы угадали, нашего любимого IE. Поэтому для ослика мы сделаем что-то вроде эмуляции этого псевдо класса. В качестве js фреймворка возьмем jQuery.

$(document).ready(function() {
$("ul.dropdown li").hover(function() {
$(this).addClass("hover");
$('> .dir',this).addClass("open");
$('ul:first',this).css('visibility', 'visible');
}, function() {
$(this).removeClass("hover");
$('.open',this).removeClass("open");
$('ul:first',this).css('visibility', 'hidden');
});

});

А теперь подключаем эти файлы к нашей странице только для IE.

<!--[if lt IE 7]>
<script type="text/javascript" src="js/jquery/jquery.js"></script>
<script type="text/javascript" src="js/jquery/jquery.dropdown.js"></script>
<![endif]-->

Результат

Собрав все воедино, мы получаем наше горизонтальное выпадающее меню.

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

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

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 65

Cuprum
вот еще неплохое http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenu/index.htm
Жека
Классно!
WebMast
У меня есть несколько примеров на блоге. Выложу сейчас, хотя комментарий может пойти в антиспам!
http://bitby.net/design/appearance/sozdanie-menyu-s-poyasneniyami/
Альтернативный вариант, но может будет интересен.
http://bitby.net/web/css/menyu-iz-kartinok/
Делал заказчику..
http://bitby.net/design/vydvizhnoe-menyu-s-pomoschiyu-css/
Это самое что по теме.
Пример есть в первых двух, в тредьтем нет.
З.Ы: В статьях вы найдете примеры, однако там могут возникнуть проблемы с кодировкой. Пользуйте utf-8!
surger
Здорово!
#
surger
surger
Только глюк обнаружил. В FF3.0.5 в вертикальном меню:
при наведении на "About Us", "Products" - раскрывается вся "ветка" вместе с дочерними подменю.
#
surger
ne4to
В IE6 не работает!
При наведении фон меняется, а меню не выпадает
Скрин:
http://img43.imagevenue.com/img.php?image=57710_menu_css_123_1146lo.JPG
#
ne4to
dohlik
Напишите в названии, что фреймворки используете, а то думал что-то новое на чистом CSS есть... Не все же jQuery применяют ;)
smart
Паша, спасибо. Я уже, право, не знал что делать с седьмым ослом. Молодец!
#
smart
akiselev
Способ "на чистом CSS" - это использовать линки в качестве контейнеров, потому как :hover для линков во всех броузерах (нафталин типа NN4.* - не в счет) никто не отменял. Принцип "вложенного" нахождения детей внутри родительского контейнера тоже никто не отменял - пока физически не выйдешь за пределы ребенка - не выйдешь и за пределы родителя, а следовательно не возникнет события out и стиль для :hover останется в действии, хотя дети и будут иметь визуальный сдвиг, как и положено всем выпадающим меню. Конечно возникает момент необходимости обработки собственно клика. тут уж конечно не обойтись без перехвата распространения события на родителей, но это частности. Главное - никаких монстров типа jQuery и плагинов к ним.
#
akiselev
yeka
Сайт очень грамотный уважуха! Именно что нужно !!! Респект!
#
yeka
костя
а если я дам своё меню реально написать для него обработчик под 6 IE?

3 6 2 8-3-7 два 7 2 аська моя
#
костя
Игорь
Помогите пожалуйста!
Я попробовал урок, но у меня не сё получается... Вместо положенного у меня появляются голые ссылки... Причём работают они как показано сдесь, но без красивых кнопочек... Обычные гипер ссылки, которые выпадают друг из друга... Как мне исправить ошибку, что бы всё работало как надо? А урок хороший :) спасибо большое...
#
Игорь
Grin
Игорь, вы скорее всего не все файлы стилей подключили, посмотрите внимательнее на пример
#
Grin
com
А как задать фон для второй и третей подменю?
И так же цвет текста для этих подменю?
ul.dropdown ul li ul li ul {
background:000;
}

так?
#
com
Grin
com, да, как-то так
Gurd
У меня тоже В IE6 не работает!
#
Gurd
Сергей
А как можно сделать, чтобы пункты меню были каждый разного цвета? Помогите пожалуйста!
#
Сергей
Grin
Сергей, добавь к ним нужные классы и потом меняй через CSS
Бертыш
http://www.1cniku.ru/menu.html
Как то криво у меня получилось хотя всё честно сдирал с вашего примера
Grin
Бертыш, у тебя нет файла default.css
veligursky
http://www.webdesign.org/web/html-and-css/tutorials/css-pop-up-menu-2---horizontal-menus.12089.html

без js, только CSS
Grin
veligursky, вот это
li:hover
не будет работать в ие6. А так тоже самое, что и этот скрипт
mikai
Простите пожалуйста а в этом примере весь css нужен, а то никак не разберусь.
Немного пугает размер css-кода, если собрать всё вместе (без импорта), для этого меню...
#
mikai
gps
А как прописать под UMI эту менюшку подскажите пожалуйста..
#
gps  
Виталий
Нашел отличный сервис, спешу поделиться http://www.purecssmenu.com Без проблем сделал меню, скачал и вставил в код сайта. Пример можете глянуть тут http://expensivecars.ru (сверху меню "Разное")
Nenorma
Спасибо - очень помогло.
#
Nenorma
Zergalius
спасибо ,попробую сделать меню на основе вашего примера, мне только надо добавить раскрывающиеся пункты.
zer0
Когда я прохожу по ссылке на ваше меню - Internet Explorer молча все выполняет. Когда же я сохраняю меню на компьютер и запускаю меню с него - IE начинает спрашивает про "разрешить или запретить заблокированные эллементы". Хотя я к коду даже не прикасался...
#
zer0
Grin
zer0, это проблема именно экплорера, он ругается вообще на любой js внутри страницы на компьютере. Чтобы такого не было, можно в самый верх вашего html файла добавить вот эту строчку:
<!-- saved from url=(0014)about:internet --> 
Sonic
использую для создания интернет-магазинов один движок, который описывает меню в табличной вёрстке перед описанием главного контента. Создал выпадающее меню в этом меню слева и в IE оно появляется под другими элементами основного контента.
Прочитал что ИЕ распределяет слои по порядку описания в HTML документе, посоветуйте как лучше справится с этой проблемой, можно ли как-то описать ячейку меню позже ячейки контента, чтоб меню оставалось слева или легче изменить координально дизайн?
#
Sonic
Unioom
Если мы уже используем jQuery для IE6, то почему бы не использовать для всех браузеров. Все равно это не css решение. Какая разница, только для IE6 мы вставляем файл или для всех? Это примерно то же самое, что при повороте машины, откручивать одно из колес, все равно же в данный момент, оно не несет нагрузки!
Ли Алексей
Здравствуйте, хотел воспользоваться этим меню для одного из своих сайтов на Joomla, но при интеграции этого меню в сайт происходит необъяснимый глюк, по крайней мере для меня. Дочерние пункты выпадают, НО только из того пункта меню в котором в данный момент находится пользователь. Из других разделов дочерние пункты не выпадают, пока не перейти в их родительский раздел. Что не так?
Джумла генерит вот такой код:

<div class="hormenu">
<ul class="menu-mmm">
<li id="current" class="parent active item1"><a href="/about"><span>О центре</span></a>
<ul>
<li class="item11"><a href="#"><span>Обращение мэра</span></a></li>
</ul>
</li>
<li class="parent item2"><a href="/info"><span>Информационный раздел</span></a></li>
<li class="parent item7"><a href="/support"><span>Поддержка бизнеса</span></a></li>
<li class="parent item8"><a href="/questions"><span>Вопросы экспертам</span></a></li>
<li class="item9"><a href="/links"><span>Полезные ссылки</span></a></li>
</ul>
</div>


файлы использовал из фреймворка, никаких изменений не вносил в CSS кроме названий классов, т.е. все "dropdown" переименовал в "menu-mmm"
Sonic
Ли Алексей
очевидно, джумла просто не формирует подсписков неактивных кнопок?
в коде видно, что ИД куррент присвоен только одному пункту и только в нём есть ПОДсписок ul li
#
Sonic
Ли Алексей
Тьфу ты елка палка, точно джумла не полный список генерит, я даже не обратил на это внимание, видимо вчера я был лишен бдительности и внимания по причине долгой работы над этим сайтом =)))) Свой же косяк не заметил, спасибо вам большое, иногда требуется свежий взгляд со стороны дабы объективно оценить ситуацию :) Спасибо вам еще раз, проблема решена :)
Hardy
Спасибо! буду пробовать!
#
Hardy
вячеслав
люди подскажите как это меню поставить на dle ни как не додумаюсь.....
#
вячеслав
Сергей
А где файл с внешним оформлением?
Оно делается чисто на CSS ?
#
Сергей
Khlivnyuk
Блин отличный фреймворк, а я недавно вот этот сервис для себя открыл http://purecssmenu.com/ но с фреймворком мне работать проще и быстрее. Спасибо!
дмитрий
То что искал. Спасибо
Виталий
Кто поможет настроить меню в блоге? Дам доступ в админку и объясню подробней. За это от меня подарок! )
belarus
А это можно реализовать в joomla, что бы не пользоваться модулями, или взять за основу создания своего модуля?
Игорь
А что за угловые скобки в стилях? Что они означают?
ul.dropdown li:hover > ul
#
Игорь
Gubkin
На примере работает неплохо - то что мне нужно. Попробую использовать на разрабатываемом сайте.
daffin
Спасибо за примеры! То что нужно!
Саша
Отличное меню! А как сделать его посередине страницы?
Максим
@Игорь, http://www.w3.org/TR/CSS2/selector.html#child-selectors
#
Максим
Savad
Спасибо!
kolobok
а у меня почему-то не отображается(( хотя я наверное запутался в джиквери. печально. кто может подсказать. на сайте этом не работает http://wisework.ru/vllgroup/ , всмысле только и ie не работает, а в остальных норм.
kolobok
если что - аська 27девять 3ноль2 шесть35
Игорь
Павел Марковнин после просмотра его видео уроков много понял очень подробно спасибо ему
Generator CSS Drop-Down Menu http://tort.nxt.ru/css_dropdown_menu.html
Меню работает в IE6 и с выключенном в браузере JavaScript
#
Игорь
Константин
ну наконец то нашел то что мне нужно!!! спасибо ребята!! вы молодцы!!!
Константин
ну наконец то нашел то что мне нужно!!! спасибо ребята!! вы молодцы!!!
Lex
Как-то грустно работает в ИЕ7, коряво, теряет фокус пока переходишь с верхнего элемента на выпавшие..
#
Lex
Leshiy
А где код для линейного меню, а то я туплю совсем
Сергей
Отличная статья, будем сейчас копать свое меню в шапке, то стандартный шаблон выглядит паршиво.
Андрей
Есть интересный вариант (но с JavaScript) на http://sitemaker.x10.bz/downloads.php?id=19
Андрей
Есть интересный вариант (но с JavaScript) на http://sitemaker.x10.bz/articles.php?id=10 (предыдущая ссылка не работает)
pikasso
немного сложноват код! но если над ним посидеть то можно и свою изюминку втиснуть! жаль что у меня нехватает прикрутить к cms :(
Айшат
Я в этом деле новичок... и не понимаю вот те 2файла идут отдельно от кода html или их друг за другом надо писать?Объясните, пожалуйста
#
Айшат  
ринат
не пойму, где второй файл, ткните носом
#
ринат
Denis_____5
я тоже не вижу второй фаил
Константин
Почему не работает в Internet Explorer помогите!
#
Константин
Вячеслав
Здравствуйте! Отличная тема, Спасибо автору. А подскажите можно ли в линейном меню сделать так чтобы подменю не пряталось после того как мышка с него ушла? Если да то как?
#
Вячеслав
X
Здравствуйте!А где второй файл?
#
X
Алекс
Скажите пожалуйста, если распознаете профессиональным взглядом, в какой программе создавался сайт aliexpress.com меня интересует вертикальное всплывающее меню такого типа. Заранее благодарен.
#
Алекс

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler