tab选项卡
今天学了个选项卡的写法,思路是这样的:
1.获取所有选项卡节点,一般是li节点集合
2.单击每个tab时,显示出对应的tab内容
首先一个难题是,怎样将tab选项(li)跟tab内容(div)对应起来呢?很简单,我们知道,li跟div的长度是一样的,那么,也就是说,li[i]对应的就是div[i]了。
好,我们先构建好结构。结构如下:
<style type="text/css"> * { margin: 0px; padding:0px; } ul { list-style-type:none; } #tab { width:302px; margin:20px auto; } #tab .nav { width:300px; height:30px; border:1px solid #ccc; } #tab .nav li { float:left; height:30px; border-right:1px solid #999; } #tab .nav li a { float:left; height:30px; line-height:30px; padding:0 20px; color:#fc0; text-decoration:none; } #tab .nav li a:hover { background:#968; } #tab .box { width:300px; height:200px; border:1px solid #ccc; border-top:none; } .active { background:#968; } .content { display:none; } </style> </head> <body> <div id="tab"> <!--tab选项--> <ul class="nav"> <li class="active"><a href="#">tab1</a></li> <li><a href="#">tab1</a></li> <li><a href="#">tab1</a></li> </ul> <!--tab内容--> <div class="box"> <div class="content"> this is tab1 </div> <div class="content"> this is tab2 </div> <div class="content"> this is tab3 </div> </div> </div>
根据思路,我们首先需要获取到nav下的所有li节点,由于在这个结构中,li就那3个,所以,你可以直接document.getElementsByTagName获取也可以先获取到tab节点,再通过tab.getElementsByTagName获取,这样应该获取速度应该会较快。
接着,要获取对应的div,在这个结构中是class为content的div,可以通过类名获取到这个节点集合,关于获取getElementsByClassName函数详见:http://www.cnblogs.com/littledu/articles/2026116.html
到目前为止,JS代码如下:
var tab = document.getElementById('tab'); var list = tab.getElementsByTagName('li'); var contents = getElementsByClass('content',tab);
现在,我们就可以遍历每一个li,然后给每一个li添加一个onclick事件,在这个事件里,切换选项卡内容,我们通过代码来解释,如下:
for(var i=0;i<list.length;i++){ //遍历li节点 list[i].index = i; //给每一个li挂接一个标识,以避开闭包带来的影响 list[i].onclick = function(){ //给每一节点添加单击事件 for(var j = 0; j < list.length; j++){ //再次遍历,将默认的属性重置 list[j].className = ''; contents[j].style.display = 'none'; } list[this.index].className = 'active'; //切换样式 contents[this.index].style.display = 'block'; //显示内容 } }
上面的代码利用了属性值进行识别,还有一种更好的方法,利用匿名函数立即执行,达到相同的效果,见代码:
for(var i=0;i<list.length;i++){ (function(i){ list[i].onclick = function(){ for(var j = 0; j < list.length; j++){ list[j].className = ''; contents[j].style.display = 'none'; } list[i].className = 'active'; contents[i].style.display = 'block'; } })(i) }
这样,就已经可以了。最后,放上完整实例,如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> <script type="text/javascript"> window.onload = function(){ var tab = document.getElementById('tab'); var list = tab.getElementsByTagName('li'); var contents = getElementsByClass('content',tab); contents[0].style.display = 'block'; for(var i=0;i<list.length;i++){ list[i].index = i; list[i].onclick = function(){ for(var j = 0; j < list.length; j++){ list[j].className = ''; contents[j].style.display = 'none'; } list[this.index].className = 'active'; contents[this.index].style.display = 'block'; } } } function getElementsByClass(className,node){ node = node || document; if(node.getElementsByClassName){ return node.getElementsByClassName(className); } var nodes = node.getElementsByTagName("*"); var ret = new Array(); for(var i = 0; i < nodes.length; i++){ if(hasClass(nodes[i],className)){ ret.push(nodes[i]); } } return ret; } function hasClass(node,className){ var classes = node.className.split(/\s+/); for(var i = 0; i < classes.length; i++){ if(classes[i] == className){ return true; } } return false; } </script> <style type="text/css"> * { margin: 0px; padding:0px; } ul { list-style-type:none; } #tab { width:302px; margin:20px auto; } #tab .nav { width:300px; height:30px; border:1px solid #ccc; } #tab .nav li { float:left; height:30px; border-right:1px solid #999; } #tab .nav li a { float:left; height:30px; line-height:30px; padding:0 20px; color:#fc0; text-decoration:none; } #tab .nav li a:hover { background:#968; } #tab .box { width:300px; height:200px; border:1px solid #ccc; border-top:none; } .active { background:#968; } .content { display:none; } </style> </head> <body> <div id="tab"> <!--tab选项--> <ul class="nav"> <li class="active"><a href="#">tab1</a></li> <li><a href="#">tab1</a></li> <li><a href="#">tab1</a></li> </ul> <!--tab内容--> <div class="box"> <div class="content"> this is tab1 </div> <div class="content"> this is tab2 </div> <div class="content"> this is tab3 </div> </div> </div> </body> </html>