@Asan-走走停停

该走的时候,勇敢的往前走,不要回头;该停的时候,安心的停下来,多看看。

导航

有关TAB选项卡的总结

做个TAB选项卡的总结:

“TAB选项卡”的表现形式多种多样.

一,最早的听说是通过iframe框架标签实现,联合导航菜单将需要打开的页面显示在框架中;我没有见过这种,你见过么@!^^^^^。

二,看下面的实现:

首先,HTML结构

再次,CSS表现

最后,JavaScript行为

(例一) —— 行为结构未分离

html:


  • 1111111
  • 2222222
  • 3333333
  • 4444444
  • 5555555
内容11111111111111111111

内容11111111111111111111

内容22222222222222222222

内容33333333333333333333

内容44444444444444444444

内容55555555555555555555

css:

/*。。。随便写滴样式,但是好好运用样式会让页面更漂亮。。。*/
*{ margin:0; padding:0;}
ul,li{ list-style:none;}
#demo{ width:500px; margin:50px auto;box-shadow:1px 2px 3px  #000;}
li{ float:left; height:30px; width:100px; font:14px/30px simsun; text-align:center; background:#0CF; color:#FFF; cursor:pointer;}
li.current{ background:#F00;color:#FFF;}
p{ display:none;}
#content{ height:300px; background:#F00; color:#FFF; font-size:24px;}

js:

function TAB(n){
   var lis=document.getElementById("demo").getElementsByTagName("li");//获取列表集合
   for(var i=0;i<lis.length;i++){lis[i].className=""};//循环 清除每个列表的类名
   lis[n-1].className="current";//设置 当前点击的列表的类名
   var div=document.getElementById("content");//显示容器
   var ps=document.getElementById("p"+n);//对应的内容容器 它是隐藏的
   div.innerHTML=ps.innerHTML;//复制到显示容器
};

...设置每个id...每个事件...麻烦么?...

(例二) —— 行为结构未分离

html:


  • 1111111
  • 2222222
  • 3333333
  • 4444444
  • 5555555

内容11111111111111111111

内容22222222222222222222

内容33333333333333333333

内容44444444444444444444

内容55555555555555555555

css:

/*。。。随便写滴样式,但是好好运用样式会让页面更漂亮。。。*/
*{ margin:0; padding:0;}
ul,li{ list-style:none;}
#demo{ width:500px; margin:50px auto;box-shadow:1px 2px 3px  #000;}
li{ float:left; height:30px; width:100px; font:14px/30px simsun; text-align:center; background:#0CF; color:#FFF; cursor:pointer;}
li.current{ background:#F00;color:#FFF;}
p{display:none; height:300px; background:#F00; color:#FFF; font-size:24px;}
p.current{ display:block;}

js:

 function TAB(n){
   var lis=document.getElementById("demo").getElementsByTagName("li");//获取列表集合
   var ps=document.getElementById("demo").getElementsByTagName("p");//获取显示内容集合
   for(var i=0;i<lis.length;i++){//循环判断集合下标  是则显示 否则隐藏
      if(n-1==i){
         lis[i].className="current"; 
         ps[i].className="current";
      }else{
         lis[i].className=""; 
         ps[i].className="";
      }
   };
};

...设置每个事件...麻烦么?...

(例三) —— 行为结构分离

html:


  • 1111111
  • 2222222
  • 3333333
  • 4444444
  • 5555555

内容11111111111111111111

内容22222222222222222222

内容33333333333333333333

内容44444444444444444444

内容55555555555555555555

css:

/*。。。随便写滴样式,但是好好运用样式会让页面更漂亮。。。*/
/*。。。和例二一样。。。*/

js:

var $$i=function(id,tag){
    if(!tag){return document.getElementById(id);}
    else{return document.getElementById(id).getElementsByTagName(tag);}
};
function Tab(){
  var lis=$$i("demo","li");//相当于var lis=document.getElementById("demo").getElementsByTagName("li");
  var divs=$$i("demo","p");
  var len=lis.length;
   for(var i=0;i<len;i++){
	lis[i].index=i;
	lis[i].onmouseover=function(){
	  for(var j=0;j<len;j++){lis[j].className = "";divs[j].className = ""; }
	  lis[this.index].className = "current";
	  divs[this.index].className = "current";
	};
   }
};
Tab();

...设置id和标签...灵活么?...

(例四) —— 行为结构分离

结构和样式不贴了,看运行例子。。。

js:

var $i=function(id){return "string" == typeof id ? document.getElementById(id) : id;};
var $t=function(n,el){return (el || document).getElementsByTagName(n);};
function Tab(id,taga,tagb){//taga第一个集合标签名 tagb第二个集合标签名
   var el=$i(id);
  if(!el) return false;
  var lis=$t(taga,el);
  var divs=$t(tagb,el);
  var len=lis.length;
  for(var i=0;i<len;i++){
	lis[i].index=i;
	lis[i].onmouseover=function(){
	  for(var j=0;j<len;j++){lis[j].className = "";divs[j].className = ""; }
	  lis[this.index].className = "current";
	  divs[this.index].className = "current";
	};
  }
};
Tab("demo","li","p");
Tab("demo2","span","div");

...设置id和标签...灵活么?...

(例五) —— 行为结构分离

结构和样式不贴了,看运行例子。。。

js:

var $c=function(classname,node){//获取指定类名的函数 有各种版本
  var a = [];
  var re = new RegExp('(^| )'+classname+'( |$)');
  var els = (node||document).getElementsByTagName("*");
  for(var i=0,j=els.length; i<j; i++) if(re.test(els[i].className)) a.push(els[i]);
  return a;
};
var $i=function(id){return "string" == typeof id ? document.getElementById(id) : id;};
function addLoadEvent(func) {
  var oldonload = window.onload;
  if(typeof window.onload != 'function'){window.onload = func;}else{window.onload = function(){oldonload();func();}}
};
function Tab(id){
  var el=$i(id);
  if(!el) return false;
  var lis=$c("tabNav",el),divs=$c("tabCont",el),len=lis.length;//其中tabNav和tabCont是自定义通用类
  for(var i=0;i<len;i++){
	lis[i].index=i;
	lis[i].onmouseover=function(){
	  for(var j=0;j<len;j++){lis[j].className = "tabNav";divs[j].className = "tabCont"; }
	  lis[this.index].className = "current tabNav";
	  divs[this.index].className = "current tabCont";
	};
   }
};
addLoadEvent(function(){
  Tab("demo");
  Tab("demo2");
});

...设置id和通用类名...灵活么?...

(例六) —— 行为结构分离

结构和样式不贴了,看运行例子。。。

js:

var $i = function (id){return "string" == typeof id ? document.getElementById(id) : id;};
var $c=function(classname,node){//获取指定类名的函数 有各种版本 
  var a = [];
  var re = new RegExp('(^| )'+classname+'( |$)');
  var els = (node||document).getElementsByTagName("*");
  for(var i=0,j=els.length; i<j; i++) if(re.test(els[i].className)) a.push(els[i]);
  return a;
};
function addLoadEvent(func){
  var oldonload = window.onload;
  if(typeof window.onload != 'function'){window.onload = func;}else{window.onload = function(){oldonload();func();}}
};
function Tab() {
  var jstab = $c("jstab");//通用定义TAB选项卡类
  for (var i = 0; i < jstab.length; i++){
	  (function(i) {
      var els = jstab[i];
      var lis = $c("tab", els),//其中tab和tab-con是自定义通用类
      divs = $c("tab-con", els),
      len = lis.length;
      for (var j = 0; j < len; j++) {
        lis[j].index = j;
        lis[j].onmouseover = function() {
          for (var m = 0; m < len; m++) {
            lis[m].className = "tab";
            divs[m].className = "tab-con";
          }
          lis[this.index].className = "tab current";
          divs[this.index].className = "tab-con current";
        };
      }
    })(i)
  }
};
addLoadEvent(function(){
  Tab();
});

...设置通用类名...灵活么?...

深度分析:

@实现TAB选项卡需要理解"数组集合"的概念,取得这样的"数组集合"在HTML页面中就是:

1.标签的集合 li div h1-h6 p dl ...

  var lis=document.getElementsByTagName("li");//取得页面li标签的集合并传给变量lis,这样变量lis就是li标签集合的引用

2.类名的集合 .class1 .class2 .class2 ...

  var elements=document.getElementsByClassName("class1");//取得页面类名为class1元素的集合
  //getElementsByClassName方法某些浏览器没有实现,可以自己定义一个,也可以在网上找找。。。

//getElementsByClassName可以参考这里的实现。

3.类名和标签结合的集合 div.class1 p.class2 ...

4.其它方式建立的集合...

@@现在"集合"有了,该做什么呢:

假如有两个集合:一个为菜单A 一个为内容B。我们希望当我们点击或者移到A[0]时相应的B[0]为显示状态,A[1]/B[1]...

我们发现A[0]中的0,B[0]中的0,A[1]/B[1]...是相同的,也是数组的下标,也称为索引值,我们要做的就是得到这个索引值。

@@@在取得这个值之前做个试验,运行下面例子:

  var aa=document.getElementsByTagName("a");//取得页面a标签的集合 共5个
  for(var i=0;i<aa.length;i++){
    aa[i].onclick=function(){
	  alert(i);//点击a似乎应该弹出对应i索引值 
          return false;//阻止链接跳转
	}
  }

点击后发现弹出的值始终是5 为什么呢?作用域问题。。。

该怎么解决呢?运行下面例子:

方法一:闭包

  var aa = document.getElementsByTagName("a"); //取得页面a标签的集合 共5个
  for (var i = 0; i<aa.length; i++) { 
    (function(m) {
       aa[m].onclick = function() {
         alert(m); //点击a弹出对应i的值
         return false;//阻止链接跳转
       }
    })(i)
   }

方法二:属性

  var aa = document.getElementsByTagName("a"); //取得页面a标签的集合 共5个
  for (var i = 0; i<aa.length; i++) { 
       aa[i].index=i;//为aa[i]创建个属性index
       aa[i].onclick = function() {
         alert(this.index); //点击a弹出对应i的值
          return false;//阻止链接跳转
       }
   }

现在知道怎么取得"索引值"了。。。

就有上面例子类似这样的实现

 //………… 
 for(var i=0;i<len;i++){
	lis[i].index=i;
	lis[i].onmouseover=function(){
	   //………… 
	  lis[this.index].className = "current tabNav";
	  divs[this.index].className = "current tabCont";
	};
   }
 //………… 

后面的就是一些对应实现。。。

TAB选项卡核心已经完完全全的展示出来了:取得"数组集合",取得"索引值",对应功能实现。

选项卡定义有各种各样的实现。。。

如实现自动播放,只要合理运用"索引值"……加上setTimeout()/setInterval()……

如再加上透明/缓动,那效果更炫……如做到这里做焦点图/幻灯片也会了@^_^@

@@@以上这些就是我的TAB选项卡总结,其中肯定有许多的问题,请多多指正,谢谢!

posted on 2011-08-16 23:14  lbsgood  阅读(1594)  评论(0编辑  收藏  举报