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 相关文章推荐
jquery nth-child()选择器的简单应用
Jul 10 Javascript
关于JavaScript中原型继承中的一点思考
Jul 25 Javascript
jQuery中Dom的基本操作小结
Jan 23 Javascript
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
详解JavaScript时间格式化
Dec 23 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 Javascript
vue实现随机验证码功能(完整代码)
Dec 10 Javascript
jQuery+ajax实现文件上传功能
Dec 22 jQuery
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
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
python读写ini文件示例(python读写文件)
2014/03/25 Python
linux下python抓屏实现方法
2015/05/22 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
有关Python的22个编程技巧
2018/08/29 Python
python判断数字是否是超级素数幂
2018/09/27 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
python入门教程之基本算术运算符
2020/11/13 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
公司聘任书模板
2014/03/29 职场文书
英文求职信范文
2014/05/23 职场文书
松材线虫病防治方案
2014/06/15 职场文书
道德与公民自我评价
2015/03/09 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers