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 相关文章推荐
js或css实现滚动广告的几种方案
Jan 28 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
跟我学习javascript解决异步编程异常方案
Nov 23 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
JavaScript实现图片拖曳效果
Sep 08 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
前端插件之Bootstrap Dual Listbox使用教程
Jul 23 Javascript
Webpack按需加载打包chunk命名的方法
Sep 22 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 Javascript
理解JavaScript中的对象
Aug 25 Javascript
js实现滚动条自动滚动
Dec 13 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/03/11 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
javascript中检测变量的类型的代码
2010/12/28 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Django中提示消息messages的设置方式
2019/11/15 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
自动化系在校本科生求职信
2013/10/23 职场文书
《长相思》听课反思
2014/04/10 职场文书
市场开发计划书
2014/05/07 职场文书
项目申请汇报材料
2014/08/16 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript