Лучше всего сначала загрузить изображение в память, а затем, когда оно загрузится, получить реальную высоту и ширину, использовать эту информацию - URL, высоту и ширину - для определения соответствующих размеров.Обратите внимание, что это не является надежной защитой, поскольку кеширование может испортить его.
Обратите внимание, что вы можете обобщить приведенное ниже, чтобы включить максимальные размеры в саму функцию, но я думаю, что она довольно легко адаптируется:
// Example: replaceImage($("img#someID"), "http://example.com/logo.png");
var MAX_HEIGHT = 80;
var MAX_WIDTH = 80;
function keepAspectRatio(temp, $target, url) {
// Get height and width once loaded
var realHeight = temp.height;
var realWidth = temp.width;
// Get how much to divide by (1 if image fits in dimensions)
// Get rid of ", 1" if you just want everything to be either
// MAX_HEIGHT tall or MAX_WIDTH wide
var factor = Math.max(realHeight/MAX_HEIGHT, realWidth/MAX_WIDTH, 1);
realHeight /= factor;
realWidth /= factor;
// Set the target image's source, height and width
$target.attr("src", url).css({height: realHeight, width: realWidth});
}
function replaceImage($target, url) {
$("<img>").load(function() {
keepAspectRatio(this, $target, url);
}).attr("src", url);
}
Пример jsFiddle
РЕДАКТИРОВАТЬ
Поменялись местами attr
и load
согласно комментарию ниже.Я не собираюсь сходить с ума от оптимизации за ее пределами, поскольку то, что мы действительно сделали бы, если бы хотели, чтобы все было идеально, - это предварительно загрузить все, получить его реальные размеры и использовать эту информацию каждый раз, когда мы меняем исходное изображение.