JS組件系列——基於Bootstrap Ace模板的菜單和Tab頁效果


Ace模板地址:http://code.google.com/p/ace-engine/wiki/AceTemplate(有時會打不開)

Ace英文官網:http://wrapbootstrap.com/preview/WB0B30DGR

Ace模板功能介紹地址:http://www.cnblogs.com/txw1958/p/Ace-Responsive-Admin-Template.html

 

一、效果展示

1、初始加載出來的效果

2、展開菜單(支持多級展開,后面代碼介紹)

3、點擊子菜單,以Tab頁的形式打開對應的頁面

4、支持菜單折疊

5、打開的菜單過多時自動換行顯示,折疊后自適應

二、代碼示例

有現成的東西用起來就是爽,總的來說Bootstrap Ace模板的功能還是比較強大的,並且支持各種終端設備。本文主要使用的它的菜單的效果,下面就來看看Ace模板菜單效果的實現代碼。

1、菜單效果

由於Ace是基於Bootstrap的,所以首先需要引用jquery和bootstrap組件,先來總的看看它需要引用哪些文件吧 

<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>

 

呵呵,看着還是挺多的吧。除了最后一個js文件(<script src="/Content/sidebar-menu/sidebar-menu.js"></script>)是博主自己封裝的,其他基本都是些組件需要的特性組件。看看頁面上面要放哪些html標簽: 

<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>

再來看看sidebar-menu.js這個文件里面封裝的方法:

(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);
 sidebar-menu組件封裝

在頁面上面直接調用sidebar-menu的方法

$(function () {
            $('#menu').sidebarMenu({
                data: [{
                    id: '1',
                    text: '系統設置',
                    icon: 'icon-cog',
                    url: '',
                    menus: [{
                        id: '11',
                        text: '編碼管理',
                        icon: 'icon-glass',
                        url: '/CodeType/Index'
                    }]
                }, {
                    id: '2',
                    text: '基礎數據',
                    icon: 'icon-leaf',
                    url: '',
                    menus: [{
                        id: '21',
                        text: '基礎特征',
                        icon: 'icon-glass',
                        url: '/BasicData/BasicFeature/Index'
                    }, {
                        id: '22',
                        text: '特征管理',
                        icon: 'icon-glass',
                        url: '/BasicData/Features/Index'
                    }, {
                        id: '23',
                        text: '物料維護',
                        icon: 'icon-glass',
                        url: '/Model/Index'
                    }, {
                        id: '24',
                        text: '站點管理',
                        icon: 'icon-glass',
                        url: '/Station/Index'
                    }]
                }, {
                    id: '3',
                    text: '權限管理',
                    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: '部門管理',
                        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: '訂單排產',
                        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: '訂單導入',
                        icon: 'icon-glass',
                        url: '/Order/Import'
                    }]
                }]
            });
        });

這里需要說明的很重要的一點就是關於菜單前面的小圖標,icon屬性對應的是 http://v3.bootcss.com/components/ 頁面里面的圖標的樣式: 

con的值為icon-user的時候,菜單上面就會顯示一個如圖的小圖標。當然一般情況下,菜單肯定是動態加載的的,如果需要從后台取數據,可以直接調用此方法:

$('#menu').sidebarMenu({ url: "/api/UserApi/GetMenuByUser/", param: { strUser: 'admin' } });

即可,呵呵,很簡單吧。

2、Tab頁效果

Tab頁的效果其實是和左邊菜單息息相關的,首先還是看看Tab頁效果的js引用。

<script src="/Scripts/bootstrap-tab.js"></script>

頁面的html標簽:

<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">首頁</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這個文件里面封裝了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不存在,創建一個新的TAB
    if (!$("#" + id)[0]) {
        //固定TAB中IFRAME高度
        mainHeight = $(document.body).height() - 90;
        //創建新TAB的title
        title = '<li role="presentation" id="tab_' + id + '"><a href="#' + id + '" aria-controls="' + id + '" role="tab" data-toggle="tab">' + options.title;
        //是否允許關閉
        if (options.close) {
            title += ' <i class="glyphicon glyphicon-remove" tabclose="' + id + '"></i>';
        }
        title += '</a></li>';
        //是否指定TAB內容
        if (options.content) {
            content = '<div role="tabpanel" class="tab-pane" id="' + id + '">' + options.content + '</div>';
        } else {//沒有內容,使用IFRAME打開鏈接
            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) {
    //如果關閉的是當前激活的TAB,激活他的前一個TAB
    if ($("li.active").attr('id') == "tab_" + id) {
        $("#tab_" + id).prev().addClass('active');
        $("#" + id).prev().addClass('active');
    }
    //關閉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);
    });
});
AddTabs方法

那么,在什么時候調用Addtabs方法呢?答案是注冊菜單click事件的時候,這部分代碼在前面sidebar-menu組件封裝的時候就有,可以看看上面。

三、總結

以上就是bootstrap ace模板的菜單和Tab頁效果的展示,總的來說,基本的功能具備了,但菜單的樣式還有待調整,比如點擊某個菜單之后,點擊的菜單需要給一個選中的狀態。如果你的項目也是用的bootstrap風格,研究下ace模板,可以使用起來試試。本內容結合了博友.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM