javascript 仿QQ滑动菜单效果代码


Posted in Javascript onSeptember 03, 2010

【程序源码】

var QQ = function() { 
// 公用函数 
function T$(id) { return document.getElementById(id); } 
function T$$(root, tag) { return (root || document).getElementsByTagName(tag); } 
function $extend(des, src) { for(var p in src) { des[p] = src[p]; } return des; } 
function $each(arr, callback, thisp) { 
if (arr.forEach) {arr.forEach(callback, thisp);} 
else { for (var i = 0, len = arr.length; i < len; i++) callback.call(thisp, arr[i], i, arr);} 
} 
function currentStyle(elem, style) { 
return elem.currentStyle || document.defaultView.getComputedStyle(elem, null); 
} 
// 缓动类 
var Tween = { 
Quart: { 
easeOut: function(t,b,c,d){ 
return -c * ((t=t/d-1)*t*t*t - 1) + b; 
} 
}, 
Back: { 
easeOut: function(t,b,c,d,s){ 
if (s == undefined) s = 1.70158; 
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; 
} 
}, 
Bounce: { 
easeOut: function(t,b,c,d){ 
if ((t/=d) < (1/2.75)) { 
return c*(7.5625*t*t) + b; 
} else if (t < (2/2.75)) { 
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; 
} else if (t < (2.5/2.75)) { 
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; 
} else { 
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; 
} 
} 
} 
} // 主类构造函数 
var scrollTrans = function(cid, sid, count, config) { 
var self = this; 
if (!(self instanceof scrollTrans)) { 
return new scrollTrans(cid, sid, count, config); 
} 
self.container = T$(cid); 
self.scroller = T$(sid); 
if (!(self.container || self.scroller)) { 
return; 
} 
self.config = $extend(defaultConfig, config || {}); 
self.index = 0; 
self.timer = null; 
self.count = count; 
self.step = self.scroller.offsetWidth / count; 
}; 
// 默认配置 
var defaultConfig = { 
trigger: 1, // 触发方式1:click other: mouseover 
auto: true, // 是否自动切换 
tween: Tween.Quart.easeOut, // 默认缓动类 
Time: 10, // 滑动延时 
duration: 50, // 切换时间 
pause: 3000, // 停顿时间 
start: function() {}, // 切换开始执行函数 
end: function() {} // 切换结束执行函数 
}; 
scrollTrans.prototype = { 
constructor: scrollTrans, 
transform: function(index) { 
var self = this; 
index == undefined && (index = self.index); 
index < 0 && (index = self.count - 1) || index >= self.count && (index = 0); 
self.time = 0; 
self.target = -Math.abs(self.step) * (self.index = index); 
self.begin = parseInt(currentStyle(self.scroller)['left']); 
self.change = self.target - self.begin; 
self.duration = self.config.duration; 
self.start(); 
self.run(); 
}, 
run: function() { 
var self = this; 
clearTimeout(self.timer); 
if (self.change && self.time < self.duration) { 
self.moveTo(Math.round(self.config.tween(self.time++, self.begin, self.change, self.duration))); 
self.timer = setTimeout(function() {self.run()}, self.config.Time); 
} else { 
self.moveTo(self.target); 
self.config.auto && (self.timer = setTimeout(function() {self.next()}, self.config.pause)); 
} 
}, 
moveTo: function(i) { 
this.scroller.style.left = i + 'px'; 
}, 
next: function() { 
this.transform(++this.index); 
} 
}; 
return { 
scroll: function(cid, sid, count, config) { 
window.onload = function() { 
var frag = document.createDocumentFragment(), 
nums = []; 
for (var i = 0; i < count; i++) { 
var li = document.createElement('li'); 
(nums[i] = frag.appendChild(document.createElement('li'))).innerHTML = i + 1; 
} 
T$('page').appendChild(frag); 
// 调用主类 
var st = scrollTrans(cid, sid, count, config); 
$each(nums, function(o, i) { 
o[st.config.trigger == 1 ? 'onclick' : 'onmouseover'] = function() { o.className = 'on'; st.transform(i); } 
o.onmouseout = function() { o.className = ''; st.transform();} 
}); 
st.start = function() { 
$each(nums, function(o, i) { 
o.className = st.index == i ? 'on' : ''; 
}); 
}; 
st.transform(); 
} 
} 
} 
}(); 
QQ.scroll('container', 'scroller', 5, {trigger: 0});

【参数说明】
var defaultConfig = { 
trigger: 1, // 触发方式 1:click 其余: mouseover 
auto: true, // 是否自动切换 
tween: Tween.Quart.easeOut, // 默认缓动类 
Time: 10, // 滑动延时 
duration: 50, // 切换时间 
pause: 3000, // 停顿时间 
start: function() {}, // 切换开始执行函数 
end: function() {} // 切换结束执行函数 
};

【使用方法】
QQ.scroll('container' /*外部容器ID*/, 'scroller'/*滑动容器ID*/, 5/*切换图片数目*/, {trigger: 0} /*默认配置*/);

【源码下载】
slider
Javascript 相关文章推荐
checkbox 复选框不能为空
Jul 11 Javascript
js修改地址栏URL参数解决url参数问题
Dec 15 Javascript
js取得url地址参数实例
Feb 22 Javascript
jQuery弹出框代码封装DialogHelper
Jan 30 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
Webpack 实现 AngularJS 的延迟加载
Mar 02 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
Jun 03 Javascript
Ionic项目中Native Camera的使用方法
Jun 07 Javascript
jQuery简单实现对数组去重及排序操作实例
Oct 31 jQuery
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
微信小程序实现省市区三级地址选择
Jun 21 Javascript
JavaScript实现复选框全选和取消全选
Nov 20 Javascript
原生javascript实现图片轮播效果代码
Sep 03 #Javascript
IE6不能修改NAME问题的解决方法
Sep 03 #Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 #Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 03 #Javascript
Dojo 学习要点
Sep 03 #Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
Sep 03 #Javascript
基于JQuery的6个Tab选项卡插件
Sep 03 #Javascript
You might like
PHP 编程的 5个良好习惯
2009/02/20 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
js 替换
2008/02/19 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
微信小程序 扎金花简单实例
2017/02/21 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
详解Django中的过滤器
2015/07/16 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
英国奢侈品牌时尚购物平台:Farfetch(支持中文)
2020/02/18 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
建材投资建议书
2014/05/16 职场文书
党员个人公开承诺书
2014/08/29 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
MySQL 视图(View)原理解析
2021/05/19 MySQL
Python anaconda安装库命令详解
2021/10/16 Python