我知道这是一个非常古老的问题,但我写的答案实际上更简洁,通过在图像之间的比率上使用 max 和 mins 而不是每个图像本身:
var originalRatios = {
width: containerWidth / imageNaturalWidth,
height: containerHeight / imageNaturalHeight
};
// formula for cover:
var coverRatio = Math.max(originalRatios.width, originalRatios.height);
// result:
var newImageWidth = imageNaturalWidth * coverRatio;
var newImageHeight = imageNaturalHeight * coverRatio;
我喜欢这种方法,因为它非常系统化——也许用词不当——。我的意思是你可以去掉if 语句,让它以更“数学公式”的方式工作(输入=输出,如果有意义的话):
var ratios = {
cover: function(wRatio, hRatio) {
return Math.max(wRatio, hRatio);
},
contain: function(wRatio, hRatio) {
return Math.min(wRatio, hRatio);
},
// original size
"auto": function() {
return 1;
},
// stretch
"100% 100%": function(wRatio, hRatio) {
return { width:wRatio, height:hRatio };
}
};
function getImageSize(options) {
if(!ratios[options.size]) {
throw new Error(options.size + " not found in ratios");
}
var r = ratios[options.size](
options.container.width / options.image.width,
options.container.height / options.image.height
);
return {
width: options.image.width * (r.width || r),
height: options.image.height * (r.height || r)
};
}
我创建了一个 jsbin here 如果你想看看我对 systematic 的意思(它还有一个我认为在这个答案中不需要的 scale 方法但对平常以外的东西非常有用)。