腾讯首页的每个新闻栏目都是一个tab选项卡切换,属于延迟动作的:鼠标hover上去之后200毫秒才会切换,防止了因为浏览滑动导致的页面上选项卡的频繁切换。仿照这样的效果,自己写了一个js插件,实现了低版本浏览器IE7-8的兼容,没有用库,纯js写的。

  难点的话就是如何实现延时动作,我想到的办法是用setTimeOut函数,期间要遍历Tabhead中的a节点进行绑定事件,写了一个很逗的闭包向setTimeOut传入循环变量。

  核心js部分代码如下:

 /*
* 仿Tencent 选项卡延迟切换
* 参数:TabID,Tab标题的选中class,延迟时间
*
*/ //为数组对象添加判断子元素方法
Object.prototype.isIn = function(item){
var i = this.length;
while (i--) {
if ( item === this[i]) {
return true;
}
}
return false;
};
Object.prototype.getPos = function(item){
var i = this.length;
while (i--) {
if ( item === this[i]) {
return i;
}
}
return -1;
};
//TabBar对象
var TabBar = function(eId,className,delayTime){
//防止漏写new导致bug js设计模式里推荐 感觉比较鸡肋
if(!(this instanceof TabBar)){
return new TabBar(eId,className,delayTime);
}
//el:Tab组件对应的元素
//showNum:当前显示的Tab子栏序号,从0开始
//selectClass:Tab标题栏选中class样式
//delayTime: 鼠标延迟时间
//hd,sub数组:tab头元素和tabSub元素数组
this.el = document.getElementById(eId||"tab");
this.showNum = 0;
this.selectClass = className || "selected";
this.delayTime = delayTime || 200;
this.hd = this.el.getElementsByTagName("div")[0].getElementsByTagName("a");
this.sub = this.el.getElementsByTagName("div")[1].querySelectorAll(".sub_item");
//类初始化最后执行bind函数
this.bindListener();
} TabBar.prototype.show = function() {
//用于显示当前ShowNum对应的Tab项
this.sub[this.showNum].style.display ="block";
};
TabBar.prototype.hide = function() {
//用于取消显示当前ShowNum对应的Tab项
(this.sub[this.showNum]).style.display ="none";
};
TabBar.prototype.bindListener = function() {
//绑定hover事件 self局部变量传递this,addEventListener默认对象为window
var self = this;
if(this.el.addEventListener == undefined){
//兼容IE7,8
var i =0;
for( i=0;i<this.hd.length;i++){
this.hd[i].attachEvent("onmouseover",(function(pos){
return function (){
(self.hd[pos]).timer = setTimeout(function(){
self.switchTab(pos);
},self.delayTime);
}
})(i));
this.hd[i].attachEvent("onmouseout",(function(pos){
return function (){
clearTimeout( self.hd[pos].timer );
}
})(i));
}
}
else{
//非IE7,8 addEventListener绑定
this.el.addEventListener("mouseover",function(event){
if( self.hd.isIn(event.target) ){
var pos = self.hd.getPos(event.target);
(self.hd[pos]).timer = setTimeout(function(){
self.switchTab(pos);
},self.delayTime);
}
});
this.el.addEventListener("mouseout",function(event){
if( self.hd.isIn(event.target) ){
var pos = self.hd.getPos(event.target);
clearTimeout( self.hd[pos].timer );
}
});
}
};
TabBar.prototype.switchTab = function(pos){
//选项卡切换函数 参数:pos,当前Hover的子栏序号,从0开始
if( pos !== this.showNum ){
this.hd[this.showNum].className = "";
this.hd[pos].className=this.selectClass;
this.hide();
this.showNum = pos;
this.show();
}
};
//Tab实例化
var LeeTab =new TabBar("tab");

  demo地址:Tab切换演示

  恩,就是这样。

