简单的jq实现树形菜单

 

最近接的一个新的项目用到了树形菜单,决定跟大家分享下一个简单的树形菜单怎么实现。我也已经把它分装成jq的一个插件,里面的参数也可以根据使用自己去修改。接下来就是放代码了!

part one 样式内容

*{list-style: none;font-size: 16px;}
#wrapTree .menu-slide-sub{
    display: inline-block;
    width: 16px;
    height: 16px;
    background-image: url("../img/sub.png");
    /*background-position: 0 -320px;!*左右 上下*!*/
    line-height: 20px;
    /*vertical-align: middle;*/
}
#wrapTree  .tree-li-title{
    line-height: 20px;
    height: 20px;
    vertical-align: middle;
    cursor: default;

}
#wrapTree  .menu-slide-add{
    display: inline-block;
    width: 16px;
    height: 16px;
    background-image: url("../img/add.png");
    /*background-position: 0 -304px;!*左右 上下*!*/
    line-height: 20px;
    /*vertical-align: middle;*/
}

part two HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="distTree.css">
</head>
<body>
<div id="wrapTree">
    <ul>
        <li class="tree-ul-li">
            <span class="tree-li-title">
                 <a class="tree-toggle menu-slide-sub" href="javascript:;" id="mianTitle"></a>
                存储内容
            </span>
            <ul>
                <li class="tree-ul-li">
                    <span class="tree-li-title">
                         <a class="tree-toggle menu-slide-sub" href="javascript:;"></a>
                        Driver 1
                    </span>
                    <ul>
                        <li class="tree-ul-li">
                            <div>
                                <input type="checkbox" class="inputBox"><label>连续测试</label>
                            </div>
                            <div>
                                <input type="checkbox" class="inputBox"><label>随机测试</label>
                            </div>
                        </li>
                        <li class="tree-ul-li">
                            <div>
                                <input type="checkbox" class="inputBox"><label>连续测试</label>
                            </div>
                            <div>
                                <input type="checkbox" class="inputBox"><label>随机测试</label>
                            </div>
                        </li>
                    </ul>
                </li>
                <li class="tree-ul-li">
                    <span class="tree-li-title">
                       <a class="tree-toggle menu-slide-sub" href="javascript:;"></a>
                        Driver 2 
                    </span>
                    <ul>
                        <li class="tree-ul-li">
                            <div>
                                <input type="checkbox" class="inputBox"><label>连续测试</label>
                            </div>
                            <div>
                                <input type="checkbox" class="inputBox"><label>随机测试</label>
                            </div>
                        </li>
                        <li class="tree-ul-li">
                            <div>
                                <input type="checkbox" class="inputBox"><label>连续测试</label>
                            </div>
                            <div>
                                <input type="checkbox" class="inputBox"><label>随机测试</label>
                            </div>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

</body>
</html>

part three JS

<script>
  
    (function ($) {
        $.fn.tree = function (option) {
            let opt = {
                mainTitle: "#mianTitle",
                toggleCls: "menu-slide-add",//改变的class
                bingEvent: "click",//绑定的事件
            };
            option = $.extend({}, opt, option);
            $("#wrapTree .tree-li-title").on(option.bingEvent, ".tree-toggle", function () {
                let result = $("#mianTitle").hasClass(option.toggleCls);
                if (result) {
                    $(option.mainTitle).parent().next().find("ul").hide();
                }
                $(this).toggleClass(option.toggleCls).parent().next("ul").slideToggle();
            });
            return this;
        }
    })($);
    $(function () {
        $("wrapTree").tree();
    })
</script>

在HTML部分我们的布局首先就要实现树形的布局,树形就是一种父子节点的形式,在上面我通过<ul><li><ul><li></li></ul></li></ul>的一种ul里面包裹着li,li里面包裹着ul的形式去实现。实现页面布局以后再是脚本。先引入jq的资源,jq的封装插件的形式是用$.fn在原型链上实现继承相当于js的$.prototye。我们把方法写在jquery的原型链上。树形菜单的显示隐藏就是通过点击当前的标题,显示隐藏ul里面的内容。toggle()方法就是用与显示隐藏的切换,toggleClass()就是实现样式类命的切换。通过on()方法做事件绑定,整个插件就完成了。

可能在这里大家会有个疑问为什么要return this,那是因为要保持jquery的链式结构,为什么它可以再引用后面的方法就是因为,返回的this,再继续调用原型链上的方法。

还有为什么要增加result的判断,那是我增加的用户体验,当一级菜单收拢以后,再打开,应该是只显示二级菜单,三级菜单是收拢的。因此做了这个判断,如果一级菜单收拢,只显示二级菜单。

这就是整个树形菜单的讲解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值