使用 Jquery 的多级下拉菜单

Posted

技术标签:

【中文标题】使用 Jquery 的多级下拉菜单【英文标题】:Multi Level Drop Down Menu Using Jquery 【发布时间】:2012-05-25 17:07:03 【问题描述】:

我想使用 jQuery 设计一个多级菜单。 我已经写了一些代码。你可以看演示here。 这一切都很好。但我想动态制作多级下拉菜单。

脚本

$('ul#menu > li').hover(function()
    //$('#drop' , this).css('display','block');
     $('.drop' , this).delay(20).slideDown(200);
, function()
 $('.drop' , this).delay(20).slideUp(200);
);​

HTML

<ul id="menu">
    <li><a href="#">Home</a>
        <ul class="drop">
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
        </ul>
    </li>


    <li><a href="#">about</a>
        <ul class="drop">
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
        </ul>
    </li>

</ul>​

CSS

ul#menu

    margin:0;
    padding:0;

ul#menu > li

    list-style:none;
    float:left;
    margin:0;
    padding:0;
    position:relative;

ul#menu a

    text-decoration:none;
    color:#fff;
    background:red;
    display:block;
    padding:10px;

ul#menu > li ul.drop

    margin:0;
    padding:0;
    width:150px;
    position:absolute;
    display:none;

ul#menu > li ul.drop ul

    margin:0;
    padding:0;
    width:150px;
    position:absolute;
    display:none;
    left:150px;
    top:0;

ul#menu > li ul li

    margin:0;
    padding:0;
    list-style:none;
    position:relative;
​

【问题讨论】:

【参考方案1】:

您需要稍微更改 jQuery 脚本以适应这样的多级菜单:

$('ul#menu li').hover(function()
     $(this).children('ul').delay(20).slideDown(200);
, function()
     $(this).children('ul').delay(20).slideUp(200);
);

并像这样更改html

<ul id="menu">
    <li><a href="#">Home</a>
        <ul class="drop">
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li>
                <a href="#">About us</a>
                <ul>
                    <li><a href="#">Sub Item 1</a></li>
                    <li>
                        <a href="#">Sub Item 2</a>
                        <ul>
                            <li><a href="#">Sub item 3</a></li>
                            <li><a href="#">Sub item 4</a></li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>


    <li><a href="#">about</a>
        <ul class="drop">
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
        </ul>
    </li>
</ul>

你的 CSS 很好。 您可以在以下位置查看更新的多级代码:http://jsfiddle.net/297t6/

【讨论】:

【参考方案2】:
$(document).ready(function () 
            var data = [ 'Name': 'Home', 'Url': '#', 'SubMenu': [ 'Name': 'Home1', 'Url': '#' ,  'Name': 'Home2', 'Url': '#' ,  'Name': 'Home3', 'Url': '#' ,  'Name': 'Home4', 'Url': '#' , ] ,  'Name': 'AboutUs', 'Url': '#', 'SubMenu': [ 'Name': 'AboutUs1', 'Url': '#' ,  'Name': 'AboutUs2', 'Url': '#' ,  'Name': 'AboutUs3', 'Url': '#' ,  'Name': 'AboutUs4', 'Url': '#' , ]];

            if (data.length > 0) 
                $('body').prepend('<ul id="menu"><ul>');

                $.each(data, function (i, entity) 
                    var liHtml = [];
                    liHtml.push('<li><a href="' + entity.Url + '">' + entity.Name + '</a>');
                    if (entity.SubMenu.length > 0) 
                        liHtml.push('<ul class="drop">');
                        $.each(entity.SubMenu, function (i, subEntity) 
                            liHtml.push('<li><a href="' + subEntity.Url + '">' + subEntity.Name + '</a>');
                        );
                        liHtml.push('</ul>');
                    
                    liHtml.push('</li>');

                    $('ul#menu').append(liHtml.join(''));
                );
            



            $('ul#menu > li').hover(function () 
                //$('#drop' , this).css('display','block');
                $('.drop', this).delay(20).slideDown(200);
            , function () 
                $('.drop', this).delay(20).slideUp(200);
            );
        );

现场演示见此链接:http://jsfiddle.net/nanoquantumtech/Z5NXv/

【讨论】:

感谢上述解决方案。但是您的解决方案仅适用于 2 级菜单项。即父母和孩子。你能说我怎样才能有无限级别的菜单吗?【参考方案3】:

要使用鼠标单击事件来处理下拉菜单,请使用此代码。

    $('.getdown a.toggle').on('click', function(e) 
        $(this).next('ul').slideToggle(250);
        e.preventDefault(); // to prevent following the link
    );

并像这样向您的 html 添加一些类或 ID,

<ul id="menu">
    <li class="getdown">
        <a href="#" class="toggle">Home</a>
        <ul>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
            <li><a href="#">About us</a></li>
        </ul>
    </li>


    <li class="getdown">
        <a href="#" class="toggle">about</a>
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
            <li><a href="#">Home</a></li>
        </ul>
    </li>

</ul>​

要使用悬停试试这个,

    $(".getdown").hover( function() 
        $(this).children('ul').hide();
        $(this).children('ul').slideDown(250);
    , function() 
        $('ul', this).slideUp(250);
    );

如果您在项目中使用引导程序,请不要在此处使用引导程序类。使用另一个独特的类,因为引导程序可以覆盖某些功能。

【讨论】:

以上是关于使用 Jquery 的多级下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 没有关闭下拉菜单

BootStrap 下拉多级菜单

20款jquery下拉导航菜单特效代码分享

jQuery cxSelect 联动下拉菜单

多级下拉引导

jQuery动态添加多级收缩菜单