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 相关文章推荐
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
最常用的12种设计模式小结
Aug 09 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
浅析javascript的间隔调用和延时调用
Nov 12 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
May 25 Javascript
AngularJS基础 ng-keydown 指令简单示例
Aug 02 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
Jul 27 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
Vue编程式跳转的实例代码详解
Jul 10 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 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操作JSON格式数据的实现代码
2011/12/24 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
详解a++和++a的区别
2017/08/30 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python re模块介绍
2014/11/30 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
Python中一般处理中文的几种方法
2019/03/06 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
python 制作简单的音乐播放器
2020/11/25 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
合作意向书模板
2014/03/31 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript