欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

程序员文章站 2022-06-30 18:19:28
...
<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  <title>侧边菜单test</title>
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
  <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
  <style type="text/css">
    * {
      box-sizing: border-box !important;
    }

    div.container-fluid {}

    div.menuDiv {
      width: 230px;
      background: rgba(44, 59, 65, 1);
    }

    div.menuDiv ul.nav li a {
      text-decoration: none;
      cursor: pointer;
      border-left-width: 3px;
      border-left-style: solid;
      border-left-color: rgba(60, 141, 188, 0);
    }

    div.menuDiv ul.nav li a:link,
    div.menuDiv ul.nav li a:visited,
    div.menuDiv ul.nav li a:active {
      background: rgba(1, 1, 1, 0);
      color: rgba(184, 199, 206, 1);
    }

    div.menuDiv ul.nav li a:hover {
      background: rgba(30, 40, 44, 1);
      color: rgba(255, 255, 255, 1);
    }

    div.menuDiv ul.nav .icon-left {
      padding-right: 5px;
    }

    div.menuDiv ul.nav .icon-right {
      float: right;
      padding-top: 12px;
      padding-right: 10px;
    }

    div.menuDiv .nav-first {}

    div.menuDiv .nav-first>li {}

    div.menuDiv .nav-first>li>a {
      height: 40px;
      line-height: 40px;
      padding-top: 0;
      padding-right: 0;
      padding-bottom: 0;
      padding-left: 10px;
      margin: 0;
    }

    div.menuDiv .nav-first>li.active>a {
      background: rgba(30, 40, 44, 1) !important;
      color: rgba(255, 255, 255, 1) !important;
      border-left-color: rgba(60, 141, 188, 1);
    }

    div.menuDiv .nav-child {}

    div.menuDiv .nav-child>li {}

    div.menuDiv .nav-child>li>a {
      height: 30px;
      line-height: 30px;
      padding-top: 0;
      padding-right: 0;
      padding-bottom: 0;
      padding-left: 25px;
      margin: 0;
    }

    div.menuDiv .nav-child>li.borderLeft>a {
      border-left-color: rgba(60, 141, 188, 0.6);
    }

    div.menuDiv .nav-child>li.active>a {
      background: rgba(30, 40, 44, 1) !important;
      color: rgba(255, 255, 255, 1) !important;
      border-left-color: rgba(60, 141, 188, 0.6);
    }
  </style>
</head>

<body>
  <div class="container-fluid">
    <h1>Hello,Bootstrap!</h1>
  </div>
  <br>
  <div class="container-fluid">
    <button onclick="menuPullback('.menuDiv')">点我收缩菜单</button>
  </div>
  <br>
  <div class="container-fluid">
    <div class="row">
      <div class="menuDiv" role="navigation">
        <!--
				nav-pills 胶囊标签
				nav-stacked 垂直堆叠
				-->
        <ul class="nav nav-list nav-first">
          <li class="active"><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>首页</span></a></li>
          <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单1</span></a></li>
          <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单2</span></a></li>
          <li>
            <a href="#">
							<span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span>
							<span class="icon-right glyphicon glyphicon-chevron-up"></span>
							<span>菜单3</span>
						</a>
            <ul class="nav nav-list nav-child">
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单31</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单32</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单33</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单34</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单35</span></a></li>
            </ul>
          </li>
          <li>
            <a href="#">
							<span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span>
							<span class="icon-right glyphicon glyphicon-chevron-up"></span>
							<span>菜单4</span>
						</a>
            <ul class="nav nav-list nav-child">
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单41</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单42</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单43</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单44</span></a></li>
              <li><a href="#"><span class="icon-left glyphicon glyphicon-home" aria-hidden="true"></span><span>菜单45</span></a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </div>

  <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
  <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
  <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

  <script>
    // 是否显示一级菜单折叠按钮
    var hsfoldIcon = true;
    // 需要控制隐藏/显示的span元素
    var hsSpanElement; // = hsfoldIcon ? 'ul.nav>li>a>span:not([class*="glyphicon "])': 'ul.nav>li>a>span:not([class*="icon-left "])';

    /** 一级菜单绑定单击事件(折叠/展开二级菜单) */
    $('ul.nav-first>li>a').click(function(event) {
      // 实现菜单折叠
      $(this).next('ul').slideToggle();
      $(this).children('span.icon-right').toggleClass('glyphicon-chevron-up').toggleClass('glyphicon-chevron-down');
      hsSpanElement = hsfoldIcon ? 'ul.nav>li>a>span:not([class*="glyphicon "])' : 'ul.nav>li>a>span:not([class*="icon-left "])';
      $(hsSpanElement).each(function() {
        if (menuIsShow) {
          $(this).show();
        } else {
          $(this).hide();
        }
      });
    });
    $('ul.nav-first>li').click(function(event) {
      menuClick1(this);
    });
    $('ul.nav-first>li>ul.nav-child>li').click(function(event) {
      menuClick2(this);
    });

    /** 一级菜单绑定单击事件(触发样式和链接),obj是一级菜单li */
    function menuClick1(obj) {
      var objUl = $(obj).find('ul');
      var aHref = "/_xwq/content-wrapper/404.html ";
      if (objUl.html() == undefined || objUl.length <= 0) { // 无子菜单,触发单击事件
        // 去除所有二级菜单活动状态
        $('ul.nav-first>li>ul.nav-child>li').removeClass('borderLeft').removeClass('active');
        // 去除所有一级菜单活动状态
        $('ul.nav-first>li').removeClass('active');
        // 当前菜单(一级菜单)加上活动状态
        $(obj).addClass('active');
        // 获取a标签链接
        if (!($(obj).find('a').attr('aHref') == undefined || $(obj).find('a').attr('aHref') == '#' || $(obj).find('a').attr('aHref').trim() == '')) {
          aHref = $(obj).find('a').attr('aHref');
        }
        console.log("menuUrl: " + aHref);
        // $('.basepage_container_right_center').load(aHref);
      }
    }

    /** 二级菜单绑定单击事件(触发样式和链接),obj是二级菜单li */
    function menuClick2(obj) {
      var aHref = "/_xwq/content-wrapper/404.html ";
      // 去除所有二级菜单活动状态
      $('ul.nav-first>li>ul.nav-child>li').removeClass('borderLeft').removeClass('active');
      // 当前菜单及其同级菜单(二级菜单)加上状态
      $(obj).parent().children().each(function(i, v) {
        if ($(this).children('a').html() != $(obj).children('a').html()) {
          $(this).addClass('borderLeft');
        } else {
          $(this).addClass('active');
          return false;
        }
      });
      // 去除所有一级菜单活动状态
      $('ul.nav-first>li').removeClass('active');
      // 当前菜单的上级菜单(一级菜单)加上活动状态
      $(obj).parent().parent().addClass('active');
      // 获取a标签链接
      if (!($(obj).find('a').attr('aHref') == undefined || $(obj).find('a').attr('aHref') == '#' || $(obj).find('a').attr('aHref').trim() == '')) {
        aHref = $(obj).find('a').attr('aHref');
      }
      console.log("menuUrl: " + aHref);
      // $('.basepage_container_right_center').load(aHref);
    }

    var menuIsShow = true; // 菜单收缩标志
    var menuWidth; // 菜单宽度

    /** 
     * 菜单收缩/展开
     * element 菜单所在容器宽度设置,例如'#menuDiv'
     */
    function menuPullback(element) {
      // 控制li>a>span隐藏状态
      hsSpanElement = hsfoldIcon ? 'ul.nav>li>a>span:not([class*="glyphicon "])' : 'ul.nav>li>a>span:not([class*="icon-left "])';
      $(hsSpanElement).each(function() {
        if ($(this).is(':hidden')) {
          $(this).show();
        } else {
          $(this).hide();
        }
      });
      // 判断menuIsShow的状态
      if (menuIsShow) {
        menuWidth = 60;
        $(element).width(menuWidth); // 设置宽度
        // 修改标志位
        menuIsShow = false;
      } else {
        menuWidth = 230;
        $(element).width(menuWidth); // 设置宽度
        menuIsShow = true;
      }
    }

    /**
     * 文字化菜单(菜单展开)
     * element 菜单所在容器宽度设置,例如'#menuDiv'
     */
    function menuExtend(element) {
      // 控制li>a>span隐藏状态
      hsSpanElement = hsfoldIcon ? 'ul.nav>li>a>span:not([class*="glyphicon "])' : 'ul.nav>li>a>span:not([class*="icon-left "])';
      $(hsSpanElement).each(function() {
        $(this).show();
      });
      // 判断menuIsShow的状态
      menuWidth = 230;
      $(element).width(menuWidth); // 设置宽度
      menuIsShow = true;
    }

    /** 
     * 图标化菜单(菜单收缩)
     * element 菜单所在容器宽度设置,例如'#menuDiv'
     */
    function menushrink(element) {
      // 控制li>a>span隐藏状态
      hsSpanElement = hsfoldIcon ? 'ul.nav>li>a>span:not([class*="glyphicon "])' : 'ul.nav>li>a>span:not([class*="icon-left "])';
      $(hsSpanElement).each(function() {
        $(this).hide();
      });
      // 判断menuIsShow的状态
      menuWidth = 60;
      $(element).width(menuWidth); // 设置宽度
      // 修改标志位
      menuIsShow = false;
    }

    $(function() {
      hsfoldIcon = true;
			
			var element = '.menuDiv';
      menuPullback(element); // 收缩菜单
      // 鼠标经过(展开菜单)
      $(element).mouseover(function() {
        menuExtend(element);
      });
      // 鼠标离开(收缩菜单)
      $(element).mouseout(function() {
        menushrink(element);
      });
    });
  </script>
</body>

</html>

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是一级菜单**

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是二级菜单**

 

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是二级菜单被折叠

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是菜单收缩

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是菜单收缩和二级菜单折叠

bootstrap+jquery+css折叠菜单 收缩菜单 效果(只有两级菜单)

上面是菜单收缩后隐藏一级菜单折叠图标

 

该菜单是我参照AdminLTE的菜单效果自己模仿写的,本来自己用的AdminLTE但是发现菜单和页面交互不好,一点菜单就刷新整个页面的,自己想改的话太麻烦了,要看它底层,而且引用的组件比较多,都给我绕晕了。后来工作中用到layui,又采用layui的菜单,但是发现layui的样式和bootstrap有些会互相影响覆盖,但是又想用bootstrap就弃用了layui准备自己写菜单的效果。

 

代码里有个aHref这个是我一开始使用AdminLTE结合springboot、thymeleaf的时候发现的一个bug(adminLTE里一级菜单如果存在treeview属性a链接的功能会失效),于是就给了一个aHref属性用来存菜单链接,后面请求的时候再取出来用,你们可以忽略不计

 

只写了两级菜单,太多的不想考虑了,自己慢慢写断断续续写了好久,对自己前端的积累挺有帮助的,写的不好大家海涵

 

20180822对代码进行了改进:

1)jquery的初始化方法297行变量hsfoldIcon

hsfoldIcon=false; 收缩菜单会隐藏一级菜单折叠图标

hsfoldIcon=true; 收缩菜单会显示一级菜单折叠图标

 

2)添加了鼠标经过和离开自动触发收缩菜单事件,不想要的可以注释掉298行后面的代码和两个绑定事件

 

如果有bug请留言