原生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 相关文章推荐
JavaScript 读取元素的CSS信息的代码
Feb 07 Javascript
url 编码 js url传参中文乱码解决方案
Apr 11 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
javascript生成随机数的方法
May 16 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
VScode格式化ESlint方法(最全最好用方法)
Sep 10 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
vue中的计算属性和侦听属性
Nov 06 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
jquery中append()与appendto()用法分析
2014/11/14 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
python实现K最近邻算法
2018/01/29 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
python的移位操作实现详解
2019/08/21 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
英国电器零售商:PRC Direct
2018/06/21 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
网站域名和主机:Domain.com
2019/04/01 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
环境科学专业研究生求职信
2013/10/02 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
企业党员个人自我评价
2014/09/20 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
酒店前台辞职书
2015/02/26 职场文书