值得分享的Bootstrap Ace模板實(shí)現(xiàn)菜單和Tab頁(yè)效果
本文分享了項(xiàng)目中使用Ace模板的菜單樣式和基于iframe的Tab頁(yè)效果。
一、效果展示
折騰了好久,終于將菜單樣式和Tab頁(yè)的效果從項(xiàng)目中抽出來(lái)了。
1、初始加載出來(lái)的效果
2、展開(kāi)菜單(支持多級(jí)展開(kāi),后面代碼介紹)
3、點(diǎn)擊子菜單,以Tab頁(yè)的形式打開(kāi)對(duì)應(yīng)的頁(yè)面
4、支持菜單折疊
5、打開(kāi)的菜單過(guò)多時(shí)自動(dòng)換行顯示,折疊后自適應(yīng)
二、代碼示例
有現(xiàn)成的東西用很方便的,總的來(lái)說(shuō)Bootstrap Ace模板的功能還是比較強(qiáng)大的,并且支持各種終端設(shè)備。本文主要使用的它的菜單的效果,下面就來(lái)看看Ace模板菜單效果的實(shí)現(xiàn)代碼。
1、菜單效果
由于Ace是基于Bootstrap的,所以首先需要引用jquery和bootstrap組件,先來(lái)總的看看它需要引用哪些文件吧?! ?/p>
<script src="/Scripts/jquery-1.9.1.min.js"></script> <script src="/Content/bootstrap/js/bootstrap.min.js"></script> <link href="/Content/bootstrap/css/bootstrap.min.css" rel="stylesheet" /> <link href="/Content/font-awesome/css/font-awesome.min.css" rel="stylesheet" /> <link href="/Content/ace/css/ace-rtl.min.css" rel="stylesheet" /> <link href="/Content/ace/css/ace-skins.min.css" rel="stylesheet" /> <link href="/Content/sidebar-menu/sidebar-menu.css" rel="stylesheet"/> <script src="/Content/ace/js/ace-extra.min.js"></script> <script src="/Content/ace/js/ace.min.js"></script> <script src="/Content/sidebar-menu/sidebar-menu.js"></script>
呵呵,看著還是挺多的吧。除了最后一個(gè)js文件(<script src="/Content/sidebar-menu/sidebar-menu.js"></script>)是博主自己封裝的,其他基本都是些組件需要的特性組件??纯错?yè)面上面要放哪些html標(biāo)簽:
<div class="sidebar" id="sidebar"> <ul class="nav nav-list" id="menu"></ul> <div class="sidebar-collapse" id="sidebar-collapse"> <i class="icon-double-angle-left" data-icon1="icon-double-angle-left" data-icon2="icon-double-angle-right"></i> </div> </div>
再來(lái)看看sidebar-menu.js這個(gè)文件里面封裝的方法:
(function ($) { $.fn.sidebarMenu = function (options) { options = $.extend({}, $.fn.sidebarMenu.defaults, options || {}); var target = $(this); target.addClass('nav'); target.addClass('nav-list'); if (options.data) { init(target, options.data); } else { if (!options.url) return; $.getJSON(options.url, options.param, function (data) { init(target, data); }); } var url = window.location.pathname; //menu = target.find("[href='" + url + "']"); //menu.parent().addClass('active'); //menu.parent().parentsUntil('.nav-list', 'li').addClass('active').addClass('open'); function init(target, data) { $.each(data, function (i, item) { var li = $('<li></li>'); var a = $('<a></a>'); var icon = $('<i></i>'); //icon.addClass('glyphicon'); icon.addClass(item.icon); var text = $('<span></span>'); text.addClass('menu-text').text(item.text); a.append(icon); a.append(text); if (item.menus&&item.menus.length>0) { a.attr('href', '#'); a.addClass('dropdown-toggle'); var arrow = $('<b></b>'); arrow.addClass('arrow').addClass('icon-angle-down'); a.append(arrow); li.append(a); var menus = $('<ul></ul>'); menus.addClass('submenu'); init(menus, item.menus); li.append(menus); } else { var href = 'javascript:addTabs({id:\'' + item.id + '\',title: \'' + item.text + '\',close: true,url: \'' + item.url + '\'});'; a.attr('href', href); //if (item.istab) // a.attr('href', href); //else { // a.attr('href', item.url); // a.attr('title', item.text); // a.attr('target', '_blank') //} li.append(a); } target.append(li); }); } } $.fn.sidebarMenu.defaults = { url: null, param: null, data: null }; })(jQuery);
在頁(yè)面上面直接調(diào)用sidebar-menu的方法
$(function () { $('#menu').sidebarMenu({ data: [{ id: '1', text: '系統(tǒng)設(shè)置', icon: 'icon-cog', url: '', menus: [{ id: '11', text: '編碼管理', icon: 'icon-glass', url: '/CodeType/Index' }] }, { id: '2', text: '基礎(chǔ)數(shù)據(jù)', icon: 'icon-leaf', url: '', menus: [{ id: '21', text: '基礎(chǔ)特征', icon: 'icon-glass', url: '/BasicData/BasicFeature/Index' }, { id: '22', text: '特征管理', icon: 'icon-glass', url: '/BasicData/Features/Index' }, { id: '23', text: '物料維護(hù)', icon: 'icon-glass', url: '/Model/Index' }, { id: '24', text: '站點(diǎn)管理', icon: 'icon-glass', url: '/Station/Index' }] }, { id: '3', text: '權(quán)限管理', icon: 'icon-user', url: '', menus: [{ id: '31', text: '用戶管理', icon: 'icon-user', url: '/SystemSetting/User' }, { id: '32', text: '角色管理', icon: 'icon-apple', url: '/SystemSetting/Role' }, { id: '33', text: '菜單管理', icon: 'icon-list', url: '/SystemSetting/Menu' }, { id: '34', text: '部門(mén)管理', icon: 'icon-glass', url: '/SystemSetting/Department' }] }, { id: '4', text: '訂單管理', icon: 'icon-envelope', url: '', menus: [{ id: '41', text: '訂單查詢', icon: 'icon-glass', url: '/Order/Query' }, { id: '42', text: '訂單排產(chǎn)', icon: 'icon-glass', url: '/Order/PLANTPRODUCT' }, { id: '43', text: '訂單撤排', icon: 'icon-glass', url: '/Order/cancelPRODUCT' }, { id: '44', text: '訂單HOLD', icon: 'icon-glass', url: '/Order/hold' }, { id: '45', text: '訂單刪除', icon: 'icon-glass', url: '/Order/delete' }, { id: '47', text: '訂單插單', icon: 'icon-glass', url: '/Order/insertorder' }, { id: '48', text: '訂單導(dǎo)入', icon: 'icon-glass', url: '/Order/Import' }] }] }); });
這里需要說(shuō)明的很重要的一點(diǎn)就是關(guān)于菜單前面的小圖標(biāo):
con的值為icon-user的時(shí)候,菜單上面就會(huì)顯示一個(gè)如圖的小圖標(biāo)。當(dāng)然一般情況下,菜單肯定是動(dòng)態(tài)加載的的,如果需要從后臺(tái)取數(shù)據(jù),可以直接調(diào)用此方法:
$('#menu').sidebarMenu({ url: "/api/UserApi/GetMenuByUser/", param: { strUser: 'admin' } });
即可,呵呵,很簡(jiǎn)單吧。
2、Tab頁(yè)效果
Tab頁(yè)的效果其實(shí)是和左邊菜單息息相關(guān)的,首先還是看看Tab頁(yè)效果的js引用。
<script src="/Scripts/bootstrap-tab.js"></script>
頁(yè)面的html標(biāo)簽:
<div class="main-content"><div class="page-content"> <div class="row"> <div class="col-xs-12" style="padding-left:5px;"> <ul class="nav nav-tabs" role="tablist"> <li class="active"><a href="#Index" role="tab" data-toggle="tab">首頁(yè)</a></li> </ul> <div class="tab-content"> <div role="tabpanel" class="tab-pane active" id="Index"> </div> </div> </div> </div> </div> </div>
bootstrap-tab.js這個(gè)文件里面封裝了addTabs方法
var addTabs = function (options) { //var rand = Math.random().toString(); //var id = rand.substring(rand.indexOf('.') + 1); var url = window.location.protocol + '//' + window.location.host; options.url = url + options.url; id = "tab_" + options.id; $(".active").removeClass("active"); //如果TAB不存在,創(chuàng)建一個(gè)新的TAB if (!$("#" + id)[0]) { //固定TAB中IFRAME高度 mainHeight = $(document.body).height() - 90; //創(chuàng)建新TAB的title title = '<li role="presentation" id="tab_' + id + '"><a href="#' + id + '" aria-controls="' + id + '" role="tab" data-toggle="tab">' + options.title; //是否允許關(guān)閉 if (options.close) { title += ' <i class="glyphicon glyphicon-remove" tabclose="' + id + '"></i>'; } title += '</a></li>'; //是否指定TAB內(nèi)容 if (options.content) { content = '<div role="tabpanel" class="tab-pane" id="' + id + '">' + options.content + '</div>'; } else {//沒(méi)有內(nèi)容,使用IFRAME打開(kāi)鏈接 content = '<div role="tabpanel" class="tab-pane" id="' + id + '"><iframe src="' + options.url + '" width="100%" height="' + mainHeight + '" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="yes" allowtransparency="yes"></iframe></div>'; } //加入TABS $(".nav-tabs").append(title); $(".tab-content").append(content); } //激活TAB $("#tab_" + id).addClass('active'); $("#" + id).addClass("active"); }; var closeTab = function (id) { //如果關(guān)閉的是當(dāng)前激活的TAB,激活他的前一個(gè)TAB if ($("li.active").attr('id') == "tab_" + id) { $("#tab_" + id).prev().addClass('active'); $("#" + id).prev().addClass('active'); } //關(guān)閉TAB $("#tab_" + id).remove(); $("#" + id).remove(); }; $(function () { mainHeight = $(document.body).height() - 45; $('.main-left,.main-right').height(mainHeight); $("[addtabs]").click(function () { addTabs({ id: $(this).attr("id"), title: $(this).attr('title'), close: true }); }); $(".nav-tabs").on("click", "[tabclose]", function (e) { id = $(this).attr("tabclose"); closeTab(id); }); });
那么,在什么時(shí)候調(diào)用Addtabs方法呢?答案是注冊(cè)菜單click事件的時(shí)候,這部分代碼在前面sidebar-menu組件封裝的時(shí)候就有,可以看看上面。
如果大家還想深入學(xué)習(xí),可以點(diǎn)擊這里進(jìn)行學(xué)習(xí),再為大家附兩個(gè)精彩的專題:Bootstrap學(xué)習(xí)教程 Bootstrap實(shí)戰(zhàn)教程
以上就是bootstrap ace模板的菜單和Tab頁(yè)效果的展示,總的來(lái)說(shuō),基本的功能具備了,但菜單的樣式還有待調(diào)整,比如點(diǎn)擊某個(gè)菜單之后,點(diǎn)擊的菜單需要給一個(gè)選中的狀態(tài)。如果你的項(xiàng)目也是用的bootstrap風(fēng)格,研究下ace模板,可以使用起來(lái)試試。
- Bootstrap和Java分頁(yè)實(shí)例第二篇
- Bootstrap和Java分頁(yè)實(shí)例第一篇
- BootStrap與validator 使用筆記(JAVA SpringMVC實(shí)現(xiàn))
- 使用java基于pushlet和bootstrap實(shí)現(xiàn)的簡(jiǎn)單聊天室
- 值得分享的最全面Bootstrap快速人門(mén)案例
- 值得分享的Bootstrap Table使用教程
- 值得分享的bootstrap table實(shí)例
- 值得分享的輕量級(jí)Bootstrap Table表格插件
- 值得分享和收藏的Bootstrap學(xué)習(xí)教程
- 基于Bootstrap的Java開(kāi)發(fā)問(wèn)題匯總(Spring MVC)
相關(guān)文章
js實(shí)現(xiàn)小球在頁(yè)面規(guī)定的區(qū)域運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了js控制小球在規(guī)定范圍運(yùn)動(dòng),碰到邊界就改變運(yùn)動(dòng)方向,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06Javascript操縱Cookie實(shí)現(xiàn)購(gòu)物車程序
Javascript操縱Cookie實(shí)現(xiàn)購(gòu)物車程序...2006-11-11JavaScript如何借用構(gòu)造函數(shù)繼承
這篇文章主要介紹了JavaScript如何借用構(gòu)造函數(shù)繼承,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11支付寶小程序自定義彈窗dialog插件的實(shí)現(xiàn)代碼
支付寶小程序官方提供的alert提示框、dialog對(duì)話框、model彈窗功能比較有限,有些都不能隨意自定義修改的。這篇文章主要介紹了支付寶小程序自定義彈窗dialog插件的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-11-11js函數(shù)setTimeout延遲執(zhí)行的簡(jiǎn)單介紹
設(shè)置指定的JS函數(shù)在指定的時(shí)間后執(zhí)行,可以利用setTimeout()函數(shù)。2013-07-07