基于JavaScript实现多级菜单效果


Posted in Javascript onJuly 25, 2017

本文实例为大家分享了js实现多级菜单效果展示的具体代码,供大家参考,具体内容如下

具体代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    *{
      margin:0;
      padding:0;
      font-size:14px;
    }
    ul,li{
      list-style:none;
    }
    .box{
      margin:10px;
      padding:10px;
      width:300px;
      border:1px dashed #008000;
      /*渐进增强:首先设置一个纯色的背景,对于不兼容css3的浏览器来说会使用纯色,对于兼容的浏览器,我们在下面在额外的增加一些渐变色,这样会覆盖掉上面*/
      background:#ffe470;
      background:-webkit-linear-gradient(top left,#2b93d2,#fa5889,#cde074,#ffe470);
      background:-moz-linear-gradient(top left,#2b93d2,#fa5889,#cde074,#ffe470);
      background:-o-linear-gradient(top left,#2b93d2,#fa5889,#cde074,#ffe470);
      background:linear-gradient(top left,#2b93d2,#fa5889,#cde074,#ffe470);
    }
    .box li{
      position:relative;
      line-height:30px;
    }
    .box em{
      position:absolute;
      top:7px;
      left:0;
      width:16px;
      height:16px;
      background:url("img/icon.png") no-repeat -59px -28px;
      cursor:pointer;

    }
    .box span{
      display:block;
      padding-left:20px;
    }
    .box em.open{
      background-position:-42px -28px;
    }
    .box .two{
      margin-left:20px;
    }
    .box .three{
      margin-left:40px;
    }
    .box .four{
      margin-left:60px;
    }
    .box .two,.box .three,.box .four{
      display:none;
    }
  </style>
</head>
<body>
  <div class='box' id='box'>
    <ul>
      <li>
        <em></em>
        <span>第一级第一个</span>
        <ul class='two'>
          <li><span>第二级第一个</span></li>
          <li>
            <em></em><span>第二级第二个</span>
            <ul class='three'>
              <li><span>第三极第一个</span></li>
              <li><span>第三极第二个</span></li>
              <li>
                <em></em><span>第三极第三个</span>
                <ul class='four'>
                  <li><span>第四级第一个</span></li>
                  <li><span>第四级第二个</span></li>
                  <li><span>第四级第三个</span></li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <em></em><span>第二级第三个</span>
            <ul class='three'>
              <li><span>第三级第一个</span></li>
              <li><span>第三级第二个</span></li>
              <li><span>第三级第三个</span></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    <ul>
      <li>
        <em></em>
        <span>第一级第一个</span>
        <ul class='two'>
          <li><span>第二级第一个</span></li>
          <li>
            <em></em><span>第二级第二个</span>
            <ul class='three'>
              <li><span>第三极第一个</span></li>
              <li><span>第三极第二个</span></li>
              <li>
                <em></em><span>第三极第三个</span>
                <ul class='four'>
                  <li><span>第四级第一个</span></li>
                  <li><span>第四级第二个</span></li>
                  <li><span>第四级第三个</span></li>
                </ul>
              </li>
            </ul>
          </li>
          <li>
            <em></em><span>第二级第三个</span>
            <ul class='three'>
              <li><span>第三级第一个</span></li>
              <li><span>第三级第二个</span></li>
              <li><span>第三级第三个</span></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </div>

  <script>
    var box = document.getElementById('box');
    //把列表中的span(前面有em的span)设置一个 cursor:pointer的样式
    var spanList = box.getElementsByTagName("span");
    for(var i = 0;i<spanList.length;i++){
      var curSpan = spanList[i];
      var curPre = utils.prev(curSpan);
      if(curPre && curPre.tagName.toLowerCase()==="em"){
        curSpan.style.cursor = "pointer"
      }

    }
    //使用事件委托实现我们的操作
    box.onclick = function(e){
      e = e || window.event;
      var tar = e.target || e.srcElement;

      //只有点击的是em或者span标签,我们才进行展开收缩的操作
      if(/^(em|span)$/i.test(tar.tagName)){
        var parent = tar.parentNode;//获取父亲
        var firstUl = utils.children(parent,"ul")[0]//获取父亲子集中的第一个ul标签
        var oEm = utils.children(parent,"em")[0]
        if(firstUl){
          //如果隐藏让显示,否则让隐藏
          var isBlock = utils.getCss(firstUl,"display") === "block" ? true : false;
          if(isBlock){
            firstUl.style.display = "none";
            if(oEm){
              utils.removeClass(oEm,"open")
            }
            //当外层的收起,里层所有的ul都要隐藏,所有的em都要移除open样式
            var allUl = parent.getElementsByTagName("ul"),allEm = parent.getElementsByTagName("em");
            for(var i = 0;i<allUl.length;i++){
              allUl[i].style.display = "none";
              utils.removeClass(allEm[i],"open");
            }
          }else{
            firstUl.style.display = "block";
            if(oEm){
              utils.addClass(oEm,"open")
            }
          }
        }

      }
    }
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 的继承
Oct 01 Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
使用console进行性能测试
Apr 27 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
Jun 13 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
微信小程序wx.previewImage预览图片实例详解
Dec 07 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
详解jQuery中的getAll()和cleanData()
Apr 15 jQuery
Vue快速实现通用表单验证的方法
Feb 24 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 Javascript
用vue设计一个日历表
Dec 03 Vue.js
简单谈谈React中的路由系统
Jul 25 #Javascript
老生常谈js中的MVC
Jul 25 #Javascript
教你5分钟学会用requirejs(必看篇)
Jul 25 #Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
Jul 25 #Javascript
Vue项目中引入外部文件的方法(css、js、less)
Jul 24 #Javascript
基于JavaScript实现百度搜索框效果
Jun 28 #Javascript
深入理解基于vue-cli的vuex配置
Jul 24 #Javascript
You might like
PHP中显示格式化的用户输入
2006/10/09 PHP
php 团购折扣计算公式
2011/11/24 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
2016/01/20 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
学习python的几条建议分享
2013/02/10 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
python如何写出表白程序
2020/06/01 Python
编写python代码实现简单抽奖器
2020/10/20 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
业务员岗位职责
2013/11/16 职场文书
电子银行营销方案
2014/02/22 职场文书
酒店节能减排方案
2014/05/26 职场文书
机械机修工岗位职责
2014/08/03 职场文书
社会实践活动报告
2015/02/05 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
白银帝国观后感
2015/06/17 职场文书