[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 ...
随机推荐
- **python实现的单例模式
设计模式中,最简单的一个就是 “单例模式”. 所谓单例,是指一个类只有一个全局实例. 单例模式的使用场景: 1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉 ...
- innobackupex 备份数据搭建 MySQL Slave
简介: 数据量比较大时,使用 innobackupex 备份数据新增 MySQL Slave 节点. 安装 innobackupex 工具,我这里写过一次:http://www.cnblogs.com ...
- Spring事务管理API
- centos7 安装docker-ce ,最新版本docker,docker阿里云加速
直接用yum install docker -y安装的docker版本为1.12,但是docker发展很快,现在都17.06.2了.docker-ce是指docker的社区版 卸载老版本的 docke ...
- 卸载 Windows 8/8.1/10 无法常规卸载的内置应用
现在已经有一款可以卸载内置应用的软件了:http://www.thewindowsclub.com/10appsmanager-windows-10 在应用商店里下了一个计算器+,于是想把内置的计算器 ...
- 为什么要使用href=”javascript:void(0);”
为什么要使用href=”javascript:void(0);” href=”javascript:void(0);”这个的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,而void( ...
- jdk8中的StreamAPI
1.实体类 package com.zy.model; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.D ...
- java的web.xml中<url-pattern>配置[转]
<servlet-mapping> <servlet-name>downLoadFile</servlet-name> <url-pattern>*.l ...
- strlen头文件
#include <string.h> 函数strlen strsep 等等
- Greeplum 系列(二) 安装部署
Greeplum 系列(二) 安装部署 本章将介绍如何快速安装部署 Greenplum,以及 Greenplum 的一些常用命令及工具.本章不会涉及硬件选型.操作系统参数讲解.机器性能测试等高级内容, ...