原生js与jQuery实现简单的tab切换特效对比


Posted in Javascript onJuly 30, 2015

tab页签通常适用于空间有限而内容较多同时兼顾页面美观度不给用户一种信息过量视觉疲劳的情形。使用面非常广,下面我们用两种方法简单实现之。

首先,构建页面元素。页签的可点击部分我们通常用列表来承载,包括ul和ol,我们这里让页签呈横向分布,所以需要使之向左浮动。而页签内容部分使用div承载即可。另外,我们需要对具有共性的元素统一控制样式和行为,所以就有了下面的dom结构:

<div id="main">
      <ul id="tabbar" class="cl">
        <li class="t1">t1</li>
        <li class="def">t2</li>
        <li class="def">t3</li>
        <li class="def">t4</li>
        <li class="def">t5</li>
      </ul>
      <div id="content">
        <div class="cont t1">Hi !</div>
        <div class="cont t2">I Like You!</div>
        <div class="cont t3">Hello World!</div>
        <div class="cont t4">How Are You?</div>
        <div class="cont t5">I'm fine ,and you?</div>
      </div>
 </div>

ul左浮动以后,为了清除浮动对后续元素的影响,所以通过after伪类设置clear属性,同时兼顾ie低版本加入zoom触发ie haslayout。所以就有了下面的样式:

html,body,div,ul,li{margin:0; padding:0; }

.cl{zoom:1;}
.cl:after{display:block; height:0; clear:both; visibility:hidden; overflow:hidden; content:'.';}
ul{list-style:none;}
    
body{padding-top:100px; background:#eee; font-family:Microsoft YaHei, Arial, Helvetica, sans-serif;}
#main{margin:0 auto; width:800px;}
#main #tabbar{}
#main #tabbar li,#main #content .cont{text-align:center; color:#fff;}
#main #tabbar li{padding:0 20px; height:35px; line-height:35px; font-size:14px; cursor:pointer; float:left;}
#main #content{height:350px; overflow:hidden; position:relative;}
#main #content .cont{width:100%; height:350px; line-height:350px; font-size:48px; z-index:0; position:absolute;}

#main #tabbar li.def{color:#333; background:#fff;}
#main #tabbar li.t1,#main #content .cont.t1{color:#fff; background:#4e6b9c;}
#main #tabbar li.t2,#main #content .cont.t2{color:#fff; background:#c52946;}
#main #tabbar li.t3,#main #content .cont.t3{color:#fff; background:#33a6ff;}
#main #tabbar li.t4,#main #content .cont.t4{color:#fff; background:#ffab4e;}
#main #tabbar li.t5,#main #content .cont.t5{color:#fff; background:#64bccc;}

html部分大致如此。

采用原生js实现时,我们这里主要对每个li分别绑定点击事件,通过点击使当前内容页显示,其他内容页隐藏,显隐的过程通过定时器不断增减内容的透明度直至完全隐藏或显示。

window.onload = function(){
  var tabs = document.getElementById("tabbar").getElementsByTagName("li");
  var cont = document.getElementById("content").getElementsByTagName("div");
  var len = cont.length;
  var flag = true;
  
  var fade = function(elem, callback, type){
    type || (type = "in");
    var px, timer;
    
    if(type == "in")
    {
      px = 0;
      timer = setInterval(function(){
        px += 3;
        if(px <= 100)
        {
          elem.style.opacity ? (elem.style.opacity = (px / 100)) : (elem.style["filter"] = "alpha(opacity=" + px + ")");
        }
        else
        {
          clearInterval(timer);
          elem.style.opacity ? (elem.style.opacity = 1) : (elem.style["filter"] = "alpha(opacity=100)");
          callback && callback(elem);
        }
      },10);
    }
    else
    {
      px = 100;
      timer = setInterval(function(){
        px -= 3;
        if(px >= 0)
        {
          document.addEventListener ? (elem.style.opacity = (px / 100)) : (elem.style["filter"] = "alpha(opacity=" + px + ")");
        }
        else
        {
          clearInterval(timer);
          elem.style.opacity ? (elem.style.opacity = 0) : (elem.style["filter"] = "alpha(opacity=0)");
          callback && callback(elem);
        }
      },10);
    }
  }
  
  for(var i = 0; i < len; i++)
  {
    cont[i].style.zIndex = len - i;
    tabs[i].index = cont[i].index = i;
    tabs[i].onclick = function(){
      if(flag)
      {
        flag = false;
        cont[this.index].style.display = "block";
        fade(cont[this.index]);
        for(var i = 0; i < len; i++)
        {
          tabs[i].className = "def";
          if(tabs[i].index != this.index)
          {
            fade
            (
              cont[i],
              function(elem)
              {
                elem.style.display = "none";
                elem.className = "cont t" + (elem.index + 1);
                flag = true;
              },
              "out"
            );
          }
        }
        this.className = "t" + (this.index + 1);
      }
    }
  }
};

由上可见,其实使用原生js操作dom还是比较麻烦的,不然“write less,do more”的jQuery也不会诞生。下面用jQuery简单实现:

$(function(){
    var tabs = $("#tabbar li");
    var cont = $("#content .cont");
    var len = cont.length;
    
    cont.each(function(inx, elem){$(elem).css("z-index", len - inx);}).andSelf().hide().andSelf().eq(1).show();
    
    tabs.click(function(){
      var inx = tabs.index(this);
      tabs.removeAttr("class").addClass("def").andSelf().eq(inx + 1).addClass("t" + (inx + 1));
      cont.fadeOut(300).not(this).andSelf().eq(inx).fadeIn(300);
    });
  }
);

这个例子比较简单,但却很实用,当然实际工作中我们一般不会这样去写,我们通常会把以此为基础去封装一个可重用的控件,但基本思想不变。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
Feb 03 Javascript
js跑马灯代码(自写)
Apr 17 Javascript
Extjs4 类的定义和扩展实例
Jun 28 Javascript
中止javascript执行的方法
Feb 14 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
原生js实现弹出层登录拖拽功能
Dec 05 Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 Javascript
利用Ionic2 + angular4实现一个地区选择组件
Jul 27 Javascript
详解使用create-react-app快速构建React开发环境
May 16 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
May 27 Javascript
ES6对象操作实例详解
May 23 Javascript
Nuxt 项目性能优化调研分析
Nov 07 Javascript
文字垂直滚动之javascript代码
Jul 29 #Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 #Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 #Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 #Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
Jul 29 #Javascript
浅谈JavaScript的Polymer框架中的事件绑定
Jul 29 #Javascript
探讨JavaScript中的Rest参数和参数默认值
Jul 29 #Javascript
You might like
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
Jquery中删除元素的实现代码
2011/12/29 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
理解javascript回调函数
2014/12/28 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
深入理解Node内建模块和对象
2019/03/12 Javascript
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
如何在Python对Excel进行读取
2020/06/04 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
python编程的核心知识点总结
2021/02/08 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
2014年科技工作总结
2014/11/26 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
承诺函范文
2015/01/21 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
Nginx反向代理学习实例教程
2021/10/24 Servers