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 相关文章推荐
基于mootools插件实现遮罩层新手引导
May 24 Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
如何利用JQuery实现从底部回到顶部的功能
Dec 27 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
Vue.js手风琴菜单组件开发实例
May 16 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
vue router使用query和params传参的使用和区别
Nov 13 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
jQuery 查找元素操作实例小结
Oct 02 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
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
php格式化电话号码的方法
2015/04/24 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python标准异常和异常处理详解
2015/02/02 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
通过python爬虫赚钱的方法
2019/01/29 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
物流专业自荐信
2014/05/23 职场文书
入党积极分子考察意见
2015/06/02 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python