下面是详细讲解“JS+CSS实现仿msn风格选项卡效果代码”的完整攻略,包含以下几个步骤:
下面是详细讲解“JS+CSS实现仿msn风格选项卡效果代码”的完整攻略,包含以下几个步骤:
1. HTML结构
首先,我们需要在HTML中定义选项卡的基本结构,通常采用<ul>
和<li>
来表示。具体代码如下:
<ul class="tabnav">
<li class="active"><a href="#">选项卡1</a></li>
<li><a href="#">选项卡2</a></li>
<li><a href="#">选项卡3</a></li>
</ul>
<div class="tabcontent">
<div class="active">第1个选项卡的内容</div>
<div>第2个选项卡的内容</div>
<div>第3个选项卡的内容</div>
</div>
其中,tabnav
类表示选项卡导航栏,tabcontent
类表示选项卡内容区域,active
类表示当前选项卡的样式。在这个示例中,第1个选项卡会被默认选中,并且相应的内容会被显示出来。
2. CSS样式
接着,我们需要为选项卡和内容定义CSS样式,对于选项卡导航栏,我们可以采用以下样式:
.tabnav {
list-style: none;
margin: 0;
padding: 0;
display: flex;
}
.tabnav li {
margin-right: 15px;
}
.tabnav li a {
display: block;
padding: 10px;
background-color: #eee;
text-decoration: none;
color: #333;
}
.tabnav li.active a {
background-color: #fff;
}
这里采用了flex布局,使得选项卡可以水平排列。对于每个选项卡,采用了a
标签并设置相关样式,同时,当选项卡处于激活状态时,讲改变背景色为白色。
接着为选项卡内容区域定义CSS样式:
.tabcontent div {
display: none;
padding: 10px;
border: 1px solid #ccc;
}
.tabcontent div.active {
display: block;
}
默认情况下,选项卡内容需要被隐藏,通过display: none
实现。当选项卡处于激活状态时,将对应的内容项设置为display: block
,即可实现显示。
3. JavaScript交互
最后,我们需要使用JavaScript实现选项卡的交互效果。具体代码如下:
var tabnav = document.querySelector('.tabnav');
var tabcontent = document.querySelector('.tabcontent');
tabnav.addEventListener('click', function(event) {
var target = event.target;
if (target.tagName === 'A') {
var index = Array.from(tabnav.children).indexOf(target.parentNode);
setActive(index);
}
});
function setActive(index) {
var tabs = tabnav.children;
var contents = tabcontent.children;
for (var i = 0; i < tabs.length; i++) {
tabs[i].classList.remove('active');
contents[i].classList.remove('active');
}
tabs[index].classList.add('active');
contents[index].classList.add('active');
}
代码中首先获取选项卡导航栏和内容区域的DOM元素,然后给选项卡导航栏绑定click
事件。当点击选项卡时,获取所点击的选项卡的索引,通过setActive
函数设置相应的选项卡和内容项为激活状态。
其中,setActive
函数会先将所有选项卡和内容项的激活状态清除,然后再将所选中的选项卡和内容项设置为激活状态。这样,就可以实现选项卡的交互效果了。
示例说明
以下是两个示例,分别实现了不同的选项卡效果。
示例1 - 垂直选项卡
这个示例中,将选项卡导航栏设置为垂直排列的形式,并在选项卡之间添加分割线。CSS样式如下:
.tabnav {
list-style: none;
margin: 0;
padding: 0;
}
.tabnav li {
margin-bottom: 5px;
border-bottom: 1px solid #ccc;
}
.tabnav li:last-child {
margin-bottom: 0;
border-bottom: none;
}
.tabnav li a {
display: block;
padding: 10px;
background-color: #eee;
text-decoration: none;
color: #333;
}
.tabnav li.active a {
background-color: #fff;
}
JavaScript交互部分保持不变。
具体效果可以参考如下的示例页面:
https://codepen.io/pen/?template=bqLzYa
示例2 - 嵌套选项卡
这个示例中,选项卡内容是另外一个选项卡导航栏。即当点击一个选项卡时,该选项卡下面的内容会是另外一个选项卡导航栏,对应的内容区域也是一个选项卡。CSS样式如下:
.tabnav {
list-style: none;
margin: 0;
padding: 0;
display: flex;
}
.tabnav li {
margin-right: 15px;
}
.tabnav li a {
display: block;
padding: 10px;
background-color: #eee;
text-decoration: none;
color: #333;
}
.tabnav li.active a {
background-color: #fff;
}
.tabcontent > div {
display: none;
padding: 10px;
border: 1px solid #ccc;
}
.tabcontent > div.active {
display: block;
}
/* 嵌套选项卡 */
.tabcontent .tabnav {
display: block;
}
.tabcontent .tabnav li {
margin-right: 0;
margin-bottom: 5px;
}
.tabcontent .tabnav li:first-child {
border-top: 1px solid #ccc;
}
.tabcontent .tabnav li a {
background-color: #fff;
color: #333;
border: 1px solid #ccc;
border-top: none;
}
.tabcontent .tabnav li.active a {
background-color: #eee;
}
.tabcontent .tabcontent {
margin: 10px 0 0 20px;
}
JavaScript交互部分需要稍作调整,具体代码如下:
var tabnav = document.querySelector('.tabnav');
var tabcontent = document.querySelector('.tabcontent');
tabnav.addEventListener('click', function(event) {
var target = event.target;
if (target.tagName === 'A') {
var index = Array.from(tabnav.children).indexOf(target.parentNode);
if (target.parentNode.parentNode === tabnav) {
setActive(index);
} else {
var parentIndex = Array.from(tabnav.children).indexOf(target.parentNode.parentNode);
setNestedActive(parentIndex, index);
}
}
});
function setActive(index) {
var tabs = tabnav.children;
var contents = tabcontent.children;
for (var i = 0; i < tabs.length; i++) {
tabs[i].classList.remove('active');
contents[i].classList.remove('active');
}
tabs[index].classList.add('active');
contents[index].classList.add('active');
}
function setNestedActive(parentIndex, index) {
var parentTabs = tabcontent.children[parentIndex].querySelector('.tabnav').children;
var parentContents = tabcontent.children[parentIndex].querySelector('.tabcontent').children;
for (var i = 0; i < parentTabs.length; i++) {
parentTabs[i].classList.remove('active');
parentContents[i].classList.remove('active');
}
parentTabs[index].classList.add('active');
parentContents[index].classList.add('active');
}
以上就是完整的“JS+CSS实现仿msn风格选项卡效果代码”的攻略。
本文标题为:JS+CSS实现仿msn风格选项卡效果代码


- JavaScrip String对象的方法 2023-08-08
- jsonp的原理及在vue中封装jsonp方法 2023-10-08
- Vue联动Echarts实现数据大屏展示 2023-12-25
- layui formSelects实现下拉框select多选,并且编辑时候回显 2023-11-18
- vue 后台返回的一维数组怎样变成二维数组 2023-10-08
- 微信小程序使用navigator实现页面跳转功能 2023-12-24
- 【vue】class、style的用法 2023-10-08
- Vuex localStorage的具体使用 2023-07-09
- html5基础---h5特性 2023-10-27
- JavaScript创建数组的方法详解 2023-08-12