您的位置:首页 > Web前端 > HTML

HTML中tab选项卡制作

2015-03-06 17:24 696 查看
这次要做的是tab选项卡,也叫滑动门。具体是什么呢?如图



当我鼠标滑过上边标题栏的某一li时,下边显示的内容进行相应的改变。这个在门户网站经常用到。具体怎么做呢?其实很简单啦,只需要当我鼠标滑过某一标题li时,把下边的对应的div设置为block,其余的设置为display:none就可以了。下面说一下具体实现的细节.

HTML部分:

在一个tabs的div里面放一个tabs-tit的div和tabs-con的div,tabs-tit放标题列表ul,tabs-con放多个内容的div。

<div id="tabs" class="tabs">
<div id="tabs-tit" class="tabs-tit">
<ul>
<li>
<a href="#">Java</a>
</li>
<li>
<a href="#">HTML5</a>
</li>
<li>
<a href="#">CSS3</a>
</li>
<li>
<a href="#">JavaScript</a>
</li>
<li class="select">
<a href="#">jQuery</a>
</li>
</ul>
</div>
<div id="tabs-con" class="tabs-con">
<div class="tab" style="display:none">
<ul>
<li>
<a href="#">
这里是Java
</a>
</li>
<li>
<a href="#">
这里是Java
</a>
</li>
<li>
<a href="#">
这里是Java
</a>
</li>
<li>
<a href="#">
这里是Java
</a>
</li>
</ul>
</div>
<div class="tab" style="display:none">
<ul>
<li>
<span>
[
<a href="#">通知</a>
]
</span>
<a href="#">
这里是HTML5
</a>
</li>
<li>
<span>
[
<a href="#">通知</a>
]
</span>
<a href="#">
这里是HTML5
</a>
</li>
<li>
<span>
[
<a href="#">通知</a>
]
</span>
<a href="#">
这里是HTML5
</a>
</li>
<li>
<span>
[
<a href="#">通知</a>
]
</span>
<a href="#">
这里是HTML5
</a>
</li>
</ul>
</div>
<div class="tab" style="display:none">
<ul>
<li>
<span>
[
<a href="#">聚焦</a>
]
</span>
<a href="#">
这里是CSS3
</a>
</li>
<li>
<span>
[
<a href="#">功能</a>
]
</span>
<a href="#">
这里是CSS3
</a>
</li>
<li>
<span>
[
<a href="#">话题</a>
]
</span>
<a href="#">
这里是CSS3
</a>
</li>
<li>
<span>
[
<a href="#">工具</a>
]
</span>
<a href="#">
这里是CSS3
</a>
</li>
</ul>
</div>
<div class="tab" style="display:block">
<ul>
<li>
<a href="#">
这里是JavaScript
</a>
</li>
<li>
<a href="#">
这里是JavaScript
</a>
</li>
<li>
<a href="#">
这里是JavaScript
</a>
</li>
<li>
<a href="#">
这里是JavaScript
</a>
</li>
</ul>
</div>
<div class="tab" style="display:none">
<ul>
<li>
<a href="#">
这里是jQuery
</a>
</li>
<li>
<a href="#">
这里是jQuery
</a>
</li>
<li>
<a href="#">
这里是jQuery
</a>
</li>
<li>
<a href="#">
这里是jQuery
</a>
</li>
</ul>
</div>
</div>
</div>
CSS部分:

那种很简单的比如什么li要float:left之类的就不记录了。说几个比较重要的。.tabs{width:298px;
height:98px;
margin:10px;
border:1px solid #eee;
overflow:hidden;}
/*可以看见tabs为298px,加上border的2px也就是300px*/
.tabs-tit ul{position:absolute;
width:301px;
left:-1px;}
为什么ul要设置301呢,这是因为在实现过程中,每当ul里的li的a:hover的时候,左右是有一个边框的,那么这样li有边框,外边的tabs也有就会出现双边框,为了避免这个问题我让他绝对定位,并且左移一个像素,这样li的边框就被遮住了。

