基于JavaScript实现通用型Tab选项卡
本文介绍了一种通用性较强的JavaScript Tab选项卡实现方案。通过封装事件工具对象兼容多浏览器,利用querySelectorAll定位元素,结合遍历与样式切换逻辑,实现点击或悬停切换内容。代码包含详细注释,适用于需要节省页面空间或分类展示信息的场景。
基于JavaScript实现通用型Tab选项卡
Tab选项卡在众多网站中应用广泛,尽管表现形式各异,但核心目的均是为了分类展示或节省网页空间,是一种高效的设计工具。以下提供一个通用性较强的Tab选项卡代码实例,供参考学习。
具体代码实现如下:
代码实现
<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="https://www.jb51.net/" />
<title>js实现的可以通用的选项卡代码实例</title>
<style type="text/css">
body {text-align:center;}
.tab1, .tab2
{
width:350px;
margin:0 5px;
background:#CC9933;
opacity:0.5;
border-radius:5px 5px 5px 5px;
box-shadow:#CCC 4px 4px 4px;
text-align:left;
float:left;
display:inline;
}
.name
{
list-style:none;
overflow:hidden;
}
.name li
{
width:90px;
font:bold 16px/30px Verdana, Geneva, sans-serif;
background:#669900;
text-align:center;
border-radius:5px 5px 5px;
margin-right:5px;
float:left;
display:inline;
cursor:pointer;
}
li.selected{background:#FF9900;}
.content li
{
height:500px;
display:none;
}
</style>
<script type="text/javascript">
/**
* 事件处理通用函数
*/
var EventUtil={
getEvent:function(event)
{
return event ? event : window.event;
},
getTarget:function(event)
{
return event.target||event.srcElement;
},
addHandler:function(element,type,handler)
{
if(element.addEventListener)
{
element.addEventListener(type,handler,false);
}
else if(element.attachEvent)
{
element.attachEvent("on"+type,handler);
}
else
{
element["on"+type] = handler;
}
}
};
/**
* 选项卡通用函数
*/
// 传入参数inClassName设定为绑定的选项卡类名,参数triggerType设定为触发切换的类型
function tabSwitch(inClassName,triggerType){
//取得全部选项卡区域
if(document.querySelectorAll)
{
var tabs=document.querySelectorAll("."+inClassName);
}
else
{
var divs=document.getElementsByTagName("div");
var tabs = new Array();
for(var k=0,lenDiv=divs.length;k<lenDiv;k++)
{
if(divs[k].className.indexOf(inClassName)>-1)
{
tabs.push(divs[k]);
}
}
}
//为每个选项卡建立切换功能
for(var j=0,len=tabs.length; j<len; j++)
{
//获取标题和内容列表
var tab = tabs[j];
//使用私有作用域为每个选项卡建立切换
(function(){
var nameUl = tab.getElementsByTagName("ul")[0];
var content = tab.getElementsByTagName("ul")[1];
//初始化选项卡
nameUl.getElementsByTagName("li")[0].className = "selected";
content.getElementsByTagName("li")[0].style.display = "block";
//添加事件委托
EventUtil.addHandler(nameUl,triggerType,function(event)
{
//获取事件对象
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//选项卡切换
if(target.nodeName.toLowerCase() == "li")
{
//分别取得标题列表项和内容列表项
var nameList = nameUl.getElementsByTagName("li");
var contentList = content.getElementsByTagName("li");
//标题添加selected类,并显示内容
for(var i=0,len=nameList.length; i<len; i++)
{
nameList[i].className = "";
contentList.style.display = "none";
if(nameList == target)
{
nameList.className = "selected";
contentList.style.display = "block";
}
}
}
});
})();
}
}
window.onload=function()
{
//设置选项卡切换方式
tabSwitch("tab1","click");
tabSwitch("tab2","mouseover");
}
</script>
</head>
<body>
<div class="tab1">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
</ul>
</div>
<div class="tab1">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
</ul>
</div>
<div class="tab2">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab2"</em>项目一内容,通过<em>"mouseover"</em>触发</li>
<li>类为<em>"tab2"</em>项目二内容,通过<em>"mouseover"</em>触发</li>
<li>类为<em>"tab2"</em>"项目三内容,通过<em>"mouseover"</em>触发</li>
</ul>
</div>
</body>
</html>
上述代码完成了Tab选项卡的基本功能,接下来简要解析其实现逻辑。
实现原理
一、实现原理
尽管代码量较大,但核心原理较为直观。默认状态下,Tab标题可见,且首个标题被赋予特定样式类;内容区域仅首个显示,其余隐藏,从而达成默认选中第一项的效果。每个Tab标题均绑定了特定的事件处理函数,当用户执行点击或悬停操作时,通过遍历逻辑实现内容切换。具体细节可参考代码注释及自行思考。
代码注释详解
二、代码注释详解
1. var EventUtil={},声明一个对象直接量,内部封装了获取事件对象、获取事件源以及绑定事件处理函数的方法,并实现了多浏览器兼容。 2. getEvent:function(event){return event ? event : window.event;},用于获取标准事件对象,兼容不同浏览器环境。 3. getTarget:function(event){return event.target||event.srcElement;},用于获取触发事件的目标元素,兼容主流浏览器。 4. addHandler:function(element,type,handler){},用于注册事件处理函数,确保跨浏览器兼容性。 5. function tabSwitch(inClassName,triggerType){},该函数为指定对象注册事件处理,接收两个参数:inClassName为样式类名,用于筛选目标对象;triggerType为触发事件的类型。 6. if(document.querySelectorAll),检测浏览器是否支持querySelectorAll方法。 7. var tabs=document.querySelectorAll("."+inClassName),若支持该方法,则获取具有指定类名的元素集合。 8. var divs=document.getElementsByTagName("div"),获取页面中所有div元素的集合。 9. var tabs=new Array(),初始化数组,用于存储具有指定样式类的div对象。 10. for(var k=0,lenDiv=divs.length;k<lenDiv;k++),遍历获取的div元素集合。 11. if(divs[k].className.indexOf(inClassName)>-1),判断div的class属性是否包含指定的样式类名。 12. tabs.push(divs[k]),将符合条件的div对象存入数组。 13. for(var j=0,len=tabs.length;j<len;j++),遍历存储div的数组,本例中对应class属性为tab1和tab2的div元素。 14. var tab=tabs[j],将数组中的div对象引用赋值给变量tab。 15. (function(){})(),声明并立即执行一个匿名函数(IIFE)。 16. var nameUl=tab.getElementsByTagName("ul")[0],获取第一个ul元素,即Tab标题区域。 17. var content=tab.getElementsByTagName("ul")[1],获取第二个ul元素,即Tab内容区域。 18. nameUl.getElementsByTagName("li")[0].className="selected",将标题区域第一个li元素的class设置为selected。 19. content.getElementsByTagName("li")[0].style.display="block",将内容区域第一个li元素设置为显示状态。 20. EventUtil.addHandler(nameUl,triggerType,function(event){}),这是Tab切换的核心逻辑,包含三个参数:标题区域的ul对象、事件类型以及注册的事件处理函数。 21. var event=EventUtil.getEvent(event),获取当前事件对象。 22. var target=EventUtil.getTarget(event),获取触发事件的目标元素。 23. if(target.nodeName.toLowerCase()=="li"),判断目标元素的标签名是否为li。 24. var nameList=nameUl.getElementsByTagName("li"),获取标题区域所有li元素的集合。 25. var contentList=content.getElementsByTagName("li"),获取内容区域所有li元素的集合。 26. for(var i=0,len=nameList.length;i<len;i++),遍历li元素集合。 27. nameList.className="",清除当前遍历到的标题li元素的样式类。 28. contentList.style.display="none",隐藏当前遍历到的内容li元素。 29. if(nameList==target),判断当前遍历到的标题li是否即为触发事件的目标元素(即被点击或悬停的项)。 30. nameList.className="selected",若是,则为其添加selected样式类。 31. contentList.style.display="block",同时显示对应索引的内容li元素。
以上内容提供了详细的代码实现与注释说明,旨在帮助读者理解并掌握使用JavaScript实现Tab选项卡的相关技术。
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
