原生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 相关文章推荐
页面实时更新时间的JS实例代码
Dec 18 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
为指定的元素添加遮罩层的示例代码
Jan 15 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
Bootstrap页面布局基础知识全面解析
Jun 13 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
详解JavaScript树结构
Jan 09 Javascript
Django使用多数据库的方法
Sep 06 Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
微信小程序功能之全屏滚动效果的实现代码
Nov 22 Javascript
JS原型与继承操作示例
May 09 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 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中通过eval实现字符串格式的计算公式
2017/03/18 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
python绘图库Matplotlib的安装
2014/07/03 Python
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Python安装selenium包详细过程
2019/07/23 Python
python requests指定出口ip的例子
2019/07/25 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
高中体育教学反思
2014/01/24 职场文书
个人课题方案
2014/05/08 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
个人合伙协议书范本
2014/10/14 职场文书
个人整改方案范文
2014/10/25 职场文书
党支部四风整改方案
2014/10/25 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书