jQuery插件开发-----tab选项卡

经过实践,发现我不是一个能够坚持的人,所以一有计划马上执行,为了每天保持学习,敲代码,所以不断看视频教程,看书,当年成为学渣就是因为不能重复看一本书。为了分担家里负担,好书重复翻看,好的视频教程重复看,忍忍也就过去了,我需要提升!


关于插件,之前文章讲过,this指向要分清楚,再次强调一下。若在插件内部,则指向当前插件对象;若插件中还有内部函数,例如计时器,事件则指向DOM元素。如果记不住,没关系,你可以在浏览器控制台中输出当前this,一目了然。

关于jQuery插件之tab选项卡插件初步开发,里面并没有做插件扩展,也没有做防止全局变量名冲突,当然也没有自动初始化,只是简单的练习。

首先上结构标签代码,由于没有做类名参数处理,暂时固定名字。

<div id="tab" class="js-tab" data-config='{
			"type":"mouseover",
            "effect":"fade",
            "show":1,
            "auto":1000}'>
    <ul class="tab-nav">
        <li class="active">1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <ul class="tab-wrap">
        <li class="tab-item active"></li>
        <li class="tab-item"></li>
        <li class="tab-item"></li>
    </ul>
</div>

接下来tab插件代码

// 该插件根据慕课网tab插件教程练手
+(function($){
	'use strict';//严格模式
	// tab类
	var Tab=function(tab){
		this.tab=tab;
		var _this=this; //保存当前对象Tab
		this.timer=null;
        this.loop=0;
		// 默认配置参数
		this.config={
			type:"mouseover",
            effect:"default",
            show:1,
            auto:false
		};
		this.getConfig()&&$.fn.extend(this.config,this.getConfig());
		//保存插件对象及配置参数
		this.tabNav=this.tab.find('.tab-nav li');
		this.tabItem=this.tab.find('.tab-wrap .tab-item');
		 if(this.config.type==="click"){
            this.tabNav.bind(this.config.type,function(e){
            	//bind函数中间,this指向就是DOM元素,所以就用_this
                _this.currentChange($(this));
            });
        }else{
            this.tabNav.bind("mouseover",function(e){
                _this.currentChange($(this));
            });
        }
        //自动切换
        if(this.config.auto){
            this.autoPlay(this);
            this.tab.hover(function(){
                clearInterval(_this.timer);//鼠标经过清除自动
            },function(){
                _this.autoPlay(_this);
            });
        }
	}
	// 原型
	Tab.prototype={
		// 获取配置参数
		getConfig:function(){
			var config=this.tab.attr('data-config');//获取元素配置参数
			//转义config字符串为对象
			if(config&&config!=null){return $.parseJSON(config)}
			else{
				return null;
			}
		},
		//选项卡切换,
		currentChange:function(cur){
			var index=cur.index();//获取当前li的索引值
            cur.addClass("active").siblings().removeClass("active");
            if(this.config.effect==="default"){
                this.tabItem.eq(index).addClass("active").siblings().removeClass("active");//为当前元素添加active,移除兄弟元素的active
            }else if(this.config.effect==="fade"){
                this.tabItem.eq(index).stop().fadeIn().siblings().stop().fadeOut();
            }
            if(this.config.auto){
                this.loop=index;
            }
		},
		//自动切换
        autoPlay:function(_this){
            var tabLength=this.tabItem.size();//tab循环个数
            this.timer=setInterval(function(){
                _this.loop++;
                if(_this.loop>=tabLength){
                    _this.loop=0;
                }
                _this.currentChange(_this.tabNav.eq(_this.loop));//传入li,进行自动切换
            },this.config.auto);
        }
	}

	// 扩展参数到jQuery方法上,实现链式调用,如$('xx').Tab().css()
	$.fn.extend({
		Tab:function(){
			this.each(function(){
                new Tab($(this));
            });
            return this; //jQuery链式调用
		}
	});
	// 注册全局变量
	window.Tab=Tab;
})(jQuery);

最后上完整代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值