原生js书写纵向导航三级菜单demo(附代码)

有梦想,有干货,微信搜索【半糖学前端】关注这个生活有点苦的半糖。

先来看下demo的样子:

大概就是这个样子了,很简单。为什么写这个demo呢 ?

主要是最近的项目用到了一个这样的功能,而我们已经很习惯的找组件

像什么elementUi,BJui等一些UI框架都有这样的功能

人家封装好的直接就拿来用了,平时为了工作效率也就那样做了

但是后面呢就想不用框架也写一个demo吧,万一谁能用到呢

所以就有了今天的例子了,话不多说,直接上代码


html部分

<div class="menuheightscrollY">
   <div class="close" id="toggle_menu_btn">
       <button id="toggle_btn">收起</button>
   </div>
   <ul class="menu_box expended" id="menu_box">
   </ul>
</div>

css部分

li{
    list-style: none;
}
.menuheightscrollY{
    width: 180px;
    background: #eee;
    margin-left: 20px;
}
.menu_box{
    margin: 0;
    padding: 0;
}
.menu_item{
    line-height: 50px;
    cursor: pointer;
    border-top: 1px solid transparent;
    border-bottom: 1px solid #e5e5e5;
    font-size: 14px;
    text-align: left;
}
.menu_item:hover{
    border-bottom: 1px solid #16a96a;
    border-top: 1px solid #16a96a;
    background: #f1faf7;
}
#toggle_menu_btn{
    text-align: right;
    line-height: 40px;
    border-bottom: 1px solid #16a96a;
}
#toggle_menu_btn button{
    cursor: pointer;
    padding: 2px 16px;
}
.menu_icon{
  display: inline-block;
  width: 40px;
}
/* 二级菜单 */
.sub_menu_box {
	display: none;
	background: #fafafa;
	padding: 0px;
	margin: 0px;
	background: -webkit-linear-gradient(top, #fff, #eaeaea);
	background: -moz-linear-gradient(top, #fff, #eaeaea);
	background: -ms-linear-gradient(top, #fff, #eaeaea);
	background: linear-gradient(top, #fff, #eaeaea);
}
.sub_menu {
    cursor: pointer;
    font-size: 14px;
    margin-left: 0;
    height: 40px;
    line-height: 40px;
    text-align: left;
    color: #333;
    padding-left: 40px;
    background: #fff;
    border-right: 3px solid #fff;
    border-bottom: 1px solid #e5e5e5;
    position: relative;
  }
  
  .sub_menu:hover:before {
    content: "";
    position: absolute;
    right: 0px;
    margin-top: -6px;
    top: 50%;
    border-left: 5px solid transparent;
    border-top: 5px solid transparent;
    border-bottom: 5px solid transparent;
    border-right: 5px solid #16a96a;
  }
  
  .sub_menu:hover {
    border-bottom: none;
    border-bottom: 1px solid #e5e5e5;
    background: #fff;
    color: #16a96a;
    border-right: 3px solid #16a96a;
  }
  
  .sub_menu.checked:before {
    content: "";
    position: absolute;
    right: 0px;
    margin-top: -6px;
    top: 50%;
    border-left: 5px solid transparent;
    border-top: 5px solid transparent;
    border-bottom: 5px solid transparent;
    border-right: 5px solid #90cf5d;
  }
  
  .sub_menu.checked {
    padding-left: 3px;
    background: #fff;
    color: #16a96a;
    border-right: 3px solid #90cf5d;
  }
  /* 三级菜单 */
  .third_menu_box{
    display: none;
    padding-bottom: 8px;
    max-height: 300px;
    overflow-x: hidden;
    overflow-y: auto;
}
.third_menu_box{
  width: 180px;
}
.menuheightscrollY .third_menu_box{
	display: none;
	padding-bottom: 8px;
}
  .third_menu {
    position: static;
    white-space: nowrap;
    transition: padding 0.3s;
    display: flex;
    align-items: center;
	  padding-left: 10px;
    color: #707070;
    padding-right: 10px;
}
.menuheightscrollY .third_menu_box.showing{
	position: fixed;
	top: 0;
	left: 0;
	min-width: 180px;
	margin-top: -1px;
	padding: 0 1px;
	background-color: #fff;
	box-shadow: 2px 1px 3px rgba(0, 0, 0, 0.1);
	border: 1px solid #e5e5e5;
	border-left: 0;
	border-radius: 0 3px 3px 0;
}
.menuheightscrollY .third_menu_box.showing > li:hover {
  background-color: #e0f4eb;
  color: #16a96a;
}

 js部分

 // 一级菜单数据
        var menulist = [{ "menuNo": "01", "menuName": "用户管理" },
        { "menuNo": "02", "menuName": "数据管理中心" },
        { "menuNo": "03", "menuName": "公共管理" },
        { "menuNo": "04", "menuName": "结算服务" },
        { "menuNo": "05", "menuName": "客户管理" },
        { "menuNo": "06", "menuName": "投资管理" },
        { "menuNo": "07", "menuName": "中间业务" },
        { "menuNo": "08", "menuName": "流量监控" }]
        // 二级菜单数据
        var mainMenuNo = [
            {"parent_menuNo": "02","menuNo":"0201", "menuName": "个人业务"},
            {"parent_menuNo": "02","menuNo":"0202", "menuName": "一卡管理"},
            {"parent_menuNo": "02","menuNo":"0203", "menuName": "电子银行"},
            {"parent_menuNo": "02","menuNo":"0204", "menuName": "手机短信"},
            {"parent_menuNo": "01","menuNo":"0101", "menuName": "上网流量"},
            {"parent_menuNo": "08","menuNo":"0801", "menuName": "短信通知"},
            {"parent_menuNo": "03","menuNo":"0301", "menuName": "手机银行"},
            {"parent_menuNo": "05","menuNo":"0501", "menuName": "数字钱包"},
            {"parent_menuNo": "04","menuNo":"0401", "menuName": "金额查询"},
            {"parent_menuNo": "02","menuNo":"0205", "menuName": "待办任务"},
            {"parent_menuNo": "02","menuNo":"0206", "menuName": "个人查询"},
            {"parent_menuNo": "01","menuNo":"0102", "menuName": "密码重置"},
            {"parent_menuNo": "05","menuNo":"0502", "menuName": "流量开通"},
            {"parent_menuNo": "06","menuNo":"0601", "menuName": "数字金融"},
            {"parent_menuNo": "03","menuNo":"0302", "menuName": "电商入口"},
            {"parent_menuNo": "07","menuNo":"0701", "menuName": "倒车入库"},
            {"parent_menuNo": "08","menuNo":"0802", "menuName": "银行开户"},
            {"parent_menuNo": "08","menuNo":"0803", "menuName": "贷款业务"},
        ];
        // 三级菜单数据
        var ThirdMenuNo = [
            {"parent_menuNo": "0201","menuNo":"020101", "menuName": "个人业务"},
            {"parent_menuNo": "0201","menuNo":"020102", "menuName": "一卡管理"},
            {"parent_menuNo": "0203","menuNo":"020301", "menuName": "电子银行"},
            {"parent_menuNo": "0202","menuNo":"020201", "menuName": "手机短信"},
            {"parent_menuNo": "0101","menuNo":"010101", "menuName": "上网流量"},
            {"parent_menuNo": "0801","menuNo":"080101", "menuName": "短信通知"},
            {"parent_menuNo": "0301","menuNo":"030101", "menuName": "手机银行"},
            {"parent_menuNo": "0501","menuNo":"050101", "menuName": "数字钱包"},
            {"parent_menuNo": "0401","menuNo":"040101", "menuName": "金额查询"},
            {"parent_menuNo": "0201","menuNo":"020103", "menuName": "待办任务"},
            {"parent_menuNo": "0203","menuNo":"020302", "menuName": "个人查询"},
            {"parent_menuNo": "0101","menuNo":"010102", "menuName": "密码重置"},
            {"parent_menuNo": "0501","menuNo":"050102", "menuName": "流量开通"},
            {"parent_menuNo": "0601","menuNo":"060101", "menuName": "数字金融"},
            {"parent_menuNo": "0301","menuNo":"030102", "menuName": "电商入口"},
            {"parent_menuNo": "0701","menuNo":"070101", "menuName": "倒车入库"},
            {"parent_menuNo": "0803","menuNo":"080301", "menuName": "银行开户"},
            {"parent_menuNo": "0802","menuNo":"080201", "menuName": "贷款业务"},
        ];
        // 一级菜单
        var html = "";
        $.each(menulist, function (index, menu) {
            html += "<li class='menu_item' title=" + menu.menuName + "><div class='menu_text other' id='" + menu.menuNo + "'>";
            html += "<i title=" + menu.menuName + " class='menu_icon'></i>" + menu.menuName;
            html += "<i class=' expend_menu_btn'></i>"
            html += "</div></li>";
        })
        $("#menu_box").html(html);
        // 二级菜单
        $.each(menulist, function (index, menu) {
            getSecondMenu(mainMenuNo,menu.menuNo);
        })
       
        function getSecondMenu(mainMenuNo, tx_code) {
            var secondData = [];
            for (var i=0;i< mainMenuNo.length;i++) {
                var pid = mainMenuNo[i].parent_menuNo;
                if (pid == tx_code) {
                    secondData.push(mainMenuNo[i])
                }
            }
            var html = "<ul class='sub_menu_box'>";
            $.each(secondData, function (index, secondMenu) {
                var id = secondMenu.menuNo;
                var text = secondMenu.menuName;
                html += "<li class='sub_menu' id='" + id + "'>";
                html += id + "-" + text + "</li>";
            })
            html += "</ul>";
            var $subMenuBox = $(html)
            $("#" + tx_code).parent(".menu_item").append($subMenuBox);
            $.each(secondData, function (index, ThirdMenu) {
                getThirdMenu(ThirdMenuNo, ThirdMenu.menuNo);
            })
        }

        function getThirdMenu(ThirdMenuNo, secMenuNo) {
            var thirdData = [];
            for (var i=0;i< ThirdMenuNo.length;i++) {
                var pid = ThirdMenuNo[i].parent_menuNo;
                if (pid == secMenuNo) {
                    thirdData.push(ThirdMenuNo[i])
                }
            }
            var html = "<ul class='third_menu_box'>";
            $.each(thirdData, function (index, menu) {
                var id = menu.menuNo;
                var text = menu.menuName;
                html += "<li class='third_menu' id='" + id + "'>";
                html += id + "-" + text + "</li>";
            })
            html += "</ul>";
            var $thirdMenuBox = $(html)
            $("#" + secMenuNo).append($thirdMenuBox);
        }

        //三级菜单显示
        $(".sub_menu").hover(function () {
            $(".third_menu_box").removeClass("showing")
            var $thirdMenuBox = $(this).find(".third_menu_box");
            var y = $(this).offset().top;
            $thirdMenuBox.addClass("showing");
            var h = $(window).height()-y;
            var hei_md = h-$thirdMenuBox.outerHeight();
            var $topy = y-$thirdMenuBox.outerHeight()+40;
            if(hei_md<0){
                $thirdMenuBox.css({ "transform": "translate3d(200px, " + $topy+ "px, 0px)", "display": "block" });
            }else{
                $thirdMenuBox.css({ "transform": "translate3d(200px, " + y + "px, 0px)", "display": "block" });
            }
            
        }, function () {
            var $thirdMenuBox = $(this).find(".third_menu_box");
            $thirdMenuBox.removeClass("showing");
            $thirdMenuBox.attr({ "style": "" });
        });
        $("#toggle_btn").click(function () {
            var $menuBox = $("#menu_box");
            //
            if ($menuBox.hasClass("expended")) { //展开
                $(".menuheightscrollY").animate({ "margin-left": "-124px" }, 300, "linear");
                $menuBox.removeClass("expended");
                $('#toggle_btn').text('展开');
            } else {//折叠
                $(".menuheightscrollY").animate({ "margin-left": "20px" }, 300, "linear");
                $menuBox.addClass("expended");
                $('#toggle_btn').text('收起');
            }
        });
        $(".menu_text").click(function () {
            var $menuItem = $(this).parent(".menu_item");
            $menuItem.find(".sub_menu_box").slideToggle(300, function () {
                //控制菜单高度
                var height = $menuItem.next(".sub_menu_box").height();
            })
            $menuItem.siblings(".menu_item").find(".sub_menu_box").slideUp(300);
        });

代码块也可以看到基本呢比较简单,测试的时候记得引入jquery

数据定义部分大家就要灵活变化了,我这边是写死的测试数据

按这个写基本就是我们一开始图片看到的样子了,如果有需要的也可以根据自己的需求进行修改使用

能帮助到大家那就更好了,我是@半糖学前端,期待下次见面

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原生 JavaScript 实现三级分销小 Demo 的主要步骤如下: 1. 创建三个用户: 1) 顶级用户:拥有最高级别的分销权力。 2) 一级用户:由顶级用户推广而来,拥有中级分销权力。 3) 二级用户:由一级用户推广而来,拥有最低级别的分销权力。 2. 定义用户类,并设置三个属性:姓名、级别、推广收益。 ```javascript class User { constructor(name, level) { this.name = name; this.level = level; this.profit = 0; } } ``` 3. 创建用户实例,并设置级别和姓名: ```javascript const topUser = new User("顶级用户", "顶级"); const firstLevelUser = new User("一级用户", "一级"); const secondLevelUser = new User("二级用户", "二级"); ``` 4. 实现用户推广的方法,即通过推广链接注册用户,上级用户获得相应的推广收益: ```javascript function promoteUp(user, invitee) { if (user.level === "顶级") { invitee.profit += 100; // 顶级用户推广新用户获得100元推广收益 } else if (user.level === "一级") { invitee.profit += 50; // 一级用户推广新用户获得50元推广收益 } else if (user.level === "二级") { invitee.profit += 30; // 二级用户推广新用户获得30元推广收益 } } ``` 5. 测试推广的过程: ```javascript promoteUp(topUser, firstLevelUser); // 顶级用户推广一级用户 promoteUp(firstLevelUser, secondLevelUser); // 一级用户推广二级用户 ``` 6. 输出用户的推广收益: ```javascript console.log(topUser.profit); // 输出 100 console.log(firstLevelUser.profit); // 输出 50 console.log(secondLevelUser.profit); // 输出 30 ``` 这就是一个简单的原生 JavaScript 实现的三级分销小 Demo。通过不同的级别和推广链接,上级用户可以获得相应的推广收益。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值