2013-12-11 65 views
0

我是http://unslider.com幻燈片的巨大粉絲。這很好,但它扭曲的圖像比例,以適應容器內部調整jquery保持幻燈片中的圖像比例

有誰知道如何調整標準的jquery,以達到圖像保持其比例,但仍然完全填充容器的結果?

目前unslider.js看起來是這樣的:

(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', 
      width: _.max[0], 
      height: this.items.first().outerHeight() 
     }); 

     // Set the relative widths 
     this.ul.css({width: (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); 

回答

0

我會成立使圖像容器一個div,並設置像這樣的背景圖片:

background  : transparent url(http://img/here.jpg) no-repeat center center; 
background-size : cover; 

這保留了相同的比例,但提供最佳中心偏置剪輯。要更改背景圖片,只需更改屬性:

$myJqImg.css('background-image', 'http:///new/img/here.jpg'); 

您可以創建一個圖像對象來檢查原始圖像屬性。這將預載圖像,所以它通常不會浪費資源:

var myImg = new Image(); 
myImg.src = 'http://your/url/here.jpg'; 
myImg.onload(function(){ 
    width_px = myImg.naturalWidth; 
    height_px = myImg.naturalHeight; 
    // use to reset size of $myJqImg within desired limits 
}; 

希望有所幫助!

0

對此深表歉意,但發生了什麼事情是,你的圖像寬度設置爲100%在CSS的某處,只需將以下內容添加到您的CSS,然後設置。

img { 
    max-width: 100%; 
    height: auto; 
} 

或者對於所有這樣的對象可選地如下。

embed, 
iframe, 
object, 
img { 
    max-width: 100%; 
    height: auto; 
}