基于jQuery淡入淡出可自动切换的幻灯插件(2011.01.11更新)

此插件是对10年8月20日的文章的更新, 之前的版本有诸多bug…抱着对读者负责的态度,又重写了一次.

更新内容:
1. 用户快速划过按钮时不触发鼠标事件;
2. 鼠标划入当前图片按钮时不闪烁;
3. 简化并优化代码.
使用方法就不详述了, 请参见源码及相关注释:点此查看DEMO

$.fn.iFadeSlide = function(iSet){
	/*
	 * iSet可选参数说明:
	 * iSet.field==>幻灯区域内的图片集
	 * iSet.ico==>按钮钩子
	 * iSet.high==>按钮高亮样式
	 * iSet.interval==>图片切换时间
	 * iSet.leaveTime==>不触发鼠标划入事件的最大时间值
	 * iSet.fadeInTime==>淡入时间
	 * iSet.fadeOutTime==>淡出时间
	 * 调用方式$(document).iFadeSlide({field:'...',ico:'...',...})
	 */
    iSet = $.extend({high:'high',interval:3000,leaveTime:150,fadeOutTime:400,fadeInTime:400},iSet);
    var imgField = $(iSet.field || '#slide>img');
    var icoField = $(iSet.ico || '#ico');
	var curIndex = 0;
    var slideInterval = iSet.interval || 3000;
    var hoverTime = iSet.leaveTime || 150;
    var fadeOutTime = iSet.fadeOutTime || 400;
    var fadeInTime = iSet.fadeInTime || 400;
    var icos=null, fastHoverFun = null, autoSlideFun = null, hasIcoHighCls = null, changeFun = null,max=null;;
    var icoHtml = '<ul>';
	max=imgField.size();
	//按图片传入对应的按钮
    imgField.each(function(i){
        icoHtml += '<li>' + (i + 1) + '</li>';
    });
    icoHtml += '</ul>';
    icoField.append(icoHtml);
	//淡入淡出函数
    changeFun = function(n){
        imgField.filter(':visible').fadeOut(fadeOutTime, function(){
            imgField.eq(n).fadeIn(fadeInTime)
            icos.eq(n).addClass(iSet.high).siblings().removeClass(iSet.high);
        });
    }
    icos = icoField.find('ul>li');
	//为第一个按键初始化高亮
    icos.first().addClass(iSet.high);
	//按钮鼠标划入划出事件
    icos.hover(function(){
        clearInterval(autoSlideFun);
        curIndex = icos.index(this);
        hasIcoHighName = $(this).hasClass(iSet.high);
		//setTimeout避免用户快速(无意识性划过)划过时触发事件
        fastHoverFun = setTimeout(function(){
			//鼠标划入当前图片按钮时不闪烁
            if (!hasIcoHighName) {
                changeFun(curIndex);
            }
        }, hoverTime);
    }, function(){
        clearTimeout(fastHoverFun);
		//自动切换
        autoSlideFun = setInterval(function(){
            curIndex++;
            changeFun(curIndex);
            if (curIndex ==max ) {
				changeFun(0);
                curIndex = 0;
            }
        }, slideInterval)
    }).eq(0).trigger('mouseleave');

    //当鼠标划入图片区域时停止切换
    imgField.hover(function(){
        curIndex = imgField.index(this);
        clearInterval(autoSlideFun);
    }, function(){
        icos.eq(curIndex).trigger('mouseleave');
    });
}
共有 49 条评论.

