无限层菜单

无限层菜单插件

我们可能遇到过二级菜单、三级菜单…。但是如果菜单有多少层不固定怎么办呢?也就是说有多少层子菜单完全看后台返回的数据。工作中我也遇到了这种情况,于是就自己写了一个方法把它渲染了一下,希望对大家有帮助。
代码运行效果

废话不多说,直接上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body{
            background: #f2f8ff;
        }
        .nav-left{
            background-color: #fff;
            max-width: 300px;
            min-height: 400px;
            padding:20px 30px;
            line-height: 35px;
            font-size: 14px;
            color:#333333;
        }
        div.first-nav{
            display:block;
        }
        .nav-item{
            display: none;
        }
        .nav-item span{
            border-radius: 50%;
            display: inline-block;
            width:15px;
            height:15px;
            line-height: 14px;
            text-align: center;
            vertical-align: middle;
            border:1px solid #333;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="nav-left"></div>
    <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
    <script>
        var numOfNav=0;//第几层,默认从0开始
        var backdata={//模拟的json数据
            data:[
                {
                    name:'全部校区',
                    data:[
                        {
                            name:'郑州职业技术学院',
                            num:500,
                            data:[
                                {
                                    name:'网络营销',
                                    num:300,
                                    data:[
                                        {
                                            name:'网络营销1班',
                                            num:100
                                        },
                                        {
                                            name:'网络营销2班',
                                            num:200
                                        }
                                    ]
                                },
                                {
                                    name:'移动应用开发',
                                    num:300,
                                    data:[
                                        {
                                            name:'移动应用开发1班',
                                            num:200
                                        },
                                        {
                                            name:'移动应用开发2班',
                                            num:100
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            name:'河南测绘技术学院',
                            num:500,
                            data:[
                                {
                                    name:'网络营销',
                                    num:300,
                                    data:[
                                        {
                                            name:'网络营销1班',
                                            num:100
                                        },
                                        {
                                            name:'网络营销2班',
                                            num:200
                                        }
                                    ]
                                },
                                {
                                    name:'移动应用开发',
                                    num:300,
                                    data:[
                                        {
                                            name:'移动应用开发1班',
                                            num:200,
                                            data:[
                                            {
                                                name:'小明',
                                                num:100
                                            },
                                        {
                                            name:'小红',
                                            num:100
                                        }
                                    ]
                                        },
                                        {
                                            name:'移动应用开发2班',
                                            num:100
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        };

        function createNav(elem,data,index){//创建菜单 elem为菜单的父元素,data为数据,index为渲染的层数从1开始
            for(var i in data){
                numOfNav++
                var str='';
                str+='<div style="padding-left:'+(index*4)+'px" class="nav-'+index+' nav-item elem'+numOfNav;
                if(index==1){
                    str+=' first-nav';
                }
                str+='">';
                if(typeof(data[i].data)!='undefined'&&data[i].data.length!=0){
                    str+=    '<span state="add">+</span>&nbsp;';
                }
                str+=data[i].name;
                if(typeof(data[i].num)!='undefined'){
                    str+='('+data[i].num+')';
                }
                str+='</div>';
                elem.append(str);
                if(typeof(data[i].data)!='undefined'&&data[i].data.length!=0){
                    createNav($('.elem'+numOfNav),data[i].data,index+1);
                }
            }
        }

        $(function(){
            createNav($('.nav-left'),backdata.data,1);//创建菜单

            $('body').on('click','.nav-item span',function(){//绑定各级菜单展开与闭合事件
                if($(this).attr('state')=="add"){
                    $(this).text('-');
                    $(this).attr('state','decrease');
                    $(this).parent('.nav-item').children('.nav-item').show();
                }else{
                    $(this).text('+');
                    $(this).attr('state','add');
                    $(this).parent('.nav-item').children('.nav-item').hide();
                }
                
            })
        })
    </script>
</body>
</html>

以上代码直接复制到浏览器上打开即可看到效果,因为之前做的项目是PC端的,所以这个样式也是pc端的。如果需要,样式可以自行更改,使用这个方法需要使用的数据格式与backdata的数据格式一致,前端菜鸟一枚,不足之处请前辈们指教,谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值