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

29 декабря 2008, 2:00 Павел Марковнин HTML и CSS рейтинг +26-
Выпадающее меню 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, можно так же получить вертикальное и линейное меню.

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

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

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

RSS
  • Аватарка
    29 декабря 2008 в 14:09 ]]>Cuprum]]>
    вот еще неплохое http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenu/index.htm
  • Аватарка
    29 декабря 2008 в 17:36 ]]>Жека]]>
    Классно!
  • Аватарка
    30 декабря 2008 в 11:59 ]]>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!
  • Аватарка
    30 декабря 2008 в 15:30 surger
    Здорово!
  • Аватарка
    30 декабря 2008 в 15:36 surger
    Только глюк обнаружил. В FF3.0.5 в вертикальном меню:
    при наведении на "About Us", "Products" - раскрывается вся "ветка" вместе с дочерними подменю.
  • Аватарка
    13 января 2009 в 17:40 ne4to
    В IE6 не работает!
    При наведении фон меняется, а меню не выпадает
    Скрин:
    http://img43.imagevenue.com/img.php?image=57710_menu_css_123_1146lo.JPG
  • Аватарка
    14 января 2009 в 9:20 ]]>dohlik]]>
    Напишите в названии, что фреймворки используете, а то думал что-то новое на чистом CSS есть... Не все же jQuery применяют ;)
  • Аватарка
    27 февраля 2009 в 11:47 smart
    Паша, спасибо. Я уже, право, не знал что делать с седьмым ослом. Молодец!
  • Аватарка
    5 марта 2009 в 17:29 akiselev
    Способ "на чистом CSS" - это использовать линки в качестве контейнеров, потому как :hover для линков во всех броузерах (нафталин типа NN4.* - не в счет) никто не отменял. Принцип "вложенного" нахождения детей внутри родительского контейнера тоже никто не отменял - пока физически не выйдешь за пределы ребенка - не выйдешь и за пределы родителя, а следовательно не возникнет события out и стиль для :hover останется в действии, хотя дети и будут иметь визуальный сдвиг, как и положено всем выпадающим меню. Конечно возникает момент необходимости обработки собственно клика. тут уж конечно не обойтись без перехвата распространения события на родителей, но это частности. Главное - никаких монстров типа jQuery и плагинов к ним.
  • Аватарка
    6 марта 2009 в 9:43 yeka
    Сайт очень грамотный уважуха! Именно что нужно !!! Респект!
  • Аватарка
    8 марта 2009 в 1:54 костя
    а если я дам своё меню реально написать для него обработчик под 6 IE?

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

    так?
  • Аватарка
    6 мая 2009 в 3:07 ]]>Grin]]>
    com, да, как-то так
  • Аватарка
    11 мая 2009 в 13:44 Gurd
    У меня тоже В IE6 не работает!
  • Аватарка
    14 мая 2009 в 17:52 Сергей
    А как можно сделать, чтобы пункты меню были каждый разного цвета? Помогите пожалуйста!
  • Аватарка
    15 мая 2009 в 22:20 ]]>Grin]]>
    Сергей, добавь к ним нужные классы и потом меняй через CSS
  • Аватарка
    22 мая 2009 в 16:13 ]]>Бертыш]]>
    http://www.1cniku.ru/menu.html
    Как то криво у меня получилось хотя всё честно сдирал с вашего примера
  • Аватарка
    22 мая 2009 в 16:27 ]]>Grin]]>
    Бертыш, у тебя нет файла default.css
  • Аватарка
    5 июня 2009 в 19:36 ]]>veligursky]]>
    http://www.webdesign.org/web/html-and-css/tutorials/css-pop-up-menu-2---horizontal-menus.12089.html

    без js, только CSS
  • Аватарка
    5 июня 2009 в 19:40 ]]>Grin]]>
    veligursky, вот это
    li:hover
    не будет работать в ие6. А так тоже самое, что и этот скрипт
  • Аватарка
    8 июня 2009 в 0:09 mikai
    Простите пожалуйста а в этом примере весь css нужен, а то никак не разберусь.
    Немного пугает размер css-кода, если собрать всё вместе (без импорта), для этого меню...
  • Аватарка
    8 ноября 2009 в 13:35 ]]>gps]]>
    А как прописать под UMI эту менюшку подскажите пожалуйста..
  • Аватарка
    24 декабря 2009 в 22:56 ]]>Виталий]]>
    Нашел отличный сервис, спешу поделиться http://www.purecssmenu.com Без проблем сделал меню, скачал и вставил в код сайта. Пример можете глянуть тут http://expensivecars.ru (сверху меню "Разное")
  • Аватарка
    13 января в 1:21 Nenorma
    Спасибо - очень помогло.
  • Аватарка
    31 января в 0:31 ]]>Zergalius]]>
    спасибо ,попробую сделать меню на основе вашего примера, мне только надо добавить раскрывающиеся пункты.
  • Аватарка
    17 февраля в 16:52 zer0
    Когда я прохожу по ссылке на ваше меню - Internet Explorer молча все выполняет. Когда же я сохраняю меню на компьютер и запускаю меню с него - IE начинает спрашивает про "разрешить или запретить заблокированные эллементы". Хотя я к коду даже не прикасался...
  • Аватарка
    17 февраля в 17:06 ]]>Grin]]>
    zer0, это проблема именно экплорера, он ругается вообще на любой js внутри страницы на компьютере. Чтобы такого не было, можно в самый верх вашего html файла добавить вот эту строчку:
    <!-- saved from url=(0014)about:internet --> 
  • Аватарка
    22 февраля в 15:40 Sonic
    использую для создания интернет-магазинов один движок, который описывает меню в табличной вёрстке перед описанием главного контента. Создал выпадающее меню в этом меню слева и в IE оно появляется под другими элементами основного контента.
    Прочитал что ИЕ распределяет слои по порядку описания в HTML документе, посоветуйте как лучше справится с этой проблемой, можно ли как-то описать ячейку меню позже ячейки контента, чтоб меню оставалось слева или легче изменить координально дизайн?
  • Аватарка
    3 марта в 15:34 ]]>Unioom]]>
    Если мы уже используем jQuery для IE6, то почему бы не использовать для всех браузеров. Все равно это не css решение. Какая разница, только для IE6 мы вставляем файл или для всех? Это примерно то же самое, что при повороте машины, откручивать одно из колес, все равно же в данный момент, оно не несет нагрузки!
  • Аватарка
    14 марта в 20:09 ]]>Ли Алексей]]>
    Здравствуйте, хотел воспользоваться этим меню для одного из своих сайтов на 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"
  • Аватарка
    15 марта в 3:15 Sonic
    Ли Алексей
    очевидно, джумла просто не формирует подсписков неактивных кнопок?
    в коде видно, что ИД куррент присвоен только одному пункту и только в нём есть ПОДсписок ul li
  • Аватарка
    15 марта в 4:52 ]]>Ли Алексей ]]>
    Тьфу ты елка палка, точно джумла не полный список генерит, я даже не обратил на это внимание, видимо вчера я был лишен бдительности и внимания по причине долгой работы над этим сайтом =)))) Свой же косяк не заметил, спасибо вам большое, иногда требуется свежий взгляд со стороны дабы объективно оценить ситуацию :) Спасибо вам еще раз, проблема решена :)
  • Аватарка
    28 апреля в 16:25 ]]>Hardy]]>
    Спасибо! буду пробовать!
  • Аватарка
    22 мая в 23:17 вячеслав
    люди подскажите как это меню поставить на dle ни как не додумаюсь.....
  • Аватарка
    29 июля в 11:59 Сергей
    А где файл с внешним оформлением?
    Оно делается чисто на CSS ?
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>