原生JS实现N级菜单的代码


Posted in Javascript onMay 21, 2017

需求分析

简单的分析一下,要实现N级菜单,首先从布局入手,即判断是否有下级菜单

1.没有下一级菜单,直接排列

2.有下级菜单,又分为下级菜单排放位置,和在上级菜单显示类似 '>' 的符号,效果如图:

原生JS实现N级菜单的代码

图:1

 初步实现

1.实现是否存在   >

注意: 下面凡是担忧 xxx===yyy ? xxx : xxx都是利用三元表达式,来表达思路。

HTML结构如下:

原生JS实现N级菜单的代码

图:2

•要实现图一的效果,我们只需要判断li标签里面的children.length===2 ? 'span存在' : 'span移除'

2.下级菜单出现位置

HTML结构如下:

原生JS实现N级菜单的代码

•实现这一需求,也需要判断children.length===2 ? '上级菜单相对定位, top为0,left为上级的offsetWidth,下级菜单绝对定位' : '不做任何处理'

具体代码即实现

效果图如下:

原生JS实现N级菜单的代码

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }
    #box {
      margin: 200px 0 0 50px;
      text-align: center;
      color: #ccc;
    }
    ul {
      list-style: none;
      float: left;
    }
    li {
      width: 150px;
      height: 40px;
      line-height: 40px;
      background-color: #124520;
      border: 1px solid #eee;
      position: relative;
    }
    li span {
      position: absolute;
      top: 0;
      right: 10px;
    }
    li:hover {
      background-color: #666;
      transition: background-color .5s;
    }
    ul {
      display: none;
    }
    ul.first {
      display: block;
    }
    .relative {
      position:relative;
      top: 0;
      left: 0;
    }
    .absolute {
      position: absolute;
      left: 0;
      top: 0;
    }
    .show {
      display: block;
    }
    .hide {
      display: none;
    }
  </style>
</head>
<body>
  <div id="box">
    <ul class="first">
      <li>一级菜单
        <span>></span>
      </li>
      <li>一级菜单
        <span>></span>
        <ul>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
          <li>二级菜单
            <span>></span>
          </li>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
        </ul>
      </li>
      <li>一级菜单
        <span>></span>
        <ul>
          <li>二级菜单
            <span>></span>
          </li>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
          <li>二级菜单
            <span>></span>
            <ul>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
              <li>三级菜单
                <span>></span>
              </li>
            </ul>
          </li>
        </ul>
      </li>
      <li>一级菜单
        <span>></span>
      </li>
    </ul>
  </div>
</body>
<script type="text/javascript">
let uls = document.querySelectorAll("ul"); //获取所有的ul
let lis = document.querySelectorAll("li"); //获取所有的li
let liWidth = document.querySelector("#box ul").offsetWidth-2 //li的宽度 -2是为了好看
/* 布局start */
/*
 * 
 * 通过下面布局中代码实现每个 li.children.length 要么为0 要么为2
 * 0 无下级菜单
 * 2 有下级菜单
 * 
 */
for (let i = uls.length - 1; i >= 0; i--) {
  if(uls[i].parentNode.nodeName === "LI") {
    uls[i].parentNode.classList.add("relative"); //相对定位
    uls[i].classList.add("absolute"); // 绝对定位
    uls[i].style.left = liWidth + "px"; 
  }
}
for (var i = 0; i < lis.length; i++) {
  if( lis[i].children.length === 1) { //没有下一级菜单直接删除
    lis[i].children[0].outerHTML = "";
  };
}
/* 布局end */
for (let i = 0; i < lis.length; i++) { // 控制每一个li
  lis[i].onmouseover = function() {
    if( lis[i].children.length === 2) {
      this.children[1].classList.remove("hide");
      this.children[1].classList.add("show");
    } 
  }
  lis[i].onmouseout = function() {
    if( lis[i].children.length === 2) {
      this.children[1].classList.remove("show");
      this.children[1].classList.add("hide");
    }
  }
}
</script>
</html>

以上所述是小编给大家介绍的原生JS实现N级菜单的代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jquery 定位input元素的几种方法小结
Jul 28 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
javascript生成随机数的方法
May 16 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
JavaScript导出Excel实例详解
Nov 25 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
Jul 27 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
Python版实现微信公众号扫码登陆
May 28 Javascript
Ionic + Angular.js实现图片轮播的方法示例
May 21 #Javascript
详解Angular2中Input和Output用法及示例
May 21 #Javascript
Angular2中如何使用ngx-translate进行国际化
May 21 #Javascript
详解angularjs利用ui-route异步加载组件
May 21 #Javascript
如何在AngularJs中调用第三方插件库
May 21 #Javascript
详解Angular-Cli中引用第三方库
May 21 #Javascript
Angular2安装angular-cli
May 21 #Javascript
You might like
php数组添加元素方法小结
2014/12/20 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
JS 表单验证大全
2011/11/23 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
python实现进程间通信简单实例
2014/07/23 Python
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Python中的引用知识点总结
2019/05/20 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Python Http请求json解析库用法解析
2020/11/28 Python
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
会计电算化专业毕业生自荐信
2013/12/20 职场文书
公务员培训心得体会
2013/12/28 职场文书
店面销售职位的职责
2014/03/09 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python