[javascript]switchTab:仿腾讯首页Tab栏切换js插件的更多相关文章

  1. jQuery带有定时器的tab栏切换

    现在网上很多类似选项卡的切换,我们成为tab栏切换,比如下图: 新浪的tab栏切换 淘宝的tab栏切换 其中,新浪的tab栏鼠标放上去,可以快速的来回切换,但是如果采取ajax异步传输,不停去加载服务 ...

  2. dataTable tab栏切换时错位解决办法

    做后台管理类网站肯定要写列表,首选dataTable,功能强大 最近在做一个tab栏切换时发现了一个很诡异的事情:表头错位了! 主要时因为当table被隐藏后,table的header宽度会计算错乱, ...

  3. tab栏切换

    最简单的tab栏切换 html部分 <ul class="tab"> <li class="item">待支付(1)</li> ...

  4. tab栏切换制作

    tab栏切换制作 先上图 要求1:默认状态,第一个选项卡被选中,展示第一个选项卡的内容 策略:第一个选项卡默认有被选中的样式,第一个选项卡对应的display: block,其他的dispaly设为n ...

  5. ES6面向对象实现tab栏切换效果

    面向对象实现tab栏切换效果

  6. JS实现 Tab栏切换案例

    要求:当鼠标点击上面相应的选项卡(tab),下面页面的内容也随之而改变. 结构分析: 全部的内容都放到一个大的盒子里面,盒子里面又可以分为上面和下面两个盒子. 上面的盒子放了 5个li,装着5个小的选 ...

  7. JavaScript实现Tab栏切换

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 京东网页上,可以看到下面这种tab栏的切换: 我们把模型抽象出来,实现一 ...

  8. tab栏切换的特殊效果

    在实际的开发过程中,我们可能会遇到这种需求,如下图 左边是三个tab栏,右边是显示内容的div,当鼠标滑到坐标的tab上时,给它一个高亮显示,让它对应的内容在右边的div中显示出来,当鼠标移出的时候把 ...

  9. tab栏切换,内容为不断实时刷新数据的vue实现方法

    先说一下产品需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,每3s需要重新请求,返回的数据在内容区域展示,每点击一次tab栏需停止其他tab栏ajax ...

随机推荐

  1. 小米手机Root 刷机

    需要备份的资料: miui系统资料:电话.短信.便签,有小米云账号wifi下自己会备份好的. 应用数据:微信.qq 聊天记录: UC浏览器收藏夹. root后, rootexplorer,选择某个文件 ...

  2. Redis实战——简单介绍

    出自:https://www.cnblogs.com/moonlightL/p/7364107.html Redis简单介绍 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能, ...

  3. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  4. 简析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue

    SynchronousQueue SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加:可以认为Sync ...

  5. 什么是web资源????

    所谓 web 资源即放在 Internet 网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源. 1. 什么是静态资源 静态资源是浏览器能够直接打开的,一个 j ...

  6. Linux重置管理员密码

    对于一些非专业的Linux运维工程师或者偶尔使用Linux系统的学习者而言,比如我,经常会碰到忘记密码的尴尬,那这时候,快速的重置密码就相当重要了.废话不多说,今天我们就一起来学习一下如何快速重置密码 ...

  7. 使用CMD命令行来对MySQL数据库执行迁移、备份、恢复

    1. 导出数据库数据   "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqldump.exe" -u root -p123abc ...

  8. [cogs2638]数列操作ψ(双标记线段树)

    题目大意:给定一个数列a,你需要支持的操作:区间and,区间or,询问区间最大值 解题关键: 1.双标记线段树,注意优先级(超时) 当涉及多重标记时,定义出标记的优先级,修改操作时用优先级高(先下放) ...

  9. Python学习笔记_使用openpyxl操作Excel,在同一个文件里复制某一个sheet

    应用场景:定制一个Excel模板文件,其中定义了一个模板Sheet,以此模板文件里的模板sheet为样例,制作报表,里面有不止一个模板样例Sheet 一.软件环境: 1.OS:Win10 64位 2. ...

  10. c++对象模型是什么,对象的内存布局和结构问题

    在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定.C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接 ...