jQuery 幻灯片插件(带缩略图功能)


Posted in Javascript onJanuary 24, 2011

应朋友的邀请,帮他公司做一个幻灯播放效果,效果如下:
jQuery 幻灯片插件(带缩略图功能)
缩略图正中间的为当前播放到的图片,两边呈发散状,逐渐缩小并降低透明度。假设当前正播放到第0张图片,则排列情况如下:

 1 4

 3

按逆时针方向转一张图后的排列情况如下:

 0 3

  2

这个只是缩略图的播放效果,缩略图轮转时,后面有对应大图跟着从右到左滚进,并且大图进入的速度要对应着缩略图轮转,整体效果如下:
jQuery 幻灯片插件(带缩略图功能)
本人考虑将缩略图轮转与大图的滚进分开两部分,缩略图轮转做为一个单独的jQuery插件,由此插件中的事件带动大图的滚进。下面先来说说缩略图的轮转插件的实现:
1、插件的参数:

this.defaults = { 
auto: false, //是否自动播放 
width: 85, //缩略图的宽度 
height: 42, //缩略图的高度 
onstart: null, //开始滚动 
onchange: null //滚动事件 
};

2、插件的事件:

onstart事件,为每次开始启动轮转时触发一次,转出的参数有:当前缩略图的jQuery对象与轮转到下一次缩略图的jQuery对象:

opt.onstart && opt.onstart(me.Images.img[curIdx].img$, me.Images.img[idx].img$);

onchange事件,为每滚动一次距离就触发一次,并且当前滚动至百分之多少的进度参数:
opt.onchange && opt.onchange(stepPercent[step]);

下面将要说到 stepPercent[step] 这个数组:

缩略图轮转采用定时不定速度的方式,即每次轮转不过时轮转一张图还是两张图,时间都是固定的,但是轮转两张图的速度要比轮转一张图速度要快,这样即使有再多的图,滚动的距离再远,也不至于要很久才能滚到。

stepPercent[step] 这个数组正是为这个设计的,每次轮转,都固定走15步,每一步轮转的距离都逐渐缩小,这样就达到了一个变速的效果,生成此数组的如下:

var stepPercent = new Array(15); //固定走15步,每步走至百分之多少的一个数列。 表示经过时间一定,速度不固定 
stepPercent[0] = 0.2; //起始20% 
stepPercent[1] = 0.2 + 0.2 * 0.81; //第二步 
for (var i = 2, total = stepPercent[1]; i < stepPercent.length; i++) { 
stepPercent[i] = total + (total - stepPercent[i - 2]) * 0.81; //初始化数列。 
total = stepPercent[i]; 
if (i == stepPercent.length - 1) 
stepPercent[i] = 1; 
}

起始第一步走20%,此后每一步都是前一步的81%,即速度每次递减19%,但是小数计算有个误差,到第15步时可能是个很接近于1,但是不是1的一个数值,所以,将第15步直接设置成1,即100%,滚动结束。

(注:这个数列是如何设计出来的呢,我是用Excel,找一个单元格填上0.2,下一格公式为上一格的0.81,然后往下多拖一点,然后将上面的累加到接近1的数值,就是要的步数了。)

这个数列如果不用JS生成,其实也可以将Excel中创建出来的数列直接定义一个数组,以后如果想要修改速度,再照做一次就行。


轮转时,缩略图的尺寸、透明度、位置等信息的计算,都采用此stepPercent数组设定好的比例因子。

关于插件其他不在赘述,请直接下载源代码查看,下面说说大图如何跟着缩略图滚动。
 3、大图滚动

大图在随着缩略图滚动时,不过滚动到第几张,表现出来的效果都是紧跟着当前大图的后面滚进,以防跳过太多张时,由于速度太快,造成眼花缭乱的感觉,所以这里这个onstart事件就派上用场了。

在onstart事件中,先将当前图移动到大图列表首位、再将目标图移动到当前图的后面,(注:要将当前图移动到大图列表首位,是因为有可能下一张在当前张的前面,当前张移到后面,滚动条位置会动)。

然后在onchange事件中,只要根据传入的进度参数,设置横滚动条的滚动距离就行了,大图的滚动就这么简单。具体JS如下:

$(function() { 
$("#div_Slide").Slide({ 
auto: true, 
width: 85, 
height: 42, 
onstart: function(curImg, nextImg) { 
var cData = curImg.attr("data"); 
var nData = nextImg.attr("data"); 
var bigCur = $("#" + cData), bigNext = $("#" + nData); 
var allBigImg = bigCur.parent().children("img"); 
var curIndex = allBigImg.index(bigCur[0]); 
var nextIndex = allBigImg.index(bigNext[0]); 
var firstImg = $(allBigImg[0]); 
if (firstImg.attr("id") != bigCur.attr("id")) 
bigCur.insertBefore(firstImg); 
$("#div_BigImg").scrollLeft(0); 
bigNext.insertAfter(bigCur); 
}, 
onchange: function(percent) { 
$("#div_BigImg").scrollLeft(1263 * percent); 
} 
}); 
var bigDiv = $("#div_BigImg"); 
var bigDivPos = bigDiv.position(); 
bigDiv.scrollLeft(0);
//初始时将滚动条滚到头,是因为我发现当滚动条不在头时,按F5刷新,滚动条不会跳到头。 
$("#div_Slide").css({ 
"top": (bigDivPos.top + bigDiv.height() - $("#div_Slide").height()) + "px", 
"left": bigDivPos.left + "px" 
}); 
});

源码下载:http://xiazai.3water.com/201101/yuanma/SlideDemo_3water.rar
在使用中发现有问题或者有可改进的地方,请留言,谢谢。
Javascript 相关文章推荐
javascript调试说明
Jun 07 Javascript
Javascript面向对象设计一 工厂模式
Dec 20 Javascript
自己写了一个展开和收起的多更能型的js效果
Mar 05 Javascript
怎么清空javascript数组
May 11 Javascript
jQuery中clearQueue()方法用法实例
Dec 29 Javascript
jquery实现的判断倒计时是否结束代码
Feb 05 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
Feb 27 Javascript
Angularjs自定义指令Directive详解
May 27 Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
element-ui上传一张图片后隐藏上传按钮功能
May 22 Javascript
axios实现文件上传并获取进度
Mar 25 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 #Javascript
11款新鲜的jQuery插件[附所有demo下载]
Jan 24 #Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 #Javascript
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 #Javascript
返回对象在当前级别中是第几个元素的实现代码
Jan 20 #Javascript
有趣的JavaScript数组长度问题代码说明
Jan 20 #Javascript
无阻塞加载脚本分析[全]
Jan 20 #Javascript
You might like
php实现文件下载代码分享
2014/08/19 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
jquery自定义表格样式
2015/11/23 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
python实现按日期归档文件
2021/01/30 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
家长对老师的感言
2014/03/11 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
大学四年个人总结
2015/03/03 职场文书
SpringBoot Http远程调用的方法
2022/08/14 Java/Android