发表评论12,457 Views

  1. 我是js初学者 就只有两张图片 不想让其自动切换 单击按钮淡入淡出 这样需要怎么做?如果可以 可以放到我邮箱中吗?谢谢了!743463518@qq.com

    [回复]

  2. 请问如何实现随机显示第一第出现的图?

    [回复]

    Mr.Think 回复:

    @Aaron, 可给插件中的变量curIndex赋一个随机值。

    [回复]

  3. 插件在CHROME下面有问题不会切换的。

    [回复]

    Mr.Think 回复:

    @kiter, 一直用的是chrome,没发现此bug

    [回复]

  4. 请问是不是不可以帮图片加上链接呢?
    似乎只要加上的语法,该张图片就会读取不到,然后图片就不会变换了~
    感觉因为加上
    的语法后,变成单纯入了一张图片那样,特效完全看不出来…
    这个问题请问有办法改善吗?谢谢

    [回复]

    Mr.Think 回复:

    @Liz, 当然可以加图片,查查图片获取变量,插件中用的是#slide>img 改成#slide img或#slide>a>img试试…

    [回复]

  5. wereeagle

    2011.01.11更新这个版本图片对应的小icon有奇怪的滞后,要比对应的图片晚一点出现,请问这个能改么?另外,我也觉得没有白背景出现最好,请教怎么改代码让图片叠在一起,也就是前一个淡出的同时后一个淡入?谢谢!

    [回复]

    Mr.Think 回复:

    @wereeagle, 不太明白你的意图。

    [回复]

  6. 蜗牛漫步

    为什么这个切换的时候是白色底色跟图片切换

    有点失望,有损美观,楼主为什么不做成第一张图片快完进,第二张图片出来切换,这样白色就消失了哈

    [回复]

    Mr.Think 回复:

    @蜗牛漫步, 欢迎改进:)

    [回复]

  7. 用来用去 还是你的focus 省心 ^_^

    [回复]

  8. 好像在谷歌浏览器看不出效果!

    [回复]

    Mr.Think 回复:

    @lynn, 我常用浏览器即是Chrome…

    [回复]

  9. 非常感谢,切换时会有白色背景飘过,还有就是如何实现按钮背景的圆角化,CSS3简单实现,但IE不支持,能有什么好办法吗?

    [回复]

    Mr.Think 回复:

    @lulyin, 切换当然会有白色背景飘过,那是淡入淡出~ 圆角参考:http://mrthink.net/css-common-round-triangle/

    [回复]

  10. 您好。这个插件很好用,就是如果图片只有一张的时候会一直闪烁。。。因为刚学JS所以想讨教下原因。谢谢了。

    [回复]

    Mr.Think 回复:

    @海狸, 加个变量,保存图片个数,当小于2时,return false. 加外,你只有一张图片,为什么还要弄个切换效果呢

    [回复]

  11. 不错,求友链
    不知可否~

    [回复]

    Mr.Think 回复:

    @SEO工程师, OK,已加~

    [回复]

  12. 可以把数字的ICO 用图片标题(文字)替代么?例如 ico:’1.xxxx;2.xxx,3.xxx’ 这类的

    [回复]

    Mr.Think 回复:

    @weber, 这个我也不知道。

    [回复]

  13. 看了学习了,站长真认真,向你学习

    [回复]

  14. 我又来啦 新年快乐哈

    [回复]

    Mr.Think 回复:

    @橘子, 新年快乐~ :)

    [回复]

    橘子 回复:

    @Mr.Think, 很郁闷 插件和别的js冲突了…若放入document.ready内则
    $.fn is undefined
    [在此错误处中断] $.fn.iFadeSlide = function(iSet){
    不放入直接调用则
    提示$(document)null了..目前还在检查原因 可能和后加的js发生了冲突

    [回复]

    橘子 回复:

    @橘子, 我错了 我真的错了我居然没注意到$冲突 我真笨. 明明firebug已经提示提示$(document)null了 o(︶︿︶)o 唉

  15. 请问代码在哪里下载,谢谢

    [回复]

    Mr.Think 回复:

    @happy, 晕,怎么老有人问这种问题啊…在 样例演示页面 查看页面源代码 复制粘贴

    [回复]

  16. 网页幻灯这个代码可以的~~

    [回复]

  17. 有个小BUG,在FIREFOX

    [回复]

    Mr.Think 回复:

    @paskaa, 一会儿会重新写个,哈

    [回复]

  18. 额 个人意见 觉得思路搞复杂了 用mouseleave触发自动轮换 感觉耦合太高了 扩展不易 因此 很突出的一个用户体验就是 从右下角的标签移动到图片或者从对应图片移动到对应标签 还是会触发 fade函数 所以感觉 设置状态值就很别扭了 毕竟你的fade是与mouseleave基本绑定
    当时想了z-index 但是没有试过 呵呵 个人意见…..

    [回复]

    Mr.Think 回复:

    @游客, 非常感谢你的意见. 本插件的确存在一些问题,比如快速划过切换索引时也会触发. 因时间原因,一直没有修正问题, 月底前一定抽空重写一次.

    [回复]

  19. 非常方便的幻灯插件,感谢Mr.Think

    [回复]

  20. 感觉很复杂呀,之前看过js的好像代码还是比较少的

    [回复]

    Mr.Think 回复:

    @web前端寒风, 欢迎提供比本文实现方法更简单的思路.

    [回复]

  21. 交流一下,看Demo里图片淡入淡出不是很自然,白色背景飘过,我也有写这样的一个插件,关键在于图片要用绝对定位重叠在一起,这样在切换时会很自然

    [回复]

    Mr.Think 回复:

    @ToFishes, 你尝试改一下切换时间 ,效果会好一些. 我试了下绝对定位图片,MS没什么变化.

    [回复]

    wereeagle 回复:

    @ToFishes, @Mr.Think, 我也觉得没有白背景出现最好,请教怎么改代码让图片叠在一起,也就是前一个淡出的同时后一个淡入?谢谢!

    [回复]

    chinaz 回复:

    @wereeagle, 请问老兄 具体要怎么改可以达到这个效果

    [回复]

  22. 我觉得最好是延迟零点几秒再执行,现在把鼠标从1顺序移到5的话,那个用户体验是很差的。

    [回复]

    Mr.Think 回复:

    @ZeroZ, 呵呵. 个人觉得延迟有些不妥,有慢半拍的感觉.你可以试试为切换加一个delay(300)看效果.欢迎扩展~

    [回复]

    ZeroZ 回复:

    @Mr.Think, 我的意思是让用户在无意识的鼠标移动中,不会出发切换事件。当用户并没有想切换,只是想把鼠标移动到别的地方的时候,不小心经过了触发事件的按钮,这个时候是不是不应该切换呢?这个时间是很短的,只需要延迟很短一个时间。我知道目前市面上的这种幻灯插件很少有延迟的效果,我看到的似乎只有淘宝首页的幻灯有这个功能,但我觉得这不失为是一个比较好的用户体验。
    ps:我觉得你有必要装一个邮件回复的插件了,比如Mail To Commenter这个。

    [回复]

    Mr.Think 回复:

    @ZeroZ, 非常感谢你的意见.这的确是个值得研究的观点.晚上我会好好研究一下.另,感谢推荐的评论插件.改天会尝试安装一下.

    ZeroZ 回复:

    @Mr.Think, 刚才留言打错字了,“出发”改为“触发”,太丢人了。

    [回复]

  23. 外闻网

    每日一访。。。

    [回复]

发表评论[无需注册]

Trackbacks and Pingbacks: