基于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 相关文章推荐
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 Javascript
微信小程序实现图片压缩功能
Jan 26 Javascript
vue移动端路由切换实例分析
May 14 Javascript
浅谈Vue.js路由管理器 Vue Router
Aug 16 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
vue 中Virtual Dom被创建的方法
Apr 15 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 Javascript
javascript的hashCode函数实现代码小结
Aug 11 Javascript
原生JS实现音乐播放器
Jan 26 Javascript
简单谈谈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调用Oracle存储过程的方法
2008/09/12 PHP
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
在Python中使用模块的教程
2015/04/27 Python
python3抓取中文网页的方法
2015/07/28 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
买房委托公证书
2014/04/08 职场文书
房产公证书范本
2014/04/10 职场文书
承诺函范文
2015/01/21 职场文书
政工师工作总结2015
2015/05/26 职场文书
离婚协议书格式范本
2016/03/18 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python