これは非常に古い質問ですが、私が書いた答えは、各画像自体ではなく、画像間の比率に最大値と最小値を使用することで、実際にはよりクリーンになります。
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