原生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 相关文章推荐
浅谈javascript面向对象程序设计
Jan 21 Javascript
jQuery实现防止提交按钮被双击的方法
Mar 24 Javascript
JavaScript中标识符提升问题
Jun 11 Javascript
JS实现仿QQ效果的三级竖向菜单
Sep 25 Javascript
一道关于JavaScript变量作用域的面试题
Mar 08 Javascript
json数据处理及数据绑定
Jan 25 Javascript
iview同时验证多个表单问题总结
Sep 29 Javascript
React 源码中的依赖注入方法
Nov 07 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 Javascript
Vue实现开心消消乐游戏算法
Oct 22 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
原生js实现轮播图特效
May 04 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
非常好的js代码
2006/06/27 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python微信好友数据分析详解
2018/11/19 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
详解python中@的用法
2019/03/27 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
Python如何在DataFrame增加数值
2020/02/14 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
Java软件工程师综合面试题笔试题
2013/09/08 面试题
质检员岗位职责
2013/12/17 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
好的演讲稿开场白
2013/12/30 职场文书
中学家长会邀请函
2014/02/03 职场文书
防沙治沙典型材料
2014/05/07 职场文书
大学生个人求职信例文
2014/07/07 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
企业催款函范本
2015/06/24 职场文书