本文详细介绍了一款基于jQuery的Tab选项卡插件的开发与使用。该插件支持通过参数配置触发类型(如click或mouseover)、切换动画效果(如淡入淡出或直接切换)、默认激活项及自动轮播间隔。文章提供了完整的HTML结构、CSS样式及JavaScript核心代码,并演示了三种初始化方式,旨在帮助开发者快速掌握轻量级交互组件的实现方法。
插件概述与功能特性
闲暇之余,笔者深入探究了JavaScript插件的编写逻辑,并将此次实践成果整理成文,供读者参考。
本文将系统阐述该插件的核心功能、配置方法以及完整的源代码实现。
首先,让我们直观地看一下插件运行后的最终视觉效果。

作为一款基础型的Tab选项卡组件,它具备以下主要功能特性:
1、支持自定义鼠标事件触发切换行为; 2、支持配置不同的切换动画,例如淡入淡出或无动画直接切换; 3、支持设置默认激活显示的选项卡索引; 4、支持开启自动轮播切换功能。
本示例代码较为简洁,理解它需要掌握以下基础知识: 1、HTML与CSS的基础语法; 2、对JavaScript中this指针、prototype原型链及new构造函数的理解。
简而言之,该插件通过参数配置的方式,灵活实现多样化的交互效果。
初始化方法与配置参数
接下来,我们具体看看该插件的实际调用方法。
1、基础调用:$(".js-tab").etab(); 2、配置调用:$(".js-tab").etab({ triggerType: "click", effect: "fade", invoke: 2, auto: 3000 }); 3、静态方法调用:Tab.init($(".js-tab"));
该插件提供了多种初始化方式,代码结构简洁,使用体验类似于Bootstrap插件。以下是完整的源码展示:
HTML结构文件 index.html
HTML结构与CSS样式实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Tab选项卡</title>
<link href="tab.css" rel="stylesheet">
<style>
* {
margin:0;
padding:0;
}
body {
background-color: #323232;
font-size:12px;
font-family:微软雅黑;
padding:100px;
}
ul, li {
list-style-type: none;
}
</style>
<script src="../lib/jquery-1.11.3.js"></script>
<script type="text/javascript" src="tab.js"></script>
</head>
<body>
<div class="js-tab tab">
<ul class="tab-nav">
<li class="active"><a href="#">新闻</a> </li>
<li><a href="#">电影</a> </li>
<li><a href="#">娱乐</a> </li>
<li><a href="#">科技</a> </li>
</ul>
<div class="content-wrap">
<div class="content-item current">
<h3>新闻</h3>
</div>
<div class="content-item">
<h3>电影</h3>
</div>
<div class="content-item">
<h3>娱乐</h3>
</div>
<div class="content-item">
<h3>科技</h3>
</div>
</div>
</div>
<script>
$(function() {
// Tab.init($(".js-tab"));
$(".js-tab").etab({
triggerType: "click",
effect: "fade",
invoke: 2,
auto: 3000
});
$(".js-tab").etab();
});
</script>
</body>
</html>
.tab {
width: 300px;
}
.tab .tab-nav {
height: 30px;
}
.tab .tab-nav li {
float: left;
margin-right:5px;
background-color:#767676;
border-radius:3px 3px 0 0;
}
.tab .tab-nav li a{
display:block;
height:30px;
padding:0 20px;
color: white;
line-height:30px;
text-decoration: none;
}
.tab .tab-nav .active {
background-color: #fff;
}
.tab .tab-nav .active a{
color: #777;
}
.tab .content-wrap{
background-color: white;
padding:5px;
height:200px
}
.tab .content-wrap .content-item {
position:absolute;
height: 200px;
display: none;
}
.tab .content-wrap .current {
height: 200px;
display: block;
}
最后附上插件的核心JavaScript代码,源码中已包含详尽的注释说明:
JavaScript核心代码解析
/**
* Created by Wu.lin on 2017/11/12.
*/
(function($){
var Tab = function(tab, _params) {
var _this = this;
//保存单个Tab组件
this.tab = tab;
this.params = _params;
//默认配置参数
this.config = {
//用来定义鼠标的出发类型 "click"/mouseover
"triggerType": "mouseover",
//用来定义内容切换效果,直接切换/淡入淡出
"effect": "default",
//默认展示第几个Tab
"invoke": "1",
//用来定义Tab是否自动切换,当指定了事件间隔,就表示自动切换,并指定了切换间隔
"auto": false
};
//如果配置参数存在,就扩展默认的配置参数
if(this.params){
$.extend(this.config, this.params);
}
//保存Tab标签列表,以及对应的内容列表
this.tabItem = this.tab.find("ul.tab-nav li");
this.contentItem = this.tab.find("div.content-wrap .content-item");
//保存配置参数
var config = this.config;
if(config.triggerType === "click") {
this.tabItem.bind(config.triggerType, function() {
_this.invoke($(this));
});
} else {
this.tabItem.mouseover(function(){
_this.invoke($(this));
});
}
//自动切换功能
if(config.auto) {
this.timmer = null;
//计数器
this.loop = 0;
this.autoPlay();
this.tab.hover(function() {
window.clearInterval(_this.timmer);
}, function() {
_this.autoPlay();
});
}
//设置默认显示第几个Tab
if(config.invoke > 1) {
this.invoke(this.tabItem.eq(config.invoke - 1));
}
};
Tab.prototype = {
//事件驱动函数
invoke: function(currentTab) {
/**
* 1、执行Tab选中状态,当前选中Tab加上Active,
* 2、切换对应Tab内容,根据配置参数effect参数default|fade
*/
var index = currentTab.index();
var conItem = this.contentItem;
//Tab切换
currentTab.addClass("active").siblings().removeClass("active");
//内容区域切换
var effect = this.config.effect;
if(effect === "fade") {
conItem.eq(index).fadeIn().siblings().fadeOut();
} else {
conItem.eq(index).addClass("current").siblings().removeClass("current");
}
//注意,如果配置了自动切换,记得把当前的loop值设置为当前的Tab的index
if(this.config.auto) {
this.loop = index;
}
},
//自动间隔切换
autoPlay: function() {
var _this_ = this,
tabItems = this.tabItem, //临时保存Tab列表
tabLength = tabItems.size(),
config = this.config;
this.timmer = window.setInterval(function() {
_this_.loop++;
if(_this_.loop >= tabLength) {
_this_.loop = 0;
}
tabItems.eq(_this_.loop).trigger(config.triggerType);
}, config.auto);
}
};
Tab.init = function(tabs) {
var _this_ = this;
tabs.each(function() {
new _this_($(this));
});
// var tab = new Tab($(".js-tab").eq(0));
};
//注册成JQuery方法
$.fn.extend({
etab: function(_param) {
this.each(function () {
new Tab($(this), _param);
});
return this;
}
});
window.Tab = Tab;
})(jQuery);
通过以上分析可以看出,实现一个功能完善的Tab组件并非难事,建议读者动手实践以加深理解。
本文的全部内容到此结束,希望能为各位的学习提供有益帮助,同时也欢迎大家继续支持本站。