[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 ...
随机推荐
- CSS——操作css文件
//动态 css文件内容. 修改鼠标经过时行.单元格的背景颜色 function header_rowOrcell_over(divGrid) { var gridopts = divGrid.dat ...
- 8.Redis 数据备份与恢复
转自:http://www.runoob.com/redis/redis-tutorial.html Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下 ...
- Dreamweaver 中文乱码
定义当前页面的编码属性 Ctrl+j 标题/编码 将编码改成UTF8即可 PhpStorm FILE->Setting->File Encoding->将U ...
- 转:devise使用
1.gem install devise 2.在gemfile中添加 gem 'devise' 3.bundle install 4.执行 rails generate devise:install ...
- <转>Linux环境进程间通信(五): 共享内存(上)
http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...
- C#中打开设计视图时报"未将对象引用设置到对象的实例"
通常情况下,若是你将用户控件写好了放入窗体中,若是有不合理的代码,则会弹出错误提示框,不让你放.若是你之前只是随便加了一个用户控件,并且没有什么问题,但后来你又把控件改坏掉了,那么你打开就会报错(在窗 ...
- jquery offset positon 获取位置不准的解决方法
问题: 本地开发时,由于使用了图片,而且使用了offset().top涉及到图片所在的div距离计算的部分,本地开发一切都没问题:但是部署到服务器上时却出现布局错乱,经过排查发现总是少了一个图片高度的 ...
- sql设置字段默认值
alter table 表名 modify 字段名 default 默认值;
- 750. Number Of Corner Rectangles四周是点的矩形个数
[抄题]: Given a grid where each entry is only 0 or 1, find the number of corner rectangles. A corner r ...
- servicestack.redis工具类
using System;using System.Collections.Generic;using System.Linq;using ServiceStack.Redis;using Servi ...