Главная » Выпадающее меню

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

Пример выпадающего менюСоздание многоуровнего выпадающего меню с помощью CSS, пары строчек Javascript, работающего корректно в Файрфоксе, Опере, Интернет Эксплорере и Сафари кажется вам непосильной задачей? Да ничего подобного!

Давайте развеем это заблуждение.

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

<ul id="nav">
<li><а hrеf="http://www.webmakerslounge.com/">Percoidei</a>
<ul>
<li><а hrеf="http://www.webmakerslounge.com/">Remoras</a>
<ul>
<li><а hrеf="http://www.webmakerslounge.com/">Echeneis</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Phtheirichthys</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Remora</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Remorina</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Rhombochirus</a></li>
</ul>
</li>
<li><а hrеf="http://www.webmakerslounge.com/">Tilefishes</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Bluefishes</a></li>
<li><а hrеf="http://www.webmakerslounge.com/">Tigerfishes</a></li>
</ul>
</li>
<li><а hrеf="http://www.webmakerslounge.com/">Anabantoidei</a>
</li>
</ul>

Теперь у нас есть хорошо структурированый список. Добавим к нему немного стилей:

#nav, #nav ul {
padding: 0;
margin: 0;
list-style: none;
}

#nav a {
display: block;
width: 10em;
}

#nav li {
float: left;
width: 10em;
}

Для селектора #nav li необходимо указать ширину, чтобы это корректно отображалось в Опере. Так же не забудьте указать clear:left для блока, который последует за меню, так как мы используем float.

Теперь нам необходимо само “выпадание”. добавляем следующие стили:

#nav li ul {
position: absolute;
width: 10em;
left: -999em;
}

#nav li:hover ul {
left: auto;
}

Обратите внимание что здесь не используется display:none, для того чтобы сохранить максимальную доступность. Вместо него мы используем left: -999em. Это не обязательно и может быть легко заменено на display:none.

Вы конечно же обратили внимание на то, что у селектора li описан псевдо класс :hover, который конечно же не будет работать в Интернет Эксплорере. Для того, чтобы заставить наше выпадающее меню работать в Интернет Эксплорере мы используем этот маленький скриптик:

sfHover = function() {
var sfEls = document.getElementById("nav").getElementsByTagName("LI");
for (var i=0; i<sfEls.length; i++) {
sfEls[i].onmouseover=function() {
this.className+=" sfhover";
}
sfEls[i].onmouseout=function() {
this.className=this.className.replace(new RegExp(" sfhover\b"), "");
}
}
}
if (window.attachEvent) window.attachEvent("onload", sfHover);

Что делает этот скрипт? Он подменяет псевдо класс :hover для Интернет Эксплорера следующим способом. При событии mouseOver для элемента li скрипт добавляет ему класс sfhover для которого в свою очередь мы тоже должны прописать стиль. При событии mouseOut класс обнуляется.

#nav li.sfhover ul{
left: auto;
}

Вот по большому счету и все. Теперь меню можно украсить и использовать.

Рабочий пример можно скачать.

По материалам HTML dog



13 Комментариев »

  1. 1  Плюс Минус  —1

    Круто, только что опробовал на реальном проекте.
    Вопрос: а можно как-нибудь модифицировать данный вариант меню, чтобы меню второго уровня не появлялась сразу при наведении на родительский элемент, а плавно выезжала. А то я в JS далеко не Бог, а сделать нужно…:)

    Комментарий by Gorik — Март 9, 2007 @ 5:55 pm | Цитировать

  2. 2  Плюс Минус  —1

    Gorik

    То что модифицировать можно, это точно :) Но я сам тоже не пробовал.

    Если сделаю, выложу.

    Комментарий by neutrino — Март 9, 2007 @ 6:40 pm | Цитировать

  3. 3  Плюс Минус  —2

    Ждём с нетерпением :)

    Комментарий by Gorik — Март 9, 2007 @ 8:14 pm | Цитировать

  4. 4  Плюс Минус  —1

    > neutrino

    Ещё вопрос: Вы не знаете, почему в IE6/IE7 эта менюшка жутко глючит? Вот пример странички, где я её использовал. Браузер тормозит просто ужасно, я уж и не знаю что делать. Может что посоветуете?

    P.S. Флешка на это никак не влияет, пробовал заливать обычную имагу вместо неё, тормоза всё равно остаются :(

    Комментарий by Gorik — Март 14, 2007 @ 2:01 am | Цитировать

  5. 5  Плюс Минус  0

    Прив, коллеги! Выпадающее меню уже сделал: все пащет на “ура” (можете поглядеть, тока осталось сделать одну вещичку: я хочу, чтобы при наведении мышой на тусклый банер, он, банер, ПЛАВНО загорался. Кто знает, как это забодяжить? Пишите на мыло: gamlet-petr@mail.ru.

    P.S. Кто хочет бесплатно обменяться банерами - пишите на sotmania@narod.ru.

    Комментарий by Hamlet — Апрель 26, 2007 @ 8:57 am | Цитировать

  6. 6  Плюс Минус  0

    А как модифицировать скрипт, чтобы меню работало на любое количество вложений? Или хотя бы 3-4. Я нигде такой инфы не нашел, может быть вы поможете чем

    Комментарий by Максим — Май 4, 2007 @ 8:07 pm | Цитировать

  7. 7  Плюс Минус  0

    Или хотя бы 3-4.

    Посмотри здесь, Максим.

    Комментарий by neutrino — Май 4, 2007 @ 9:25 pm | Цитировать

  8. 8  Плюс Минус  +1

    Посмотри здесь, Максим.

    Спасибо огромное!! То что надо!

    Комментарий by Максим — Май 5, 2007 @ 9:57 am | Цитировать

  9. 9  Плюс Минус  0

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

    Комментарий by Алексей — Июнь 21, 2007 @ 9:07 am | Цитировать

  10. 10  Плюс Минус  —2

    to Алексей

    :hover - упрямая штука. Если сделать большой отступ, то выпадающий список будет пропадать, когда ты будешь убирать мышку с родительского списка. Здесь уже без JS не обойтись, чтобы реализовать задержку. Вадим “pepelsbey” Макеев отлично справился с этой задачей.

    Комментарий by neutrino — Июнь 21, 2007 @ 12:07 pm | Цитировать

  11. 11  Плюс Минус  0

    Вот бьюсь уже не первый день с такова типа менюшками.. У меня проблема такая: у всех меню такого типа выпадающий блок имеет четко заданную ширину, а мне надо, чтобы он растягивался и чтоб растягивались на всю длинну, входящие в него тк они имеют своё оформления и когда они разной длинны - получается некрасиво.. ещё проблема возникает, если растянуть само меню на 100% по ширине: некоторые блоки не раскрываются вообще.. вот такие дела(( подскажите пожалуйста, есть ли решение проблемы.. мой адрес taurlom@mail.ru.. заранее спасибо..

    Комментарий by taurlom — Ноябрь 7, 2007 @ 5:14 pm | Цитировать

  12. 12  Плюс Минус  +2

    taurlom,
    я не совсем понял какое меню вам нужно. зачем растягивать его на 100%?

    Комментарий by neutrino — Ноябрь 7, 2007 @ 11:55 pm | Цитировать

  13. 13  Плюс Минус  +2

    taurlom, я не совсем понял какое меню вам нужно. зачем растягивать его на 100%?

    Меню должно выглядеть так как сдесь: http://rada.ru/ только чтоб работало в Мозиле..

    Комментарий by taurlom — Ноябрь 8, 2007 @ 2:12 pm | Цитировать

Оставить комментарий

XHTML (Разрешенные теги): <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> .

Если вы хотите вставить в комментарий код, то жмите на кнопку "HTML" в редакторе и используйте теги <pre><code> и </pre></code> для вставки.

Не забывайте о том, что теги, вставленые без использования &lt;/&gt; будут автоматически трансформироваться.

Цитировать отмеченый текст