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>
posted @ 2011-04-29 09:35  肥杜  阅读(342)  评论(0编辑  收藏  举报