顶部导航对应侧边栏菜单切换 有小伙伴提到了在顶部导航增加几个导航,点击导航左侧显示对应的菜单,普通版本可以增加url的参数,根据参数输出不同的左侧菜单,这里就不细说,主要说一下iframe版本的大概写法。 其实也改动不大,并不难,这里主要讲v3。(v4拉倒最下面看演示示例) 1、首先,把左侧菜单处理下,以模板项目里面的菜单为例,这里把它拆成三份。如下: ```html <nav class="sidebar-main"> <ul class="nav nav-drawer" id="menus-1"> <!--默认菜单内容--> <li class="nav-item active"> <a class="multitabs" href="lyear_main.html"><i class="mdi mdi-home"></i> <span>后台首页</span></a> </li> <li class="nav-item nav-item-has-subnav"> <a href="javascript:void(0)"><i class="mdi mdi-palette"></i> <span>UI 元素</span></a> <ul class="nav nav-subnav"> <li> <a class="multitabs" href="lyear_ui_buttons.html">按钮</a> </li> <li> <a class="multitabs" href="lyear_ui_cards.html">卡片</a> </li> <li> <a class="multitabs" href="lyear_ui_grid.html">格栅</a> </li> <li> <a class="multitabs" href="lyear_ui_icons.html">图标</a> </li> <li> <a class="multitabs" href="lyear_ui_tables.html">表格</a> </li> <li> <a class="multitabs" href="lyear_ui_modals.html">模态框</a> </li> <li> <a class="multitabs" href="lyear_ui_tooltips_popover.html">提示 / 弹出框</a> </li> <li> <a class="multitabs" href="lyear_ui_alerts.html">警告框</a> </li> <li> <a class="multitabs" href="lyear_ui_pagination.html">分页</a> </li> <li> <a class="multitabs" href="lyear_ui_progress.html">进度条</a> </li> <li> <a class="multitabs" href="lyear_ui_tabs.html">标签页</a> </li> <li> <a class="multitabs" href="lyear_ui_typography.html">排版</a> </li> <li> <a class="multitabs" href="lyear_ui_step.html">步骤</a> </li> <li> <a class="multitabs" href="lyear_ui_other.html">其他</a> </li> </ul> </li> <li class="nav-item nav-item-has-subnav"> <a href="javascript:void(0)"><i class="mdi mdi-format-align-justify"></i> <span>表单</span></a> <ul class="nav nav-subnav"> <li> <a class="multitabs" href="lyear_forms_elements.html">基本元素</a> </li> <li> <a class="multitabs" href="lyear_forms_radio.html">单选框</a> </li> <li> <a class="multitabs" href="lyear_forms_checkbox.html">复选框</a> </li> <li> <a class="multitabs" href="lyear_forms_switch.html">开关</a> </li> </ul> </li> </ul> <ul class="nav nav-drawer collapse" id="menus-2"> <!--第三个菜单内容--> <li class="nav-item nav-item-has-subnav"> <a href="javascript:void(0)"><i class="mdi mdi-file-outline"></i> <span>示例页面</span></a> <ul class="nav nav-subnav"> <li> <a class="multitabs" href="lyear_pages_doc.html">文档列表</a> </li> <li> <a class="multitabs" href="lyear_pages_gallery.html">图库列表</a> </li> <li> <a class="multitabs" href="lyear_pages_config.html">网站配置</a> </li> <li> <a class="multitabs" href="lyear_pages_rabc.html">设置权限</a> </li> <li> <a class="multitabs" href="lyear_pages_add_doc.html">新增文档</a> </li> <li> <a class="multitabs" href="lyear_pages_guide.html">表单向导</a> </li> <li> <a class="multitabs" href="lyear_pages_data_table.html">表格插件</a> </li> <li> <a href="lyear_pages_login.html" target="_blank">登录页面</a> </li> <li> <a href="lyear_pages_error.html" target="_blank">错误页面</a> </li> </ul> </li> </ul> <ul class="nav nav-drawer collapse" id="menus-3"> <!--第三个菜单内容--> <li class="nav-item nav-item-has-subnav"> <a href="javascript:void(0)"><i class="mdi mdi-language-javascript"></i> <span>JS 插件</span></a> <ul class="nav nav-subnav"> <li> <a class="multitabs" href="lyear_js_datepicker.html">日期选取器</a> </li> <li> <a class="multitabs" href="lyear_js_sliders.html">滑块</a> </li> <li> <a class="multitabs" href="lyear_js_colorpicker.html">选色器</a> </li> <li> <a class="multitabs" href="lyear_js_chartjs.html">Chart.js</a> </li> <li> <a class="multitabs" href="lyear_js_jconfirm.html">对话框</a> </li> <li> <a class="multitabs" href="lyear_js_tags_input.html">标签插件</a> </li> <li> <a class="multitabs" href="lyear_js_notify.html">通知消息</a> </li> </ul> </li> <li class="nav-item nav-item-has-subnav"> <a href="javascript:void(0)"><i class="mdi mdi-menu"></i> <span>多级菜单</span></a> <ul class="nav nav-subnav"> <li> <a href="#!">一级菜单</a> </li> <li class="nav-item nav-item-has-subnav"> <a href="#!">一级菜单</a> <ul class="nav nav-subnav"> <li> <a href="#!">二级菜单</a> </li> <li class="nav-item nav-item-has-subnav"> <a href="#!">二级菜单</a> <ul class="nav nav-subnav"> <li> <a href="#!">三级菜单</a> </li> <li> <a href="#!">三级菜单</a> </li> </ul> </li> </ul> </li> <li> <a href="#!">一级菜单</a> </li> </ul> </li> </ul> </nav> ``` 代码中 `id="menus-*"` ,叫什么自己定义即可,后面的菜单内容加上 `collapse` 隐藏。 2、其次,添加顶部导航,这里放到 `topbar-left` 里面(v4的版本是 `navbar-left`)。 ```html <div class="topbar-left"> <div class="lyear-aside-toggler"> <span class="lyear-toggler-bar"></span> <span class="lyear-toggler-bar"></span> <span class="lyear-toggler-bar"></span> </div> <div class="dropdown"> <span class="header-icon-menu" data-toggle="dropdown"><i class="mdi mdi-apps"></i></span> <ul class="nav navbar-nav dropdown-menu icon-menu-ul"> <li class="active"><a href="javascript:void(0)" onclick="showMenus(this, 1)">默认</a></li> <li><a href="javascript:void(0)" onclick="showMenus(this, 2)">菜单一</a></li> <li><a href="javascript:void(0)" onclick="showMenus(this, 3)">菜单二</a></li> </ul> </div> </div> ``` 3、菜单上有 `onclick` 事件,对应的方法如下: ```javascript function showMenus(obj, id) { $('.sidebar-main .nav-drawer').slideUp('slow'); $('#menus-'+id).slideDown('slow'); $(obj).parent('li').addClass('active').siblings().removeClass('active'); $('.lyear-layout-sidebar-scroll').animate({scrollTop: 0}, 300); // 处理滚动条到最上方 } ``` 4、针对顶部菜单,还需要写一些响应式的样式,避免在手机上的错位 ```css .topbar-left .navbar-nav { margin: 0px; } .topbar-left .navbar-nav a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } .topbar-left .navbar-nav a i { display: none; } .topbar-left .navbar-nav li { float: left; } @media screen and (max-width: 980px) { .header-icon-menu { display: block; height: 68px; line-height: 68px; font-size: 1.5em; cursor: pointer; padding: 0 12px; text-align: center; } .topbar-left .icon-menu-ul li { float: none; } } @media (min-width: 980px) { .header-icon-menu { display: none; } .topbar-left .navbar-nav.dropdown-menu { display: block; position: inherit; box-shadow: none; background-color: transparent; } [data-headerbg*='color_'] .topbar-left .navbar-nav a { color: rgba(255, 255, 255, .75); } [data-headerbg*='color_'] .topbar-left .navbar-nav a:focus, [data-headerbg*='color_'] .topbar-left .navbar-nav a:hover { color: #fff; } [data-headerbg*='color_'] .topbar-left .navbar-nav>.active>a, [data-headerbg*='color_'] .topbar-left .navbar-nav>.active>a:focus, [data-headerbg*='color_'] .topbar-left .navbar-nav>.active>a:hover { background-color: rgba(255,255,255,.125); color: #fff; } } ``` 5、这里还需要对tab插件做一些简单的修改,找到 `bootstrap-multitabs/multitabs.js`,新增js代码(大概567行): ```javascript $('.nav-drawer').find('li').removeClass('active'); $navObj.parent('li').addClass('active'); $navHasSubnav.first().addClass('active'); // 下面是新增的代码,别复制错了 var $thisDrawer = $navHasSubnav.parent('.nav-drawer'), $thisDrawerId = $thisDrawer.attr('id'), $thisIdArr = $thisDrawerId.split('-'); $.each($('.nav-drawer'), function (i, v) { var $thisUl = $(v); if ($thisUl.attr('id') == $thisDrawerId) { $thisDrawer.stop(true, true).show(); } else { $thisUl.slideUp('500'); } }); $.each($('.navbar-nav li'), function (inx, ve) { var $thisLi = $(ve); $thisLi.removeClass('active'); if ((inx+1) == $thisIdArr[1]) { $thisLi.addClass('active'); } }) // 上面是新增的代码,别复制错了 // 当前菜单无子菜单 if (!$navObj.parents('.nav-item').first().is('.nav-item-has-subnav')) { var hht = 48 * ( $navObj.parents('.nav-item').first().prevAll().length - 1 ); $('.lyear-layout-sidebar-scroll').animate({scrollTop: hht}, 300); } // 另外还要注意这里的一句代码(复制了上面的代码后是595行),增加了一个stop(false, true) var $sideDownObj = $navObj.parents('ul.nav-subnav').stop(false, true).filter(':hidden'); ``` > 如果你使用的是 .min.js 的压缩文件,请在修改完后自行压缩到 .min.js 文件当中。 效果图如下:  [点击查看V3的演示示例](http://example.itshubao.com/example/165.html "点击查看V3的演示示例") ### V4跟上面的代码稍微有一些不同,这里摘抄出来了,具体内容大家看演示 [点击查看V4的演示示例](http://example.itshubao.com/example/418.html "点击查看V4的演示示例")  1、v4的版本同样需要对tab插件做一些简单的修改,找到 `bootstrap-multitabs/multitabs.js`,新增js代码(大概570行): ```javascript $('.nav-drawer').find('li').removeClass('active'); $navObj.parent('li').addClass('active'); $navHasSubnav.addClass('active'); // 下面是新增的代码,别复制错了 var $thisDrawer = $navHasSubnav.parent('.nav-drawer'), $thisDrawerId = $thisDrawer.attr('id'), $thisIdArr = $thisDrawerId.split('-'); $.each($('.nav-drawer'), function (i, v) { var $thisUl = $(v); if ($thisUl.attr('id') == $thisDrawerId) { $thisDrawer.stop(true, true).show(); } else { $thisUl.slideUp('500'); } }); $.each($('.lyear-topbar li'), function (inx, ve) { var $thisLi = $(ve); $thisLi.removeClass('active'); if ((inx+1) == $thisIdArr[1]) { $thisLi.addClass('active'); } }) // 上面是新增的代码,别复制错了 // 当前菜单无子菜单 if (!$navObj.parents('.nav-item').first().is('.nav-item-has-subnav')) { var hht = 48 * ( $navObj.parents('.nav-item').first().prevAll().length - 1 ); $('.lyear-layout-sidebar-info').animate({scrollTop: hht}, 300); } // 另外还要注意这里的一句代码(复制了上面的代码后是597行),增加了一个stop(false, true) var $sideDownObj = $navObj.parents('ul.nav-subnav').stop(false, true).filter(':hidden'); ``` > 如果你使用的是 .min.js 的压缩文件,请在修改完后自行压缩到 .min.js 文件当中。 2、这里是菜单内容,有一个地方要注意的是,第一行代码,比v4原版的多了一个 `class` 类 `align-items-center`,一定要注意别遗漏了。 ```html <div class="navbar-left d-flex align-items-center"> <div class="lyear-aside-toggler"> <span class="lyear-toggler-bar"></span> <span class="lyear-toggler-bar"></span> <span class="lyear-toggler-bar"></span> </div> <div class="dropdown"> <span class="header-icon-menu" data-toggle="dropdown"><i class="mdi mdi-apps"></i></span> <ul class="lyear-topbar dropdown-menu"> <li class="dropdown-item nav-item active"> <a class="nav-link" href="javascript:void(0)" onclick="showMenus(this, 1)">默认</a> </li> <li class="dropdown-item nav-item"> <a class="nav-link" href="javascript:void(0)" onclick="showMenus(this, 2)">菜单一</a> </li> <li class="dropdown-item nav-item"> <a class="nav-link" href="javascript:void(0)" onclick="showMenus(this, 3)">菜单二</a> </li> </ul> </div> </div> ```