【问题标题】:How to resize images proportionally keeping the aspect ratio?如何在保持纵横比的情况下按比例调整图像大小?
【发布时间】:2013-05-12 02:09:21
【问题描述】:

我有尺寸很大的图像,我想用 jQuery 缩小它们,同时保持比例受到限制,即相同的纵横比。 有人可以给我一些代码,或者解释一下逻辑吗?

(function($){
  $.fn.swipeGallery = function(options) {

    var settings = {
      'classname'  : 'appGallery',
      'autoHeight' : false,
      'height'     : '100',
      'width'      : '100',
      'background' : '#000000',
      'tolerance'  : 0.25,
      'delay'      : 300
    }

    var ratio = 0;
    var mousedown       = false;
    var mouseX          = 0;
    var imagesLength    = 0;
    var imagesCurrent   = 0;
    var xdiff           = 0;
    var containerHeight = 0;
    var containerWidth  = 0;


    function doResizeImage(listElement){
        $(listElement).css('height', containerHeight);
        $(listElement).css('width', containerWidth);
        var img = $(listElement).find('img');

        if (img.width() / containerWidth > img.height() / containerHeight){
            img.width(containerWidth);

            var top = (containerHeight - img.height())/2; 
            img.css('marginTop', top + 'ratio'); 
        }else{
            img.height(containerHeight); 
            var left = parseInt((containerWidth - img.width())/2);
            img.css('marginLeft', left + 'ratio');
        }

    }

    function init(obj, parent, imageHandler){
        if(settings.autoHeight){
           containerHeight = $(window).height();
           containerWidth  = $(window).width();
        }else{
           containerHeight = parseInt(settings.height);  
           containerWidth  = parseInt(settings.width);  
        }

        obj.find('li').each(function(){
            doResizeImage(this);
            imagesLength++;
        })

        parent.css('height', containerHeight);
        parent.css('width',  containerWidth);

        imageHandler.css('width', containerWidth);
        imageHandler.css('height', containerHeight);
        imageHandler.css('left', parent.position().left);
        imageHandler.css('top', parent.position().top);

        obj.css('width', imagesLength * containerWidth);
    }

    return this.each(function(){        

      var _this = $(this);
      if(options) { 
        $.extend(settings, options);
      }

      if(settings.autoHeight){
        containerHeight = $(window).height();
        containerWidth  = $(window).width();
      }else{
        containerHeight = parseInt(settings.height);  
        containerWidth  = parseInt(settings.width);  
      }

      _this.wrap('<div class="' + settings.classname + '"/>');

      var parent = _this.parent();
      parent.css('backgroundColor', settings.background); 

      parent.prepend('<div class="imageHandler"/>');

      var imageHandler = _this.parent().find('.imageHandler');

      init(_this, parent, imageHandler);

      $(window).resize(function(){
        init(_this, parent, imageHandler);   
      })

      imageHandler.mousedown(function(event){
        if(!this.mousedown){
            this.mousedown = true;
            this.mouseX = event.pageX;     
        }

        return false;
      });

      imageHandler.mousemove(function(event){
        if(this.mousedown){
            xdiff = event.pageX - this.mouseX;
            _this.css('left', -imagesCurrent * containerWidth + xdiff);
        }

        return false; 
      }); 

      imageHandler.mouseup(function(event){
        this.mousedown = false; 
        if(!xdiff) return false;

        var fullWidth = parseInt(settings.width);
        var halfWidth = fullWidth/2;

        if(-xdiff > halfWidth - fullWidth * settings.tolerance){
            imagesCurrent++;
            imagesCurrent = imagesCurrent >= imagesLength ? imagesLength-1 : imagesCurrent; 
            _this.animate({left: -imagesCurrent * containerWidth}, settings.delay);
        }else if(xdiff > halfWidth - fullWidth * settings.tolerance){
            imagesCurrent--;
            imagesCurrent = imagesCurrent < 0 ? 0 : imagesCurrent;
            _this.animate({left: -imagesCurrent * containerWidth}, settings.delay);  
        }else{
            _this.animate({left: -imagesCurrent * containerWidth}, settings.delay);
        }

        xdiff = 0;

        return false; 
      });

      imageHandler.mouseleave(function(event){
         imageHandler.mouseup();
      })

    });

  };
})(jQuery);

【问题讨论】:

    标签: javascript jquery gallery


    【解决方案1】:

    试试我在这里提到的这个简单的功能:https://stackoverflow.com/a/14731922/382536

    /**
    * Conserve aspect ratio of the orignal region. Useful when shrinking/enlarging
    * images to fit into a certain area.
    *
    * @param {Number} srcWidth Source area width
    * @param {Number} srcHeight Source area height
    * @param {Number} maxWidth Fittable area maximum available width
    * @param {Number} maxHeight Fittable area maximum available height
    * @return {Object} { width, heigth }
    */
    function calculateAspectRatioFit(srcWidth, srcHeight, maxWidth, maxHeight) {
    
        var ratio = Math.min(maxWidth / srcWidth, maxHeight / srcHeight);
    
        return { width: srcWidth*ratio, height: srcHeight*ratio };
    }
    

    【讨论】:

    • 这是我最近看到的最简洁的解决方案,请点赞:)
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 2021-07-21
    • 2010-12-03
    • 2013-06-26
    • 2012-04-15
    相关资源
    最近更新 更多