我知道这是一个非常古老的问题,但我写的答案实际上更干净,通过使用图像之间的比率而不是每个图像本身的比率使用 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)
};
}
用法
const { width, height } = getImageSize({
container: {width: 100, height: 100},
image: {width: 200, height: 50},
size: 'cover' // 'contain' | 'auto' | '100% 100%'
});
操场
如果您想了解我对系统的含义,我在jsbin
这里创建了一个(它还有一种我认为在此答案中不需要的方法,但对于通常以外的其他方法非常有用)。scale