zoukankan      html  css  js  c++  java
  • unslider.js源码

    /**
     *   Unslider by @idiot
     */
     
    (function($, f) {
        //  If there's no jQuery, Unslider can't work, so kill the operation.
        if(!$) return f;
        
        var Unslider = function() {
            //  Set up our elements
            this.el = f;
            this.items = f;
            
            //  Dimensions
            this.sizes = [];
            this.max = [0,0];
            
            //  Current inded
            this.current = 0;
            
            //  Start/stop timer
            this.interval = f;
                    
            //  Set some options
            this.opts = {
                speed: 500,
                delay: 3000, // f for no autoplay
                complete: f, // when a slide's finished
                keys: !f, // keyboard shortcuts - disable if it breaks things
                dots: f, // display ••••o• pagination
                fluid: f // is it a percentage width?,
            };
            
            //  Create a deep clone for methods where context changes
            var _ = this;
    
            this.init = function(el, opts) {
                this.el = el;
                this.ul = el.children('ul');
                this.max = [el.outerWidth(), el.outerHeight()];            
                this.items = this.ul.children('li').each(this.calculate);
                
                //  Check whether we're passing any options in to Unslider
                this.opts = $.extend(this.opts, opts);
                
                //  Set up the Unslider
                this.setup();
                
                return this;
            };
            
            //  Get the width for an element
            //  Pass a jQuery element as the context with .call(), and the index as a parameter: Unslider.calculate.call($('li:first'), 0)
            this.calculate = function(index) {
                var me = $(this),
                    width = me.outerWidth(), height = me.outerHeight();
                
                //  Add it to the sizes list
                _.sizes[index] = [width, height];
                
                //  Set the max values
                if(width > _.max[0]) _.max[0] = width;
                if(height > _.max[1]) _.max[1] = height;
            };
            
            //  Work out what methods need calling
            this.setup = function() {
                //  Set the main element
                this.el.css({
                    overflow: 'hidden',
                     _.max[0],
                    height: this.items.first().outerHeight()
                });
                
                //  Set the relative widths
                this.ul.css({ (this.items.length * 100) + '%', position: 'relative'});
                this.items.css('width', (100 / this.items.length) + '%');
                
                if(this.opts.delay !== f) {
                    this.start();
                    this.el.hover(this.stop, this.start);
                }
                
                //  Custom keyboard support
                this.opts.keys && $(document).keydown(this.keys);
                
                //  Dot pagination
                this.opts.dots && this.dots();
                
                //  Little patch for fluid-width sliders. Screw those guys.
                if(this.opts.fluid) {
                    var resize = function() {
                        _.el.css('width', Math.min(Math.round((_.el.outerWidth() / _.el.parent().outerWidth()) * 100), 100) + '%');
                    };
                    
                    resize();
                    $(window).resize(resize);
                }
                
                if(this.opts.arrows) {
                    this.el.parent().append('<p class="arrows"><span class="prev">←</span><span class="next">→</span></p>')
                        .find('.arrows span').click(function() {
                            $.isFunction(_[this.className]) && _[this.className]();
                        });
                };
                
                //  Swipe support
                if($.event.swipe) {
                    this.el.on('swipeleft', _.prev).on('swiperight', _.next);
                }
            };
            
            //  Move Unslider to a slide index
            this.move = function(index, cb) {
                //  If it's out of bounds, go to the first slide
                if(!this.items.eq(index).length) index = 0;
                if(index < 0) index = (this.items.length - 1);
                
                var target = this.items.eq(index);
                var obj = {height: target.outerHeight()};
                var speed = cb ? 5 : this.opts.speed;
                
                if(!this.ul.is(':animated')) {            
                    //  Handle those pesky dots
                    _.el.find('.dot:eq(' + index + ')').addClass('active').siblings().removeClass('active');
    
                    this.el.animate(obj, speed) && this.ul.animate($.extend({left: '-' + index + '00%'}, obj), speed, function(data) {
                        _.current = index;
                        $.isFunction(_.opts.complete) && !cb && _.opts.complete(_.el);
                    });
                }
            };
            
            //  Autoplay functionality
            this.start = function() {
                _.interval = setInterval(function() {
                    _.move(_.current + 1);
                }, _.opts.delay);
            };
            
            //  Stop autoplay
            this.stop = function() {
                _.interval = clearInterval(_.interval);
                return _;
            };
            
            //  Keypresses
            this.keys = function(e) {
                var key = e.which;
                var map = {
                    //  Prev/next
                    37: _.prev,
                    39: _.next,
                    
                    //  Esc
                    27: _.stop
                };
                
                if($.isFunction(map[key])) {
                    map[key]();
                }
            };
            
            //  Arrow navigation
            this.next = function() { return _.stop().move(_.current + 1) };
            this.prev = function() { return _.stop().move(_.current - 1) };
            
            this.dots = function() {
                //  Create the HTML
                var html = '<ol class="dots">';
                    $.each(this.items, function(index) { html += '<li class="dot' + (index < 1 ? ' active' : '') + '">' + (index + 1) + '</li>'; });
                    html += '</ol>';
                
                //  Add it to the Unslider
                this.el.addClass('has-dots').append(html).find('.dot').click(function() {
                    _.move($(this).index());
                });
            };
        };
        
        //  Create a jQuery plugin
        $.fn.unslider = function(o) {
            var len = this.length;
            
            //  Enable multiple-slider support
            return this.each(function(index) {
                //  Cache a copy of $(this), so it 
                var me = $(this);
                var instance = (new Unslider).init(me, o);
                
                //  Invoke an Unslider instance
                me.data('unslider' + (len > 1 ? '-' + (index + 1) : ''), instance);
            });
        };
    })(window.jQuery, false);
  • 相关阅读:
    Codeforces Round #337 (Div. 2) A. Pasha and Stick 数学
    Educational Codeforces Round 4 D. The Union of k-Segments 排序
    Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
    Educational Codeforces Round 4 B. HDD is Outdated Technology 暴力
    Educational Codeforces Round 4 A. The Text Splitting 水题
    Codeforces Round #290 (Div. 2) D. Fox And Jumping dp
    HDU 5601 N*M bulbs 找规律
    Codeforces Round #290 (Div. 2) C. Fox And Names dfs
    Codeforces Round #290 (Div. 2) B. Fox And Two Dots dfs
    Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
  • 原文地址:https://www.cnblogs.com/cblx/p/4200309.html
Copyright © 2011-2022 走看看