zoukankan      html  css  js  c++  java
  • 写了个淡入淡出的jq幻灯片插件

    // 幻灯片插件
    // 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'
        });
    });
  • 相关阅读:
    Spring事务原理一探
    浅谈AI视频技术超分辨率
    网易云信独家技术支持,壹点灵领跑心理服务行业
    音视频技术“塔尖”之争,网易云信如何C位出道?
    浅析为何使用融合CDN是大趋势?
    谈谈接入各种第三方推送平台的技术方案和一点经验
    编解码器之战:AV1、HEVC、VP9和VVC
    三年深入探索,网易云信让在线医疗做到技术“在线”
    5分钟学会Java9-Java11的七大新特性
    网易云信案例简析:锤科情怀缩影,子弹短信路在何方?
  • 原文地址:https://www.cnblogs.com/webFrontDev/p/2820396.html
Copyright © 2011-2022 走看看