.tabs-tit li{float:left;
width:58px;
height:26px;
line-height:26px;
text-align:center;
overflow:hidden;
background:#FFF;
padding:0 1px;
background:#F7F7F7;
border-bottom:1px solid #eee;}

上面代码的li的width为什么去58,因为我的tabs为301,除以5也就是60,58加上左右的一像素边框也就是60了,左右padding为1px是因为本来左右是没有那1px的边框的,那么我就需要1px的填充把整个里撑起来,hover的时候取消填充变成1px的border就达到了效果了,

.tabs-tit li.select{background:#FFF;
border-bottom-color:#FFF;
border-left:1px solid #eee;
border-right:1px solid #eee;
padding:0;
font-weight:bolder;}

如果是后台获取的数据个数未知可以用js获取来计算总的tabs宽度再设置就可以了

JS部分:js就是实现切换了,直接贴代码吧。

function $(id){
return typeof id==='string'?document.getElementById(id):id;
}

window.onload=function(){
// 标签的索引
var index=0;
var timer=null;

var lis=$('tabs-tit').getElementsByTagName('li'),
divs=$('tabs-con').getElementsByTagName('div');

if(lis.length!=divs.length) return;

// 遍历所有的页签
for(var i=0;i<lis.length;i++){
lis[i].id=i;
lis[i].onmouseover=function(){
// 用that这个变量来引用当前滑过的li
var that=this;
for(var j=0;j<lis.length;j++){
lis[j].className='';
divs[j].style.display='none';
}
lis[that.id].className='select';
divs[that.id].style.display='block';
}
}
}
以上就是实现tab选项卡啦。但是这样会不会太简单啦,反正我觉着太简单了,所以我这里得加一点东西。

①为什么是鼠标滑过呢,我非要点击才出发呢?

lis[i].click=function(){
// 用that这个变量来引用当前滑过的li
var that=this;
for(var j=0;j<lis.length;j++){
lis[j].className='';
divs[j].style.display='none';
}
lis[that.id].className='select';
divs[that.id].style.display='block';
}

②我鼠标移上去马上就切换总觉得不太合适,那么就让他有0.5的延迟吧,怎么玩?

if(timer){
clearTimeout(timer);
timer=null;
}
// 延迟半秒执行
timer=window.setTimeout(function(){
for(var j=0;j<lis.length;j++){
lis[j].className='';
divs[j].style.display='none';
}
lis[that.id].className='select';
divs[that.id].style.display='block';
},500);

上边的clearTimeout()是清除定时器,js中定时器有两个,setTimeout()和setInterval(),setTimeout()只执行一次,只有再你调用才会才会执行,而setInterval()则是每个一定时间(设置的值)反复执行的。这里在触发tab选项卡之前需要对定时器进行一次clearTimeout(),原因在于当我鼠标移动得很快的时候,这边的定时器还未完成,那边的定时器已经开始执行,会导致多个定时器一起执行很影响效率。

③在有些网站比如某些地方网站或者京东这样的网站他们tabs选项卡是这样的:



当你的鼠标没有hover某一个时,它是自动的跳动,当你鼠标hover某一个时,他就跳到指定的那一个,鼠标移除的时候继续播放。这个应该怎么做呢?

这个做也不难,只是我们需要给每个div和li一个索引,再使用setInterval()就可以实现了。// 获取所有的页签和要切换的内容
var lis=$('notice-tit').getElementsByTagName('li');
var divs=$('notice-con').getElementsByTagName('div');
// 遍历每一个页签且给他们绑定事件
for(var i=0;i<lis.length;i++){
lis[i].id=i;
lis[i].onmouseover=function(){
clearInterval(timer);
changeOption(this.id);
}
lis[i].onmouseout=function(){
timer=setInterval(autoPlay,2000);
}
}
if(timer){
clearInterval(timer);
timer=null;
}
// 添加定时器,改变当前高亮的索引
timer=setInterval(autoPlay,2000);

function autoPlay(){
index++;
if(index>=lis.length){
index=0;
}
changeOption(index);
}

function changeOption(curIndex){
for(var j=0;j<lis.length;j++){
lis[j].className='';
divs[j].style.display='none';
}m
// 高亮显示当前页签
lis[curIndex].className='select';
divs[curIndex].style.display='block';
index=curIndex;
}
④最后提交一个关于setInterval()的应用,如图



可用setInterval()做很简单。

后面贴上下载链接地址:几个例子都在里面。

http://download.csdn.net/detail/u014209090/8478921
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: