纯JavaScript实现Tab标签页切换的四种方式对比

作者:交互手记

时间:2026-10-30

浏览:611

本文详细解析了使用纯JavaScript实现Tab标签页切换的四种常见方法。从最初基于ID的独立事件绑定,到利用索引传参的循环控制,再到通过this指针优化DOM获取,最后介绍完全分离HTML与JS的最简方案。文章对比了各方案的代码冗余度、扩展性及维护成本,推荐采用结合this指针与DOM遍历的现代写法,以实现HTML、CSS与JS的完全分离及最佳的可维护性。

文章目录

基于ID的独立事件绑定方案

首先介绍一种较为原始的实现思路。

HTML结构部分。


<div class="tab-head">
<h2 id="tab1" onmouseover="changeTab1()" class="selected">1</h2>
<h2 id="tab2" onmouseover="changeTab2()">2</h2>
<h2 id="tab3" onmouseover="changeTab3()">3</h2>
</div>
<div class="tab-content">
<div id="c1" class="show">content1</div>
<div id="c2">content2</div>
<div id="c3">content3</div>
</div>

CSS样式定义部分。


h2 {
border-top: solid cornflowerblue 1px;
border-left: solid cornflowerblue 1px;
width: 50px;
height: 25px;
margin: 0;
float: left;
text-align: center;
}
.tab-content {
border: solid cornflowerblue 1px;
width: 152px;
height: 100px;
}
.tab-content div{
display: none;
}
.selected {
background-color: cornflowerblue;
}
.tab-content .show{
display: block;
} 

JavaScript逻辑代码部分。


var tab1 = document.getElementById('tab1'),
tab2 = document.getElementById('tab2'),
tab3 = document.getElementById('tab3'),
c1 = document.getElementById('c1'),
c2 = document.getElementById('c2'),
c3 = document.getElementById('c3');
function changeTab1() {
tab1.className = 'selected';
tab2.className = '';
tab3.className = '';
c1.className = 'show'
c2.className = '';
c3.className = '';
}
function changeTab2() {
tab1.className = '';
tab2.className = 'selected';
tab3.className = '';
c1.className = '';
c2.className = 'show';
c3.className = '';
}
function changeTab3() {
tab1.className = '';
tab2.className = '';
tab3.className = 'selected';
c1.className = ''
c2.className = '';
c3.className = 'show';
} 

最终呈现的视觉效果。

基于ID的独立事件绑定方案

要实现Tab标签页的切换功能,最直观的思路是为每个需要控制的标签元素分配唯一的id,并分别为其编写鼠标事件。通过id获取对应的DOM元素后,精确地修改每个元素的样式类名以展示对应内容。

这种方法的缺点非常明显:如果有N个标签,就需要定义N个id,并为每个tab单独编写一个处理函数。这些函数的逻辑高度相似,导致代码大量冗余。一旦需要增加新的tab,就必须同时增加对应的id和函数,系统难以扩展。

基于索引传参的通用函数方案

第二种改进方法是通过编写一个通用的function,并将每个元素的序号作为参数传入。

HTML结构示例。


<div class="tab-head">
<h2 onmouseover="changeTab(0)" class="selected">1</h2>
<h2 onmouseover="changeTab(1)">2</h2>
<h2 onmouseover="changeTab(2)">3</h2>
</div>
<div class="tab-content">
<div class="show">content1</div>
<div>content2</div>
<div>content3</div>
</div> 

JavaScript逻辑代码示例。


var tabs = document.getElementsByClassName('tab-head')[0].getElementsByTagName('h2'),
contents = document.getElementsByClassName('tab-content')[0].getElementsByTagName('div');
function changeTab(index) {
for(var i = 0, len = tabs.length; i < len; i++) {
if(i === index) {
tabs[i].className = 'selected';
contents[i].className = 'show';
}else{ tabs[i].className = '';
contents[i].className = ''; }
}
}

这种方式只需编写一个function,且不再依赖id属性,但仍需按照固定顺序传递参数,灵活性有所提升。

基于this指针的DOM传递方案

第三种方式与第二种基本一致,区别在于传递的参数由序号改为this指针(当前DOM元素)。

HTML结构示例。


<div class="tab-head">
<h2 onmouseover="changeTab(this)" class="selected">1</h2>
<h2 onmouseover="changeTab(this)">2</h2>
<h2 onmouseover="changeTab(this)">3</h2>
</div>
<div class="tab-content">
<div class="show">content1</div>
<div>content2</div>
<div>content3</div>
</div> 

JavaScript逻辑代码示例。


var tabs = document.getElementsByClassName('tab-head')[0].getElementsByTagName('h2'),
contents = document.getElementsByClassName('tab-content')[0].getElementsByTagName('div');
function changeTab(tab) {
for(var i = 0, len = tabs.length; i < len; i++) {
if(tabs[i] === tab) {
tabs[i].className = 'selected';
contents[i].className = 'show';
} else {
tabs[i].className = '';
contents[i].className = '';
}
}
} 

这种方式相对便捷,只需传递this指针即可,无需计算或传递序号,但仍未达到最简状态。

完全分离HTML与JS的最简方案

接下来介绍最简便的一种实现方案。

第四种方式,即最终推荐的最佳实践。

HTML结构示例。


<div class="tab-head">
<h2 class="selected">1</h2>
<h2>2</h2>
<h2>3</h2>
</div>
<div class="tab-content">
<div class="show">content1</div>
<div>content2</div>
<div>content3</div>
</div> 

JavaScript逻辑代码示例。


var tabs = document.getElementsByClassName('tab-head')[0].getElementsByTagName('h2'),
contents = document.getElementsByClassName('tab-content')[0].getElementsByTagName('div');
(function changeTab(tab) {
for(var i = 0, len = tabs.length; i < len; i++) {
tabs[i].onmouseover = showTab;
}
})();
function showTab() {
for(var i = 0, len = tabs.length; i < len; i++) {
if(tabs[i] === this) {
tabs[i].className = 'selected';
contents[i].className = 'show';
} else {
tabs[i].className = '';
contents[i].className = '';
}
}
} 

通过这种方式,HTML、JS和CSS实现了完全分离。利用this指针判断当前鼠标滑过的tab,并结合DOM遍历逻辑动态更新样式,既简洁又易于维护。

以上介绍了纯JavaScript实现Tab标签页切换的四种方式,从基础到优化,希望能帮助开发者理解不同实现路径的优劣。如有任何疑问,欢迎留言讨论,感谢支持。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章