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 相关文章推荐
Js中的onblur和onfocus事件应用介绍
Aug 27 Javascript
js 上下左右键控制焦点(示例代码)
Dec 14 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
jquery实现简单的表单验证
Nov 17 Javascript
JS之获取样式的简单实现方法(推荐)
Sep 13 Javascript
JavaScript数组复制详解
Feb 02 Javascript
jQuery实现大图轮播
Feb 13 Javascript
js 获取图像缩放后的实际宽高,位置等信息
Mar 07 Javascript
vue实现导航栏效果(选中状态刷新不消失)
Dec 13 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
详解单页面路由工程使用微信分享及二次分享解决方案
Feb 22 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代码包装修正版
2008/03/15 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php生成静态页面的简单示例
2014/04/17 PHP
thinkphp缓存技术详解
2014/12/09 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
写的htc的数据表格
2007/01/20 Javascript
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
python中requests小技巧
2017/05/10 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
python实现图片转字符画
2021/02/19 Python
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
医药销售求职信范文
2014/02/01 职场文书
婚礼司仪主持词
2014/03/14 职场文书
上学路上观后感
2015/06/16 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
班主任工作总结范文
2015/08/13 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL