JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)

前言:最近园子里多了许多谈语言、谈环境、谈逼格(格局)的文章,看看笑笑过后,殊不知其实都是然并卵。提升自己的技术才是王道。之前博主分享过多篇bootstrap组件的文章,引起了很多园友的关注和支持,看样子这种风格还是受到很多园友青睐的。本着不辜负园友们的支持的原则,应群友们的要求,今天来分享下项目中使用Ace模板的菜单样式和基于iframe的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

一、效果展示

折腾了好久,终于将菜单样式和Tab页的效果从项目中抽出来了,园友们且看且珍惜哈~~

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/Api/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模板,可以使用起来试试。

PS:关于ace模板收费的问题许多园友在评论中提到了,博主补充说明几点:

1、ace模板确实是收费的,官网上面写的很清楚:$18。这个毋庸置疑。

2、本文只使用了ace的一个菜单功能,并且引用的文件都是从网上找来的,所以对于本文的效果并不存在收费一说。

原文:http://www.cnblogs.com/landeanfen/p/5043253.html

时间: 2024-10-12 21:46:37

JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)的相关文章

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.点击子菜单,以

JS组件系列——基于Bootstrap Ace模板的菜单Tab页效果优化

前言:之前发表过一篇  JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有) ,收到很多园友的反馈,当然也包括很多诟病,因为上篇只是将功能实现了,很多细节都没有处理,这篇博主将带领大家一起来优化这里的效果,使之成为一个可以在项目里面使用的成品. 说点题外话,本来,在互联网模式下,Tab页+iframe的组合是不能被大多数平台接受的,从这些年推出的一些好的产品可以看出,几乎大家都不这么玩,即使是一些后台的管理模板,比如常见的AdminLTE.Ace.INSPIN

值得分享的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.菜单效果 由于Ace是基于Bootstrap的,所以首先需要引用jquery和bootstrap

推酷文章中编写js组件系列文章整理

一步一步实现JS拖拽插件 http://www.tuicool.com/articles/RBbmMjY JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享 http://www.tuicool.com/articles/aiiQFjb

JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

原文:JS组件系列--Bootstrap文件上传组件:bootstrap fileinput 前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它.既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧.经过一番查找,功夫不负有心人,还是被博主找到了这个组件:

JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)

前言:前面介绍了两篇关于bootstrap table的基础用法,这章我们继续来看看它比较常用的一些功能,来个终结篇吧,毛爷爷告诉我们做事要有始有终~~bootstrap table这东西要想所有功能覆盖似乎不太现实,博主挑选了一些自认为比较常用的功能在此分享给各位园友.源码也在这篇统一给出.好了,不多说废话,开始我们的干货之旅吧. bootstrap table系列: JS组件系列——表格组件神器:bootstrap table JS组件系列——表格组件神器:bootstrap table(二

JS组件系列——Bootstrap Select2组件使用小结

前言:在介绍select组件的时候,博主之前分享过一篇JS组件系列——两种bootstrap multiselect组件大比拼,这两个组件的功能确实很强大,只可惜没有图文结合的效果(也就是将图片放入到select里面随着文字一起显示).前两天做一个菜单图标选择的功能,就要用到这个图文选择的功能.于是乎又是找啊找.终于不负所望,找到了我们伟大的select2组件.今天分享下这个组件的一些用法和特性. 一.组件说明以及API说明 Select2使用示例地址:https://select2.githu

JS组件系列——Bootstrap Table 表格行拖拽

原文:JS组件系列--Bootstrap Table 表格行拖拽 前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到一个需求,说是两种不同状态的订单之间要实现插单的效果,页面上呈现方式是:左右两个Table,左边Table里面是状态为1的订单,右边Table里面是状态为2订单,左边Table里面的行数据拖动到右边Table里面指定行的位置,拖动完成

JS组件系列——分享自己封装的Bootstrap树形组件:jqTree

前言:之前的一篇介绍了下如何封装自己的组件,这篇再次来体验下自己封装组件的乐趣.看过博主博客的园友应该记得之前分享过一篇树形菜单的使用JS组件系列——Bootstrap 树控件使用经验分享,这篇里面第一个Jquery Tree,只是用简单样式和js去实现了效果,没有给出一个系统的封装,这篇博主就来试试在此样式的基础上封装一个稍微完整点的树形组件. 一.组件效果预览 其实效果和之前的那个差不多,博主只是在之前的基础上加了一个选中的背景色. 全部收起 展开 全部展开 二.代码示例 其实效果很简单,重