基于jQuery的可以控制左右滚动及自动滚动效果的代码


Posted in Javascript onJuly 25, 2010

分享一个控制左右滚动及自动滚动的样例, 昨晚花了两个多小时, 忍受着悍蚊的叮咬, 汗水的侵袭, 一行行的敲出来的血汗代码. 哈哈.
封装了两种模式: 点击滚动版本DEMO 自动滚动版本DEMO,源码中有详细注释.
思路:
点击滚动模式下,是为点击(向前/向后/数字)添加click事件,通过控制展示区块left值实现切换.
1.向前(左):当在第一个版面时,滚动到最后一个页面,否则,累加left值,向前滚动;
2.向后(右):当在最后一个版面时,滚动到第一个页面,否则,累减left值,向后滚动;
3.数字点击:利用index(…)获取当前点击在数字列表中的索引值, 然后索引值为倍数为外围宽度负值.即可达到切换.
核心代码:

//@Mr.Think***向前滚动 
$pre.click(function(){ 
if (!$showbox.is(':animated')) { //判断展示区是否动画 
if ($cur == 1) { //在第一个版面时,再向前滚动到最后一个版面 
$showbox.animate({ 
left: '-=' + $w * ($pages - 1) 
}, 500); //改变left值,切换显示版面,500(ms)为滚动时间,下同 
$cur = $pages; //初始化版面为最后一个版面 
} 
else { 
$showbox.animate({ 
left: '+=' + $w 
}, 500); //改变left值,切换显示版面 
$cur--; //版面累减 
} 
$num.eq($cur - 1).addClass('numcur').siblings().removeClass('numcur'); //为对应的版面数字加上高亮样式,并移除同级元素的高亮样式 
} 
}); 
//@Mr.Think***向后滚动 
$next.click(function(){ 
if (!$showbox.is(':animated')) { //判断展示区是否动画 
if ($cur == $pages) { //在最后一个版面时,再向后滚动到第一个版面 
$showbox.animate({ 
left: 0 
}, 500); //改变left值,切换显示版面,500(ms)为滚动时间,下同 
$cur = 1; //初始化版面为第一个版面 
} 
else { 
$showbox.animate({ 
left: '-=' + $w 
}, 500);//改变left值,切换显示版面 
$cur++; //版面数累加 
} 
$num.eq($cur - 1).addClass('numcur').siblings().removeClass('numcur'); //为对应的版面数字加上高亮样式,并移除同级元素的高亮样式 
} 
}); 
//@Mr.Think***数字点击事件 
$num.click(function(){ 
if (!$showbox.is(':animated')) { //判断展示区是否动画 
var $index = $num.index(this); //索引出当前点击在列表中的位置值 
$showbox.animate({ 
left: '-' + ($w * $index) 
}, 500); //改变left值,切换显示版面,500(ms)为滚动时间 
$cur = $index + 1; //初始化版面值,这一句可避免当滚动到第三版时,点击向后按钮,出面空白版.index()取值是从0开始的,故加1 
$(this).addClass('numcur').siblings().removeClass('numcur'); //为当前点击加上高亮样式,并移除同级元素的高亮样式 
} 
});

自动滚动模式是基于点击滚动模式加强的,无非是添加了自动滚动事件,以及当鼠标划上时清除动画事件.
这里要说明一点.DEMO演示中,为向前/向后/数字/区域都添加了当鼠标划过时都添加了清除动画事件.但是,如果你的页面中,这几个需要添加清除动画事件的都在同一个区域内,完全可以用trigger(…)模拟实现自动滚动.
还有一点,自动滚动中是用setTimeout(“fun”,interval)实现,而不用setInterval(“fun”,interval)实现. 原因在于,setInterval是在间隔时间后重复执行传入的函数,而setTimeout只在间隔时间后执行一次函数传入函数,这样即可避免第二次鼠标划入停止动画区域时不能清除动画.
核心代码:
...... 
//@Mr.Think***调用自动滚动 
autoSlide(); 
...... 
//@Mr.Think***停止滚动 
clearFun($showbox); 
clearFun($pre); 
clearFun($next); 
clearFun($num); 
//@Mr.Think***事件划入时停止自动滚动 
function clearFun(elem){ 
elem.hover(function(){ 
clearAuto(); 
}, function(){ 
autoSlide(); 
}); 
} 
//@Mr.Think***自动滚动 
function autoSlide(){ 
$next.trigger('click'); 
$autoFun = setTimeout(autoSlide, 3000);//此处不可使用setInterval,setInterval是重复执行传入函数,这会引起第二次划入时停止失效 
} 
//@Mr.Think***清除自动滚动 
function clearAuto(){ 
clearTimeout($autoFun); 
}

更详细代码分析,请查看源码,写有详细的注释.
代码打包下载
Javascript 相关文章推荐
Jquery submit()无法提交问题
Apr 21 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
实例详解JSON取值(key是中文或者数字)方式
Aug 24 Javascript
原生JS实现Ajax跨域请求flask响应内容
Oct 24 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
vue中如何使用ztree
Feb 06 Javascript
select标签设置默认选中的选项方法
Mar 02 Javascript
解决vue中post方式提交数据后台无法接收的问题
Aug 11 Javascript
vue-cli配置flexible过程详解
Jul 04 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
用jquery实现下拉菜单效果的代码
Jul 25 #Javascript
利用腾讯的ip地址库做ip物理地址定位
Jul 24 #Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
Jul 24 #Javascript
来自qq的javascript面试题
Jul 24 #Javascript
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 #Javascript
js获取元素在浏览器中的绝对位置
Jul 24 #Javascript
几个有趣的Javascript Hack
Jul 24 #Javascript
You might like
我的论坛源代码(一)
2006/10/09 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
如何提高JDBC的性能
2013/04/30 面试题
公职人员索取回扣检举信
2014/04/04 职场文书
鉴定评语大全
2014/05/05 职场文书
毕业生面试求职信
2014/06/23 职场文书
美术学专业求职信
2014/07/23 职场文书
委托书怎样写
2014/08/30 职场文书
员工教育培训协议书
2014/09/27 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
初二数学教学反思
2016/02/17 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