自写Jquery插件 Tab

原创文章,转载请注明出处,谢谢!https://www.cnblogs.com/GaoAnLee/p/9067017.html 

每每看到别人写的Jquery插件,自己也试着学习尝试,终有结果,废话不多说,直接上效果:

直接撸代码:

html:

<body>
    <div id='tab' class='frame'></div>
</body>

css:

@CHARSET "UTF-8";

div, ul
{ overflow: hidden; margin: 0; padding: 0; } .main-content { padding: 20px 20px; } .tabs, .tabs ul li { float: left; } .tabs ul { list-style: none outside none; } .tabs ul li { line-height: 30px; margin-right: 2px; padding: 2px 10px 0 8px; -webkit-border-radius: 6px 6px 0 0; -moz-border-radius: 6px 6px 0 0; -ms-border-radius: 6px 6px 0 0; -o-border-radius: 6px 6px 0 0; border-radius: 6px 6px 0 0; font-size: 13px; cursor: default; } .tabs ul li em { display: inline-block; } .tabs ul li .tab-text, .tabs ul li .fa-close { cursor: pointer; } .tabs ul li i:first-child { margin-right: 5px; } .fa-close { margin-left: 10px; } .tab-nav { background-color: #EEEEEE; } .tab-nav-action { color: #3c8dbc; } .tabs-body { float: left; padding: 5px 0 0; } .tabs, .tabs-body { width: 100%; } .tab-nav-action, .tabs-body { background-color: #ffffff; } .tab-nav, .tabs-body { color: #000000; } .tabs-body div { padding: 10px; } .tabs-body-hide { display: none; } .tabs-body-show { display: block; }

jquery.tab.js:

/*
<div id='tab'>
  //data
</div>
备注: 背景色建议为 #f4f4f4 最佳
*/

//jquery插件 tab   auther:GaoAnLee
;
(function($, window, document, undefined) {
    //初始化
    function _init(tab, b) {
        var _this = tab.element;
        var options = $.data(_this, 'tab').options;
        //第一次加载 添加tabs主体框架
        if (b) {
            _this.append('<div class="main-content"></div>');
            $('.main-content').append('<div class="tabs"></div>');
            $('.main-content').append('<div id="tabs-body" class="tabs-body"></div>');
            $('.tabs').append('<ul id="tabs"></div>');
        }
        //加载最简单tab
        $(options.tab).append('<li class="' + options.tabActiveClass + '"><i class=""></i><em class="tab-text">欢迎您</em><i class=""></i></li>');
        $(options.tabBody).append('<div class="' + options.tabBodyActiveClass + '">Welcome MMS !</div>');

        //切换tab
        switchTab(options);
        //删除tab
        delTab(options);
    }
    //切换tab
    function switchTab(options) {
        $('body').on(options.eventType, '.tab-text', function() {
            var parntNode = $(this).parent();
            var index = parntNode.index();
            parntNode.attr('Class', options.tabActiveClass).siblings().attr('Class', options.tabClass);
            $(options.tabBody).children().hide().eq(index).show();
        });
    }
    //删除tab
    function delTab(options) {
        $('body').on(options.eventType, '.fa-close', function() {
            var index = $(this).parent().index();
            var thisParentClass = $(this).parent().attr('Class');
            if (thisParentClass != options.tabClass) {
                var _prev = $(this).parent().prev();
                var prevIndex = _prev.index();
                _prev.attr('Class', options.tabActiveClass);
                $(options.tabBody).children().eq(prevIndex).show();
            }
            $(this).parent().remove();
            $(options.tabBody).children().eq(index).remove();
        });
    }

    /****************************_init() end****************************/

    //追加tab
    function addTab(options) {
        $(options.tab).children().attr('Class', options.tabClass);
        $(options.tabBody).children().hide();
        if (options.hasClose) {
            $(options.tab).append('<li class="' + options.tabActiveClass + '"><i class="fa ' + options.icon + '"></i><em class="tab-text">' + options.title + '</em><i class="fa fa-close"></i></li>');
        } else {
            $(options.tab).append('<li class="' + options.tabActiveClass + '"><i class="fa ' + options.icon + '"></i><em class="tab-text">' + options.title + '</em></li>');
        }
        $(options.tabBody).append('<div class="' + options.tabBodyActionClass + '">' + options.tabContent + '</div>');
    }
    //选中tab
    function selectTab(options) {
        var title = options.title;
        if (hasTab(title)) {
            if (!hasSelected(title)) {
                var index = 0;
                $(options.tab).children().each(function() {
                    var t = $(this).children('em').html();
                    if (t == title) {
                        index = $(this).index();
                    }
                });
                $(options.tab).children().eq(index).attr('Class', options.tabActiveClass).siblings().attr('Class', options.tabClass);
                $(options.tabBody).children().hide().eq(index).show();
            }
        } else {
            addTab(options);
        }
    }
    //是否选中tab
    function hasSelected(parm) {
        var title = parm;
        var selectedTabText = $('.tab-nav-action').children('em').html().trim();
        if (selectedTabText == title) {
            return true;
        } else {
            return false;
        }
    }
    //是否存在tab
    function hasTab(parm) {
        var title = parm;
        var flag = false;
        $('#tabs').children().each(function() {
            var t = $(this).children('em').html();
            if (t == title) {
                flag = true;
            }
        });
        return flag;
    }

    /*************************API function end*************************/

    var Tab = function(ele, options) {
        this.element = ele,
            this.defaults = {
                tabActiveClass: 'tab-nav-action',
                tabClass: 'tab-nav',
                tabBodyActionClass: 'tabs-body-show',
                tabBodyClass: 'tabs-body-hide',
                tab: '#tabs',
                tabBody: '#tabs-body',
                eventType: 'click'
            },
            this.options = $.extend({}, this.defaults, options)
    };
    Tab.prototype = {
        //选中tab
        selectTab: function(options) {
            selectTab(options);
            return false;
        },
        //是否选中指定tab
        hasSelected: function(parm) {
            return hasSelected(parm);
        },
        //是否存在tab
        hasTab: function(parm) {
            return hasTab(parm);
        },
        //在最后追加tab
        addTab: function(options) {
            addTab(options);
            return false;
        }
    };
    $.fn.tab = function(target, parm) {
        var tab = new Tab(this, target);
        if (typeof target == 'string' && typeof parm == 'string') {
            return tab[target](parm);
        }
        if (typeof target == 'string' && typeof parm == 'object') {
            var options = $.extend({}, tab.defaults, parm);
            return tab[target](options);
        }
        var state = $.data(this, 'tab');
        if (state) {
            var dataOptions = state.options;
            var newOptions = $.extend({}, dataOptions, target);
            $.data(this, 'tab', {
                options: newOptions,
                e: this
            });
        } else {
            $.data(this, 'tab', {
                options: $.extend({}, tab.options, target),
                e: this
            });
        }
        return this.each(function(){
      _init(tab,true);
     });
}; })(jQuery, window, document); $(function() { $('#tab').tab(); //先加载启动 //测试 $('#tab').tab('addTab', { icon: 'fa-sitemap', title: '公司管理', hasClose: true, tabContent: '111111111111111' }); $('#tab').tab('addTab', { icon: 'fa-th-list', title: '部门管理', hasClose: true, tabContent: '2222' }); var flag = $('#tab').tab('hasSelected', '公司管理'); console.log(flag); //false flag = $('#tab').tab('hasTab', '公司管理'); console.log(flag); //true $('#tab').tab('selectTab', { icon: 'fa-sitemap', title: '公司管理', hasClose: true, tabContent: '111111111111111' }); });
原文地址:https://www.cnblogs.com/GaoAnLee/p/9067017.html