Попробуем реализовать меню, рассмотренное в прошлой статье, полностью отказавшись от списков.
Разметим страницу. На сей раз мы обернем весь контент, относящийся к навигации, в общий блок и зададим ему класс nav_wrap. Пункты верхних уровней сделаем заголовками со ссылками, а пункты, которые должны показываться и прятаться обернем в блок с классом sub_nav и каждую ссылку в свою очередь разместим внутри параграфа. Для меню разметка странновата, но у нас сейчас цель увидеть разницу между реализацией меню, построенном на списках и без них (к тому же разметка без списков, как нельзя лучше, подойдет для страницы вопрос-ответ):
<div class="nav_wrap"> <h3><a href="#">Главная</a></h3> <h3><a href="#">Новости</a></h3> <div class="sub_nav"> <p><a href="#">Хроника</a></p> <p><a href="#">Политика</a></p> <p><a href="#">Спорт</a></p> <p><a href="#">За рубежом</a></p> </div> <h3><a href="#">О нас</a></h3> <div class="sub_nav"> <p><a href="#">Отзывы</a></p> <p><a href="#">События</a></p> </div> <h3><a href="#">Связь с нами</a></h3> </div>
Теперь добавим стилевые правила и получим точно такое же меню, как и в прошлом примере, только размеченное по другому (вот она вся мощь css):
.nav_wrap { margin:20px; width:200px; } .nav_wrap a { padding:5px 10px 5px 20px; display:block; color:#8b8b8b; text-decoration:none; } .nav_wrap h3 a { padding-left:10px; color:#000; } .nav_wrap h3 { font-size:14px; font-weight:bold; color:#000; text-decoration:none; background:#e4e7ea; border-bottom:1px solid #d4d9df; } .sub_nav { width:100%; display:none; background:#ededed; } .sub_nav p { font-size:12px; color:#8b8b8b; border-bottom:1px solid #d4d9df; }
Займемся анимацией. Для реализации задуманного нам на сей раз понадобится отловить клик на заголовке и показать соседний, расположенный по соседству скрытый блок. При повторном клике этот блок нужно спрятать. Возьмем js, рассмотренный в прошлой статье и слегка подправим его:
$(function () { $('div.nav_wrap h3').click(function() { var checkElement = $(this).next('.sub_nav'); checkElement.stop().animate({'height':'toggle'}, 500); if((checkElement) && (checkElement.is(':visible'))) { return false; } }); });
В приведенном выше примере мы отслеживаем клик на заголовке, затем находим соседний элемент, показываем его, если он был скрыт, или прячем, если он был видимый.
Обратите внимание, что на сей раз в методе next() мы указываем, что нам необходим не любой, следующий за заголовком элемент, а только блок с классом sub_nav. Если бы мы этого не сделали, то при клике на заголовок Главная спрятался бы соседний пункт меню Новости.
Несмотря на то, что в примерах, описанных в предыдущей и этой статьях, использовались совершенно разные разметки, обе реализации меню выглядят и работаю абсолютно одинаково.
Пора демонстрировать работу начальству (какой из вариантов представить - дело вкуса). Шеф остается доволен, но выдвигает идею - было бы неплохо, что бы при клике по следующему пункту меню, предыдущий закрывался и пункты, в которых присутствует вложенность, имели какую то метку (например, стрелочку), показывающую, что внутри них прячется еще что то.
Без проблем, мы чувствуем в себе силы и готовы исполнить эти капризы... в следующей статье добавим к аккордеону все, что просит руководство.
Исходный код примера, если потребуется, качаем по ссылке ниже.