Skip to main content
 首页 » 编程设计

jQuery写一个淡入淡出的jq幻灯片插件

2022年07月16日48lhb25
// 幻灯片插件 
// by ldp 
; 
(function () { 
 
    // 方法集合对象 
    var slider = { 
        // 初始化函数 
        init: function (options) { 
            return this.each(function () { 
                var $this = $(this); 
                var settings = $this.data('fadeSlider'); 
                var defaults; 
 
                if (typeof settings === 'undefined') { 
                    // 未定义配置,则启用默认设置 
                    defaults = { 
                        controlBtn: '.slider_control', // 控制按钮容器 
                        controlType: 'click', // 控制按钮触发事件 
                        autoAnim: true, // 自动播放 
                        intervalTime: 4000, // 播放间隔 
                        fadeInSpeed: 'slow', // 淡入时间 
                        fadeOutSpeed: 'normal', // 淡出时间 
                        LRBtns: false, // 是否启用左右按钮控制 
                        callback: null                   // 回调函数 
                    }; 
 
                    settings = $.extend({}, defaults, options); 
 
                    $this.data('fadeSlider', settings); 
                } else { 
                    // 否则,覆盖并继承默认参数 
                    settings = $.extend({}, defaults, options); 
                } 
 
                var $slder_con = $this.find('li'); 
                var $slder_btn = $(settings.controlBtn).find('li'); 
                var ctrlBtn = $(settings.controlBtn); 
 
                function checkCtrlBtn() { 
                    if (!ctrlBtn.length) { 
                        $this.after('<ul class="slider_control"></ul>'); 
                        ctrlBtn = $('.slider_control'); 
                        checkCtrlBtn(); 
                    } else { 
                        if (!$slder_btn.length) { 
                            ctrlBtn.append('<li class="on">1</li>'); 
                        } 
                        // 检查图像个数是否和按钮相等 
                        if ($slder_con.length > $slder_btn.length) { 
 
                            for (var i = 0, len = ($slder_con.length - $slder_btn.length); i < len; i++) { 
                                $slder_btn.parent().append('<li>' + ($slder_btn.length + i) + '</li>'); 
                                $slder_btn = ctrlBtn.find('li'); 
                            } 
                        } else if ($slder_con.length < $slder_btn.length) { 
 
                            for (var j = 0, len2 = ($slder_btn.length - $slder_con.length); j < len2; j++) { 
                                $slder_btn.last().remove(); 
                                $slder_btn = ctrlBtn.find('li'); 
                            } 
                        } else { 
                            return; 
                        } 
                    } 
                } 
 
                checkCtrlBtn(); 
 
                // 构造器 
                var SliderConstructor = function (container, controller) { 
                    this.controller = controller; 
                    this.container = container; 
                    this.timeId = null; 
                    this.num = 0; 
                    this.slider_len = controller.length; 
                    this.initEvents(); 
                }; 
 
                // 公用方法 
                SliderConstructor.prototype = { 
                    initEvents: function () { 
                        var _this = this; 
 
                        this.container.hide(); 
                        this.controller.removeClass('on'); 
 
                        if (settings.LRBtns) { 
                            this.createLRBtn(); 
                        } 
                        var leftBtn = $('#leftBtn'); 
                        var rightBtn = $('#rightBtn'); 
 
                        $this.on('mouseover',function () { 
                            //停止 
                            _this.stop(); 
                        }).on('mouseout',function () { 
                                _this.autoAnim(); 
                            }).mouseleave(); 
 
                        this.controller.on(settings.controlType,function () { 
                            _this.stop(); 
                            var num = _this.controller.index(this);    //获取当前控制按钮序号 
                            //其它图片淡出后,该序号相同的图片淡入 
                            if (!_this.container.is(':animated') && !$(this).hasClass('on')) { 
                                _this.fadeAnim(num); 
                            } 
                            if (settings.autoAnim) { 
                                _this.autoAnim(); 
                            } 
                        }).eq(0).trigger(settings.controlType); 
 
                        if (settings.callback !== null) { 
                            settings.callback.apply(window, this.num); 
                        } 
                    }, 
                    /** 
                     * 淡入淡出动画 
                     * @param {Number} i 
                     */ 
                    fadeAnim: function (i) { 
                        var _this = this; 
                        _this.num = i;      // 记录到num里面,相当于全局变量 
                        // 按钮状态变更 
                        this.controller.eq(_this.num).addClass("on").siblings().removeClass("on"); 
                        // 幻灯片淡入淡出 
                        this.container.removeClass('currentImg').fadeOut(settings.fadeOutSpeed).eq(_this.num).addClass('currentImg').fadeIn(settings.fadeInSpeed); 
                    }, 
                    /** 
                     * 自动播放 
                     */ 
                    autoAnim: function () { 
                        var _this = this;   // 避免setInterval中的this指向window 
                        _this.timeId = setInterval(function () { 
                            // 循环 
                            _this.num = (_this.num === _this.slider_len - 1) ? 0 : (++_this.num); 
                            _this.fadeAnim(_this.num); 
                        }, settings.intervalTime); 
                    }, 
                    /** 
                     * 停止播放 
                     */ 
                    stop: function () { 
                        var _this = this; 
                        clearInterval(_this.timeId); 
                    }, 
                    createLRBtn: function () { 
                        var _this = this; 
                        var LRBtnStr = '<a id="leftBtn" class="slide_ctrlBtn" href="javascript:">&lt;</a><a id="rightBtn" class="slide_ctrlBtn" href="javascript:">&gt;</a>'; 
 
                        this.container.parent().parent().append($(LRBtnStr)); 
 
                        var left = $('#leftBtn'), 
                            right = $('#rightBtn'); 
                        left.on('click', function () { 
                            _this.stop(); 
                            if (!_this.container.is(':animated')) { 
                                _this.num = (_this.num === 0) ? _this.slider_len - 1 : (--_this.num); 
                                _this.fadeAnim(_this.num); 
                            } 
                            _this.autoAnim(); 
                        }); 
                        right.on('click', function () { 
                            _this.stop(); 
                            if (!_this.container.is(':animated')) { 
                                _this.num = (_this.num === _this.slider_len - 1) ? 0 : (++_this.num); 
                                _this.fadeAnim(_this.num); 
                            } 
                            _this.autoAnim(); 
                        }); 
 
                        var width = left.width(); 
                        this.container.parent().parent().on({ 
                            'mouseenter': function (e) { 
                                    left.stop(false, true).animate({ 
                                        'left': 0 
                                    }, 400); 
                                    right.stop(false, true).animate({ 
                                        'right': 0 
                                    }, 400); 
                            }, 
                            'mouseleave': function (e) { 
                                    left.stop(false, true).animate({ 
                                        'left': -width + 'px' 
                                    }, 400); 
                                    right.stop(false, true).animate({ 
                                        'right': -width + 'px' 
                                    }, 400); 
                            } 
                        }); 
 
                    } 
                }; 
 
                var fSlider = new SliderConstructor($slder_con, $slder_btn); 
            }); 
        }, 
        /** 
         * 摧毁对象 
         * @param options 
         * @return {*|jQuery} 
         */ 
        destroy: function (options) { 
            return $(this).each(function () { 
                var $this = $(this); 
                $this.removeData('fadeSlider'); 
            }); 
        } 
    }; 
    $.fn.fadeSlider = function () { 
        // 第一个参数为slider对象的属性方法 
        var method = arguments[0]; 
        var args; 
 
        if (slider[method]) { 
            // 存在属性,取出第一个后面的其他参数 
            method = slider[method]; 
            args = Array.prototype.slice.call(arguments, 1); 
        } else if (typeof method === 'object' || !method) { 
            // 如果未定义method,则默认为init 
            method = slider.init; 
        } else { 
            // 否则抛出错误 
            $.error('Method ' + method + 'does not exist on jQuery.pluginName'); 
            return this; 
        } 
        // 调用第一个参数函数,并把后面的参数传入 
        return method.apply(this, args); 
    }; 
})(jQuery); 
 
// demo 
$(function () { 
    // 网站首页 
    $('ul.slider_container').fadeSlider('init', { 
        controlBtn: 'ul.b_slider_control', 
        controlType: 'click', 
        intervalTime: 6000, 
        fadeInSpeed: 650, 
        fadeOutSpeed: 1000 
    }); 
    $('ul.inBan_container').fadeSlider('init', { 
        controlBtn: 'ol.inBan_ctrls', 
        controlType: 'click', 
        intervalTime: 5000, 
        fadeInSpeed: 450, 
        fadeOutSpeed: 600, 
        LRBtns: true 
    }); 
 
    // 新闻首页 
    $('.newsSlider_wrap').fadeSlider('init', { 
        controlBtn: '.mewsS-control', 
        controlType: 'mouseover' 
    }); 
});

本文参考链接:https://www.cnblogs.com/webFrontDev/archive/2012/12/16/2820396.html