原生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 相关文章推荐
JS保存和删除cookie操作 判断cookie是否存在
Nov 13 Javascript
浅谈jQuery中的事件
Mar 23 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
Jun 12 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
微信小程序下拉框功能的实例代码
Nov 06 Javascript
React 使用Hooks简化受控组件的状态绑定
Mar 18 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 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引用(&amp;)
2014/09/04 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
对Python实现累加函数的方法详解
2019/01/23 Python
python绘制规则网络图形实例
2019/12/09 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python中的整除和取模实例
2020/06/03 Python
Python代码需要缩进吗
2020/07/01 Python
python Gabor滤波器讲解
2020/10/26 Python
Web前端页面跳转并取到值
2017/04/24 HTML / CSS
HTML5实现视频弹幕功能
2019/08/09 HTML / CSS
开放系统互连参考模型
2016/06/29 面试题
实习教师自我鉴定
2013/09/27 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
八一慰问活动方案
2014/02/07 职场文书
作文评语集锦大全
2014/04/23 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
2014年度工作总结报告
2014/12/15 职场文书
2016年会开场白台词
2015/06/01 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS