基于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 中介者模式实例
Dec 16 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
Dec 24 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
Mar 10 Javascript
JS经典正则表达式笔试题汇总
Dec 15 Javascript
canvas红包照片实例分享
Feb 28 Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 Javascript
微信小程序之前台循环数据绑定
Aug 18 Javascript
webpack 插件html-webpack-plugin的具体使用
Apr 09 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python获取糗百图片代码实例
2013/12/18 Python
跟老齐学Python之折腾一下目录
2014/10/24 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
Python操作mongodb的9个步骤
2018/06/04 Python
Python绘制热力图示例
2019/09/27 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Python bytes string相互转换过程解析
2020/03/05 Python
客户经理岗位职责
2013/12/08 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
纪委立案决定书
2015/06/24 职场文书
使用pytorch实现线性回归
2021/04/11 Python
详解Python中下划线的5种含义
2021/07/15 Python
MySQL存储过程及语法详解
2022/08/05 MySQL