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 相关文章推荐
自动检查并替换文本框内的字符
Jun 30 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
Oct 20 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
Nov 17 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
Apr 29 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
理解javascript中的with关键字
Feb 15 Javascript
Bootstrap3学习笔记(三)之表格
May 20 Javascript
BootStrap Tooltip插件源码解析
Dec 27 Javascript
微信小程序 页面跳转如何实现传值
Apr 05 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
微信小程序实现带参数的分享功能(两种方法)
May 17 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
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线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
js控制frameSet示例
2013/09/10 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python中bisect模块用法实例
2014/09/25 Python
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
工厂见习报告范文
2014/10/31 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
mysql sock 文件解析及作用讲解
2022/07/15 MySQL