JS基于myFocus库实现各种功能的tab选项卡切换效果


Posted in Javascript onSeptember 19, 2015

本文实例讲述了JS基于myFocus库实现各种功能的tab选项卡切换效果。分享给大家供大家参考。具体如下:

这里介绍使用myFocus-tab实现各种功能的选项卡切换,有的是带有动画效果的,各款基于myFocus库制作的焦点图风格皮肤,可自行按需选择,myFocus焦点图库及皮肤可自由使用,保留作者相关信息即可,谢谢支持!^^

运行效果截图如下:

JS基于myFocus库实现各种功能的tab选项卡切换效果

JS基于myFocus库实现各种功能的tab选项卡切换效果

在线演示地址如下:

具体代码如下:

<!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>
<title>myFocus-tab 各种功能的选项卡切换</title>
<style type="text/css">
* { margin:0; padding:0; border:0; list-style:none; }
body { background:#fff; padding:20px; font:1em Verdana, Geneva, sans-serif; }
.box { float:left; margin-right:20px; }
.box h4 { color:#c00; line-height:30px; font-size:12px; }
.tip { border:1px solid #dedede; margin-top:20px; }
.tip p { height:30px; line-height:30px; padding-left:16px; background:#f1f1f1; }
.tip pre { background:##AFF8AB; }
.tip2 { font-size:12px; color:#888; margin-top:16px; }
.mF_tab { width:426px; height:90px; margin-left:16px; }
.mF_tab .btn { position:absolute; top:0; left:0; z-index:2; }
.mF_tab .btn li { float:left; width:80px; height:26px; line-height:26px; text-align:center; margin-right:2px; border:1px solid #dedede; border-bottom:0; cursor:pointer; background:#f1f1f1; }
.mF_tab .btn li.current { height:27px; background:#fff; }
.mF_tab .cont { position:absolute; top:27px; left:0; border:1px solid #dedede; overflow:hidden; }
.mF_tab .cont .swt { position:absolute; left:0; top:0; }
.mF_tab .cont .swt li p { padding:16px; }
</style>
<script type="text/javascript">
var myFocus={
  $:function(id){return document.getElementById(id);},
  $$:function(tag,obj){return (typeof obj=='object'?obj:this.$(obj)).getElementsByTagName(tag);},
  $$_:function(tag,obj){
    var arr=[],n=0,a=obj.getElementsByTagName(tag);
    for(var i=0;i<a.length;i++){
    arr.push(a[i]);
    if(a[i].getElementsByTagName(tag).length){n=a[i].getElementsByTagName(tag).length}
    i=i+n;n=0;
    } return arr;
  },
  $li:function(obj,n){return this.$$_('li',this.$$_('ul',obj)[n])},
  linear:function(t,b,c,d){return c*t/d + b;},
  easeIn:function(t,b,c,d){return c*(t/=d)*t*t*t + b;},
  easeOut:function(t,b,c,d){return -c*((t=t/d-1)*t*t*t - 1) + b;},
  easeInOut:function(t,b,c,d){return ((t/=d/2) < 1)?(c/2*t*t*t*t + b):(-c/2*((t-=2)*t*t*t - 2) + b);},
  style:function(obj,style){return obj['offset'+style.replace(/^(.)/,new Function('return arguments[1].toUpperCase()'))];},
  opa:function(obj,v){
    if(v!=undefined) {v=v>100?100:(v<0?0:v); obj.style.filter = "alpha(opacity=" + v + ")"; obj.style.opacity = (v / 100);}
    else return (!+[1,])?((obj.filters.alpha)?obj.filters.alpha.opacity:100):((obj.style.opacity)?obj.style.opacity*100:100);
  },
  animate:function(obj,prop,val,spd,type,fn){
    var opa=prop=='opacity'?true:false;
    if(opa&&obj.style.display=='none'){obj.style.display='';this.opa(obj,0);}
    var t=0,b=opa?this.opa(obj):parseInt(this.style(obj,prop)),c=val-b,d=spd||50,st=type||'easeOut',m=c>0?'ceil':'floor';
    if(obj[prop+'Timer']) clearInterval(obj[prop+'Timer']);
    obj[prop+'Timer']=setInterval(function(){
      if(opa&&t<d){myFocus.opa(obj,Math[m](myFocus[st](++t,b,c,d)));}
      else if(!opa&&t<d){obj.style[prop]=Math[m](myFocus[st](++t,b,c,d))+'px';}
      else {if(opa&&val==0){obj.style.display='none'}clearInterval(obj[prop+'Timer']);fn&&fn.call(obj);}
    },10);return this;
  },
  fadeIn:function(obj,speed,fn){this.animate(obj,'opacity',100,speed==undefined?20:speed,'linear',fn);return this;},
  fadeOut:function(obj,speed,fn){this.animate(obj,'opacity',0,speed==undefined?20:speed,'linear',fn);return this;},
  slide:function(obj,params,speed,easing,fn){for(var p in params) this.animate(obj,p,params[p],speed,easing,fn);return this;},
  stop:function(obj){
    var animate=['left','right','top','bottom','width','height','opacity'];
    for(var i=0;i<animate.length;i++) if(obj[animate[i]+'Timer']) clearInterval(obj[animate[i]+'Timer']);
    return this;
  },
  initCSS:function(p){
    var css=[],oStyle = document.createElement('style');oStyle.type='text/css';
    if(p.width){css.push('.'+p.style+' *{margin:0;padding:0;border:0;list-style:none;}.'+p.style+'{position:relative;width:'+p.width+'px;height:'+p.height+'px;overflow:hidden;font:12px/1.5 Verdana,Geneva,sans-serif;background:#fff;}.'+p.style+' .loading{position:absolute;z-index:9999;width:100%;height:100%;color:#666;text-align:center;padding-top:'+0.3*p.height+'px;background:#fff}.'+p.style+' .txt li,.'+p.style+' .txt li span,.'+p.style+' .txt-bg{width:'+p.width+'px;height:'+p.txtHeight+'px;line-height:'+p.txtHeight+'px;overflow:hidden;}')}
    if(oStyle.styleSheet){oStyle.styleSheet.cssText=css.join('');} else {oStyle.innerHTML=css.join('');}
    var oHead = this.$$('head',document)[0];oHead.insertBefore(oStyle,oHead.firstChild);
  },
  setting:function(par){
    if(window.attachEvent){(function(){try{myFocus.$(par.id).className=par.style;myFocus.initCSS(par);}catch(e){setTimeout(arguments.callee,0);}})();window.attachEvent('onload',function(){myFocus[par.style](par)});}
    else{document.addEventListener("DOMContentLoaded",function(){myFocus.$(par.id).className=par.style;myFocus.initCSS(par);},false);window.addEventListener('load',function(){myFocus[par.style](par)},false);}
  },
  addList:function(obj,cla){
    var s=[],n=this.$li(obj,0).length,num=cla.length;
    for(var j=0;j<num;j++){
      s.push('<ul class='+cla[j]+'>');
      for(var i=0;i<n;i++){s.push('<li>'+(cla[j]=='num'?('<a>'+(i+1)+'</a>'):(cla[j]=='txt'?this.$li(obj,0)[i].innerHTML.replace(/\>(.|\n|\r)*?(\<\/a\>)/i,'>'+(this.$$('img',obj)[i]?this.$$('img',obj)[i].alt:'')+'</a>'):(cla[j]=='thumb'?'<img src='+(this.$$('img',obj)[i].getAttribute("thumb")||this.$$('img',obj)[i].src)+' />':'')))+'<span></span></li>')};
      s.push('</ul>');
    }; obj.innerHTML+=s.join('');
  },
  switchMF:function(fn1,fn2){
    return "box.removeChild(this.$$('div',box)[0]);var run=function(idx){("+fn1+")();if (index == n - 1) index = -1;var next = idx != undefined ? idx: index + 1;("+fn2+")();index=next;};run(index);if(par.auto!==false) var auto=setInterval(function(){run()},t);box.onmouseover=function(){if(auto) clearInterval(auto);};box.onmouseout=function(){if(auto) auto=setInterval(function(){run()},t);}"
  },
  bind:function(arrStr,type,delay){
    return "for (var j=0;j<n;j++){"+arrStr+"[j].index=j;if("+type+"=='click'){"+arrStr+"[j].onmouseover=function(){if(this.className!='current') this.className='hover'};"+arrStr+"[j].onmouseout=function(){if(this.className=='hover') this.className=''};"+arrStr+"[j].onclick=function(){if(this.index!=index) run(this.index)};}else if("+type+"=='mouseover'){"+arrStr+"[j].onmouseover=function(){var self=this;if("+delay+"==0){if(!self.className) run(self.index)}else "+arrStr+".d=setTimeout(function(){if(!self.className) run(self.index)},"+(delay==undefined?100:delay)+")};"+arrStr+"[j].onmouseout=function(){clearTimeout("+arrStr+".d)};}else{alert('myFocus 不支持这样的事件 \"'+"+type+"+'\"');break;}}"
  },
  extend:function(fnObj){for(var p in fnObj) this[p]=fnObj[p];}
};
myFocus.extend({
  mF_tab:function(par){
    var box=this.$(par.id);
    this.$$('ul',box)[1].innerHTML='<li><ul class=swt>'+this.$$('ul',box)[1].innerHTML+'</ul></li>';
    var btn=this.$li(box,0),wrap=this.$$('ul',box)[1],swt=this.$$('ul',box)[2],cont=this.$$_('li',swt);
    var index=par.index||0,n=btn.length,t=par.time*1000;
    swt.style.width=n*par.width+'px';
    for(var i=0;i<n;i++) cont[i].style.cssText='width:'+par.width+'px;height:'+par.height+'px;float:left;';
    par.height=par.height=='auto'?swt.offsetHeight:par.height;
    wrap.style.cssText='width:'+par.width+'px;height:'+par.height+'px;';
    box.style.cssText='width:'+(par.width+2)+'px;height:'+(par.height+29)+'px;';
    if(par.type=='fade'||par.type=='none'){for(var i=0;i<n;i++) cont[i].style.display='none';} 
    eval(this.switchMF(function(){
      btn[index].className='';
      if(par.type=='fade'||par.type=='none') cont[index].style.display='none';
    },function(){
      if(par.type=='slide') myFocus.slide(swt,{left:-(next*par.width)},20,'easeInOut')
      if(par.type=='fade') myFocus.fadeIn(cont[next]);
      if(par.type=='none') cont[next].style.display='';
      btn[next].className='current';
    }))
    eval(this.bind('btn','par.trigger',par.delay));
  }
})
var tabWrap=function(){myFocus.setting({
  style:'mF_tab',
  id:'tabWrap',
  trigger:'mouseover',
  type:'slide',
  auto:false,
  time:2,
  width:600,
  height:361
  });
}
var tabInner1=function(){myFocus.setting({
  style:'mF_tab',
  id:'tabInner1',
  trigger:'mouseover',
  type:'slide',
  auto:false,
  time:2,
  width:500,
  height:261
  });
}
var tabInner2=function(){myFocus.setting({
  style:'mF_tab',
  id:'tabInner2',
  trigger:'mouseover',
  type:'slide',
  auto:true,
  time:2,
  width:400,
  height:61
  });
}
if(!+[1,]){tabInner2();tabInner1();tabWrap();}
else{tabWrap();tabInner1();tabInner2();}
myFocus.setting({
  style:'mF_tab',
  id:'qqTab',
  trigger:'mouseover',
  type:'slide',
  auto:true,
  time:2,
  width:600,
  height:106
});
myFocus.setting({
  style:'mF_tab',
  id:'qqTabAuto',
  trigger:'mouseover',
  type:'fade',
  auto:false,
  time:2,
  width:600,
  height:'auto'
});
</script>
</head>
<body>
<div class="box">
 <h4>支持无限嵌套</h4>
 <div id="tabWrap">
 <div class="loading"><span>请稍候...</span></div>
 <!--载入画面-->
 <ul class="btn">
  <!--标题-->
  <li>朋友</li>
  <li>兄弟</li>
  <li>亲人</li>
  <li>情人</li>
 </ul>
 <ul class="cont">
  <!--内容-->
  <li>
  <p>朋友朋友朋友</p>
  <div id="tabInner1">
   <div class="loading"><span>请稍候...</span></div>
   <!--载入画面-->
   <ul class="btn">
   <!--标题-->
   <li>朋友</li>
   <li>兄弟</li>
   <li>亲人</li>
   <li>情人</li>
   </ul>
   <ul class="cont">
   <!--内容-->
   <li>
    <p>朋友朋友朋友</p>
    <div id="tabInner2">
    <div class="loading"><span>请稍候...</span></div>
    <!--载入画面-->
    <ul class="btn">
     <!--标题-->
     <li>朋友</li>
     <li>兄弟</li>
     <li>亲人</li>
     <li>情人</li>
    </ul>
    <ul class="cont">
     <!--内容-->
     <li>
     <p>朋友朋友朋友</p>
     </li>
     <li>
     <p>兄弟兄弟兄弟</p>
     </li>
     <li>
     <p>亲人亲人亲人</p>
     </li>
     <li>
     <p>情人情人情人</p>
     </li>
    </ul>
    </div>
   </li>
   <li>
    <p>兄弟兄弟兄弟</p>
   </li>
   <li>
    <p>亲人亲人亲人</p>
   </li>
   <li>
    <p>情人情人情人</p>
   </li>
   </ul>
  </div>
  </li>
  <li>
  <p>兄弟兄弟兄弟</p>
  </li>
  <li>
  <p>亲人亲人亲人</p>
  </li>
  <li>
  <p>情人情人情人</p>
  </li>
 </ul>
 </div>
</div>
<style>
.qqTab{margin-bottom:12px;}
.qqTab .btn li { background:#A1DEFE;border-color:#36BAF0; }
.qqTab .btn li.current { height:27px; background:#F9FEFF; }
.qqTab .cont{border-color:#36BAF0; }
.qqTab .list{float:left;overflow:hidden;text-align:center;margin:16px;margin-right:0;display:inline;}
.qqTab .list ul li{list-style:circle;}
.qqTab .left{width:150px;background:#1EB2EF;}
.qqTab .middle{width:236px;background:#D4F2FD;}
.qqTab .right{width:150px;background:#CE4982;}
</style>
<div class="box qqTab">
<h4>仿QQ今日要闻实例</h4>
<div id="qqTab">
 <div class="loading"><span>请稍候...</span></div>
 <!--载入画面-->
 <ul class="btn">
  <!--标题-->
  <li>新闻</li>
  <li>财经</li>
  <li>娱乐</li>
  <li>体育</li>
 </ul>
 <ul class="cont">
  <!--内容-->
  <li>
  <div class="list left">
    <ul>
     <li>新闻左列表</li>
    <li>新闻左列表</li>
    <li>新闻左列表</li>
    <li>新闻左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>新闻中列表</li>
    <li>新闻中列表</li>
    <li>新闻中列表</li>
    <li>新闻中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>新闻右列表</li>
    <li>新闻右列表</li>
    <li>新闻右列表</li>
    <li>新闻右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>财经左列表</li>
    <li>财经左列表</li>
    <li>财经左列表</li>
    <li>财经左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>财经中列表</li>
    <li>财经中列表</li>
    <li>财经中列表</li>
    <li>财经中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>财经右列表</li>
    <li>财经右列表</li>
    <li>财经右列表</li>
    <li>财经右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>娱乐左列表</li>
    <li>娱乐左列表</li>
    <li>娱乐左列表</li>
    <li>娱乐左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>娱乐中列表</li>
    <li>娱乐中列表</li>
    <li>娱乐中列表</li>
    <li>娱乐中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>娱乐右列表</li>
    <li>娱乐右列表</li>
    <li>娱乐右列表</li>
    <li>娱乐右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>体育左列表</li>
    <li>体育左列表</li>
    <li>体育左列表</li>
    <li>体育左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>体育中列表</li>
    <li>体育中列表</li>
    <li>体育中列表</li>
    <li>体育中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>体育右列表</li>
    <li>体育右列表</li>
    <li>体育右列表</li>
    <li>体育右列表</li>
   </ul>
  </div>
  </li>
 </ul>
 </div>
</div>
<div class="box qqTab">
<h4>支持高度自适应(auto)设置</h4>
<div id="qqTabAuto">
 <div class="loading"><span>请稍候...</span></div>
 <!--载入画面-->
 <ul class="btn">
  <!--标题-->
  <li>新闻</li>
  <li>财经</li>
  <li>娱乐</li>
  <li>体育</li>
 </ul>
 <ul class="cont">
  <!--内容-->
  <li>
  <div class="list left">
    <ul>
     <li>新闻左列表</li>
    <li>新闻左列表</li>
    <li>新闻左列表</li>
    <li>新闻左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>新闻中列表</li>
    <li>新闻中列表</li>
    <li>新闻中列表</li>
    <li>新闻中列表</li>
    <li>这是测试高度自适应</li>
    <li>这是测试高度自适应</li>
    <li>这是测试高度自适应</li>
    <li>这是测试高度自适应</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>新闻右列表</li>
    <li>新闻右列表</li>
    <li>新闻右列表</li>
    <li>新闻右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>财经左列表</li>
    <li>财经左列表</li>
    <li>财经左列表</li>
    <li>财经左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>财经中列表</li>
    <li>财经中列表</li>
    <li>财经中列表</li>
    <li>财经中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>财经右列表</li>
    <li>财经右列表</li>
    <li>财经右列表</li>
    <li>财经右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>娱乐左列表</li>
    <li>娱乐左列表</li>
    <li>娱乐左列表</li>
    <li>娱乐左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>娱乐中列表</li>
    <li>娱乐中列表</li>
    <li>娱乐中列表</li>
    <li>娱乐中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>娱乐右列表</li>
    <li>娱乐右列表</li>
    <li>娱乐右列表</li>
    <li>娱乐右列表</li>
   </ul>
  </div>
  </li>
  <li>
  <div class="list left">
    <ul>
     <li>体育左列表</li>
    <li>体育左列表</li>
    <li>体育左列表</li>
    <li>体育左列表</li>
   </ul>
  </div>
  <div class="list middle">
    <ul>
     <li>体育中列表</li>
    <li>体育中列表</li>
    <li>体育中列表</li>
    <li>体育中列表</li>
   </ul>
  </div>
  <div class="list right">
    <ul>
     <li>体育右列表</li>
    <li>体育右列表</li>
    <li>体育右列表</li>
    <li>体育右列表</li>
   </ul>
  </div>
  </li>
 </ul>
 </div>
</div>
</body>
</html>

希望本文所述对大家的JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript Timer实现代码
Feb 17 Javascript
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
JS对象与JSON格式数据相互转换
Feb 20 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
Jan 31 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
WdatePicker.js时间日期插件的使用方法
Jul 26 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
Sep 07 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 Javascript
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
JS实现仿雅虎首页快捷登录入口及导航模块效果
Sep 19 #Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 #Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
Sep 18 #Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
Sep 18 #Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 #Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
Sep 18 #Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 #Javascript
You might like
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
jcrop基本参数一览
2013/07/16 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
python执行使用shell命令方法分享
2017/11/08 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python基于event实现线程间通信控制
2020/01/13 Python
sklearn+python:线性回归案例
2020/02/24 Python
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
接口可以包含哪些成员
2012/09/30 面试题
商业计算机应用专业自荐书
2014/06/09 职场文书
启动仪式策划方案
2014/06/14 职场文书
简单租房协议书
2014/10/21 职场文书
团代会闭幕词
2015/01/28 职场文书
颐和园导游词
2015/01/30 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL