[javascript]switchTab:仿腾讯首页Tab栏切换js插件
腾讯首页的每个新闻栏目都是一个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插件的更多相关文章
- jQuery带有定时器的tab栏切换
现在网上很多类似选项卡的切换,我们成为tab栏切换,比如下图: 新浪的tab栏切换 淘宝的tab栏切换 其中,新浪的tab栏鼠标放上去,可以快速的来回切换,但是如果采取ajax异步传输,不停去加载服务 ...
- dataTable tab栏切换时错位解决办法
做后台管理类网站肯定要写列表,首选dataTable,功能强大 最近在做一个tab栏切换时发现了一个很诡异的事情:表头错位了! 主要时因为当table被隐藏后,table的header宽度会计算错乱, ...
- tab栏切换
最简单的tab栏切换 html部分 <ul class="tab"> <li class="item">待支付(1)</li> ...
- tab栏切换制作
tab栏切换制作 先上图 要求1:默认状态,第一个选项卡被选中,展示第一个选项卡的内容 策略:第一个选项卡默认有被选中的样式,第一个选项卡对应的display: block,其他的dispaly设为n ...
- ES6面向对象实现tab栏切换效果
面向对象实现tab栏切换效果
- JS实现 Tab栏切换案例
要求:当鼠标点击上面相应的选项卡(tab),下面页面的内容也随之而改变. 结构分析: 全部的内容都放到一个大的盒子里面,盒子里面又可以分为上面和下面两个盒子. 上面的盒子放了 5个li,装着5个小的选 ...
- JavaScript实现Tab栏切换
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 京东网页上,可以看到下面这种tab栏的切换: 我们把模型抽象出来,实现一 ...
- tab栏切换的特殊效果
在实际的开发过程中,我们可能会遇到这种需求,如下图 左边是三个tab栏,右边是显示内容的div,当鼠标滑到坐标的tab上时,给它一个高亮显示,让它对应的内容在右边的div中显示出来,当鼠标移出的时候把 ...
- tab栏切换,内容为不断实时刷新数据的vue实现方法
先说一下产品需求,就是有几个tab栏,每个tab栏对应的ajax请求不一样,内容区域一样,内容为实时刷新数据,每3s需要重新请求,返回的数据在内容区域展示,每点击一次tab栏需停止其他tab栏ajax ...
随机推荐
- Arduino UNO 键盘记录器中时钟接到2口或3口,其它接口不行。马上就要放弃了。要修改例子中时钟的引脚。
- maven-resources-plugin使用
命令行中带参数指定${}变量值 <build> <resources> <resource> <directory>src/main/resources ...
- Oracle表结构转Mysql表结构
1. fnc_table_to_mysql 主体程序 create or replace function fnc_table_to_mysql ( i_owner in string, i_tabl ...
- maven创建webapp项目
新建maven项目 勾选 create a simple project 点击next 填写maven项目信息,packaging 选择war,点击Finish 创建成功后,项目结构如下 选择项目右键 ...
- 自定义javascript日历控件
Web页中的日历一般离不开表格,通常都使用表格装载指定月的日期等信息.所以,要编写JS日历,首先必须解决的问题是表格的行与列问题.列是固定的,七列,因为一周有七天.行需要动态计算,因为,每一个月的第一 ...
- Superset安装
Superset version 1.8.5 # Install superset pip install cairocffi pip install superset yum ...
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- DBArtist之Oracle入门第3步: 安装配置PL/SQL Developer
操作系统: WINDOWS 7 (64位) 数据库: Oracle 11gR2 (64位) PL/SQL Developer : PL/SQL ...
- 关于@property与@syntheszie的使用问题
写在前面:在ARC大行其道的“现代化社会”,不少人不再对“完整的“OC”抱有它应该获得的尊重,于是浮躁成了代名词~~ 在使用ARC时,大家声明变量的过程中,往往使用@property来通过编译器,隐式 ...
- 14-python登入教务网(python+bs4)
用request先得到到session对象,用其去放送请求,会自动保存cookie. 模拟有验证码的登入步骤: 1.发送请求登入页面: 2.分析验证码的地址,以及要将登入请求发往的地址(可以先输入错的 ...