原生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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
jQuery入门第一课 jQuery选择符
Mar 14 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
javascript生成大小写字母
Jul 03 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
Javascript实现跑马灯效果的简单实例
May 31 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
Dec 18 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
Nov 08 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
JavaScript常用工具函数大全
May 06 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作的文本留言本的例子(四)
2006/10/09 PHP
PHP正则验证Email的方法
2015/06/15 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
老生常谈Python基础之字符编码
2017/06/14 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
python图像和办公文档处理总结
2019/05/28 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
Python下载的11种姿势(小结)
2020/11/18 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
建筑工地标语
2014/06/18 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
临时用工协议书范本
2014/10/29 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang