个人开发基于jquery的类似浏览器的tab插件

因为项目的需要,网上也没发现开源好用的tab插件,所以自己简单的封装了一个tab插件,本插件需要用到jquery。

先看看效果图

















首先明确功能需求 ,结合easyui的tab插件的功能,需要开发如下主要功能:

1.单击菜单栏,tab生成一个tab标签,同时内容栏得加载相应的内容

2.单击关闭的图标要关闭当前的etab标签同时移除tab标签对应的内容栏的内容

3.当tab标签的内容很多久可以点击tab的左右的按钮查看超出的tab标签

4.tab的右键的功能:关闭当前,关闭除当前的tab,关闭全部的tab,关闭左右的tab

5.双击关闭当前tab标签及移除对应的内容栏


js文件  

/**
 * Created by luorongsheng on 2017/2/20.
 * version :szjz.tab.js v1.0
 * author : RongShengLuo 
 * 
 */
(function(factory){
    if(typeof exports == "object" && typeof module == "object"){  // CommonJS
        factory(require('jquery'));
    }else if(typeof define == "function" && define.amd){     // AMD
        define(['jquery'],factory);
    }else{   // plain brower env
        factory(jQuery)
    }
})(function($){
    "use strict";
    window.conTab= {};
    $("#tab_index").click(function(){
    	$(this).addClass("active");
    	$(this).siblings().removeClass('active');
    	$("#cont-index").show();
    	$("#cont-index").siblings().hide();
    });
    conTab.add = function(option){
        // 如果菜单已经存在就激活菜单
        if(this.isExist(option.id)){
            this.click(option.id);
            return false;
        }
        this.addTab(option);
        this.AddContDiv(option);
        if(this.isBeyond()){
            this.scrollTab(option.id);
        }
        // 这里是否要考虑打开的方式
    };
    conTab.addTab = function(option){
        var _this = this;
        var id = option.id;
        var active = this.activeClass;
        var name = option.name;
        var title = option.title?option.title : "";
        var args = {id :id ,title : title,active :active,name :name};
        var html = this.getTabHtml(args);
        var element = $(html);
        var tab = $(".tab-list").append(element);
        this.click(option.id);
        _this.forbiBrowRightMenu(element);
        /* 绑定点击事件 */
        element.click(function(event){
            event.preventDefault();
            _this.click(option.id);
        });
        /* 绑定双击事件  */
        element.dblclick(function(){
                _this.close(option.id);
        });
        /* 绑定右键功能 */
        element.mousedown(function(event){
            var event = event || window.event;
            event.preventDefault();   // 为什么没有阻止默认行为
            if(event.button == 2){
                _this.tabMenu(event);   // 右键菜单
                _this.closeCurrentTab(id);   // 关闭当前按钮的事件绑定
                _this.closeTabAll();     // 关闭全部的按钮事件
                _this.closeNotCurrent(id);   // 关闭除当前的按钮事件
                _this.closeCurrentLeftTab(id);   // 关闭左边的tab
                _this.closeCurrentRightTab(id);
            }
        });
        element.find(".closeTab").click(function(){
            console.log('执行close方法');
            _this.close($(this).parents("li").attr("id"));
            return false;
        });

    };
    /* 要增加的tab的html */
    conTab.getTabHtml = function(args){
        var li ="<li id='"+args.id+"' title='"+args.title+"'>";
        li+="<a>"+args.name+"<i class='glyphicon glyphicon-remove-sign closeTab'style='font-style: normal;'></i></a>";
        return li;
    };
    /* 判断即将增加的tab是否存在*/
    conTab.isExist = function(id){
        return $(""+"#"+id).size() > 0;
    };
    /* 自定义的click函数,实现tab的选中状态和对应的div的显示*/
    conTab.click = function(id){
        $(".tab-list").find("li").removeClass("active");
        $("#"+id).addClass("active");
        this.loadContDiv(id);
    };
    /* 显示内容的div*/
    conTab.AddContDiv = function(option){
        var url = option.url;
        var id = this.getContDivId(option.id);
        //if(option.openType =="href"){
        	var html = "<div class='ceshi' id='"+id+"'></div>";
        //}
        var element = $(html);
        var container = $("#content-div");
        container.append(element);
        element.load(url);
        this.loadContDiv(option.id);
    };
    /* 加载对应的div的显示内容*/
    conTab.loadContDiv = function(id){
        var id = this.getContDivId(id);
        $("#"+id).siblings().hide();
        $("#"+id).show();
    };
    /* 通过tab的id得到对应的div的id*/
    conTab.getContDivId = function(id){
        return "tabDiv" + id;
    };
    /* 关闭功能*/
    conTab.close = function(id){
        var tab = $("#"+id);
        var ul = $(".tab-list");
        var liWidth = tab.width();
        var ulMarginLeft =parseInt(ul.css("margin-left"));
        var contDiv = $("#"+this.getContDivId(id));
        var isActive = tab.hasClass("active");
        if(isActive){
            if(tab.next().is("li")){
                tab.next().click();
            }else if(tab.prev().is("li")){
                tab.prev().click();
            }
        }
        tab.remove();
        contDiv.remove();    // 还有考虑的是关闭后应该打开哪一个页面
        this.indexPage();
        /* 需要滚动标签 */
        ulMarginLeft < 0 && ul.animate({
            "margin-left" : ulMarginLeft + liWidth > 0 ? 0 : ulMarginLeft + liWidth
        });
    },
        /* 右键功能 : 关闭当前,关闭左边,关闭右边,关闭全部,除了当前的全部关闭*/
        conTab.tabMenu = function(ev){
            /* 获取鼠标的当前坐标 */
            var x = ev.pageX;    // jq 的获取鼠标坐标方式
            var y = ev.pageY;
            var html = "<div class='tabMenu' style='position:absolute;width:150px;z-index:9999;left:"+(x+0)+"px;top:"+(y+0)+"px'><ul><li class='closeCurrent'>关闭当前tab</li><li class='closeAll'>关闭全部</li><li class='closeLeft'>关闭左边全部tab</li><li class='closeRight'>关闭右边全部tab</li><li class='closeOther'>关闭除当前的tab</li></ul></div>";
            var contextMenu = $(html);
            $("body").append(contextMenu);
            this.forbiBrowRightMenu(contextMenu);
            this.tabRightMenuEve();

        };
    /* 绑定右键事件 */
    conTab.tabRightMenuEve = function(){
        $(".tabMenu").on('mouseleave',function(){
            $(this).remove();
            return false;
        });
    };
    /* 禁止浏览器的默认的右键菜单  */
    conTab.forbiBrowRightMenu = function(element){
        element.on('contextmenu',function(event){
            event.preventDefault();
            return false;
        });
    };
    conTab.closeCurrentTab = function (id){
        var _this = this;
        $(".closeCurrent").on('click',function(){
            _this.close(id);
            $(".tabMenu").remove();
        });
    };
    /* 关闭全部的tab */
    conTab.closeTabAll = function (){
        var _this = this ;
        var tabs = _this.reverseArray($(".tab-list li"));
        $(".closeAll").on('click',function(){
                $.each(tabs, function(i,tab) {
                if($(tab).attr("id")!== "tab_index"){
                    _this.close($(tab).attr("id"));
                }
            });
               $(".tabMenu").remove();
        });
    };
    /* 关闭 除当前的其他全部的tab */
    conTab.closeNotCurrent = function (id){
        var _this = this;
        $(".closeOther").on('click',function(){
            var tabs = $(".tab-list li");
            $.each(tabs, function(i,tab) {
                if($(tab).attr("id")!== "tab_index" && $(tab).attr("id")!= id ){
                    _this.close($(tab).attr("id"));
                }
            });
            $(".tabMenu").remove();
        });
    };
    /* 关闭当前的左边的tab */
    conTab.closeCurrentLeftTab = function(id){
        var _this = this;
        $(".closeLeft").on('click',function(){
            var tabs = $("#"+id).prevAll();
            $.each(tabs, function(i ,tab) {
                if($(tab).attr("id")!== "tab_index"){
                    _this.close($(tab).attr("id"));
                }
            });
            $(".tabMenu").remove();
        });
    };
    /* 关闭当前的右边的tab */
    conTab.closeCurrentRightTab = function (id){
        var _this = this;
        $(".closeRight").on('click',function(){
            var tabs = $("#"+id).nextAll();
            $.each(tabs, function(i ,tab) {
                if($(tab).attr("id")!== "tab_index"){
                    _this.close($(tab).attr("id"));
                }
            });
            $(".tabMenu").remove();
        });
    };
    /* 滚动事件 */
    conTab.scrollTab = function (id){
        var ul = $(".tab-list");
        var marginLeft = parseInt(ul.css("margin-left"));
        var contanierWidth = $(".tab-nav").width();
        var liWidth = this.getAllTabWidth();
        var newLeft = contanierWidth - liWidth ;
        ul.animate({
            "margin-left":  newLeft
        });
    };
    $(".roll-left").on('click',function(){
        var ul = $(".tab-list");
        var liWidth = $(".tab-list").children().last().width();
        var ulMarginLeft =parseInt(ul.css("margin-left"));
        ulMarginLeft < 0 && ul.animate({
            "margin-left" : ulMarginLeft + liWidth > 0 ? 0 : ulMarginLeft + liWidth
        });
    });
    /* 查看左边隐藏标签 */
    $(".roll-right").on('click',function(){
        var ul = $(".tab-list");
        var contanier = $(".tab-nav").width();
        var liWidth = $(".tab-list").children().last().width();
        var lisWidth = conTab.getAllTabWidth();
        var ulMarginLeft =parseInt(ul.css("margin-left"));
        lisWidth + ulMarginLeft - contanier >liWidth ? ul.animate({
            "margin-left" : ulMarginLeft - liWidth
        }): lisWidth + ulMarginLeft < contanier ? 0 :ul.animate({
            "margin-left" : ulMarginLeft - (lisWidth + ulMarginLeft - contanier)
        });
    });
    /*  判断标签树是否已经超出内容区 */
    conTab.isBeyond = function (){
        var contanierWidth = $(".tab-nav").width();
        var liWidth = this.getAllTabWidth();
        return liWidth > contanierWidth;
    };
    /*  得到全部的tab长度 */
    conTab.getAllTabWidth = function (){
        var liWidth = 0;
        var lis = $(".tab-list li");
        $.each(lis, function(i ,li) {
            liWidth += $(li).width();
        });
        return liWidth;
    };
    /* 选中标签,如果标签不是全部在可视区则滑动标签 */
    conTab.activeScroll = function () {

    };
    /* 数组反转 */
    conTab.reverseArray = function (tabs) {
        var tabsRever =[];
        if(tabs){
            for(var i = tabs.length-1;i >= 0;i--){
                tabsRever.push(tabs[i]);
            }
        }
        return tabsRever;
    }
    /* 判断是否只剩下首页 */
    conTab.indexPage = function (){
    	if($(".ceshi").length == 0){
    		$("#cont-index").show();
    	}
    }
    
    /* 限制标签的个数  */
});

html结构

<div class="tab-header">
	<button type="button" class="fa fa-backward roll-nav roll-left "></button>
	<button type="button" class="fa fa-forward roll-nav roll-right"></button>
	<div class="tab-nav">
		<ul class="tab-list">
			<li class="active" id="tab_index"><a href="javascript:void(0);">首页</a></li>
		</ul>
	</div>
</div>


css 文件

/* tab 的样式 */
.tab-header{
	position: relative;
	border-bottom: 3px solid #3FC9D5;
	overflow: hidden;
	margin-bottom:10px;
}
.tab-nav{
	margin: 0;
	border: 0;
	position: relative;
	background-color: white;
	margin: 0 46px;
	overflow: hidden;
}
.tab-nav ul{
	background-color:#fafafa;
	display: block;
	height: 38px;
	width: 5000px;
	border-collapse: collapse;
	margin:0;
	padding:0;
}
.tab-nav ul li {
	list-style: none;
	float: left;
	cursor: pointer;
}
.tab-nav ul li a{
	padding: 9px 16px;
	display: inline-block;
	text-decoration: none;
	border-collapse:collapse;
	/*border-top-left-radius:5px!important;
	border-top-right-radius:5px!important;*/
	border-right:1px solid #ddd;
	border-bottom:1px solid transparent;
	font-size: 14px;
	color: gray;
	font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;
}
.tab-nav ul li.active a{
	background-color:#3FC9D5;    /*#14B9D6*/
	color:white;
}
.roll-nav{
	position: absolute;
	height: 37px;
	width: 46px;
	border: 0;
	outline: none;
	cursor: pointer;
	background-color: white;
}
.roll-left{
	left: 0;
	top: 0;
	border-right: 1px solid lightgray;
}
.roll-right{
	right: 0;
	border-left: 1px solid lightgray;
	top: 0;
}
.ceshi{
	padding:0 15px;
}
.tabMenu{
	background-color: white;
	border-color:1px solid #e4e8ee;
	box-shadow: 5px 5px rgba(102, 102, 102, .1)
}
.tabMenu ul{
	margin:0;
	padding:0;
}
.tabMenu ul li{
	list-style:none;
	padding: 5px 10px;
    cursor: pointer;
    font-size: 14px;
    border-bottom:1px solid #EFF2F6!important;
}
.tabMenu ul li:hover{
	background-color:#f6f6f6;
}

留下一个学习的脚步,毕竟是第一个版本,以后慢慢完善这个插件!

以后的你会感谢今天奋斗的自己




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值