Я пытаюсь сравнить соотношение сторон контейнера с отношением сторон к ряду изображений и добавить к изображениям портрет или пейзаж. Кроме того, я пытаюсь обнаружить очень высокие/широкие изображения (например, большие панорамы) на основе определенного допуска. У меня есть основная функциональность, работающая here (первые два изображения имеют кнопку «увеличить» в верхнем левом углу).Сохранять значения из каждого цикла и использовать в другой функции
Теперь я пытаюсь разделить функцию, поэтому, когда я изменяю размер страницы, сценарий не вычисляет отношения всех изображений снова (var i_ratio), он просто сравнивает их с новым коэффициентом контейнера (var c_ratio). Мой пример разработки - here.
Я думаю, что моя проблема, я не знаю, как:
- Убедитесь, что вторая функция запускается после первого завершения
- Передайте значения из i_ratio от первой функции к следующим
В примере dev есть консольный журнал, который показывает, что i_ratio не определена во 2-й функции, но при изменении размера окна он получает значение - не уверен, что происходит.
// Get window aspect ratio
var container = $('.main');
var c_ratio = container.width()/container.height();
var i_ratio;
function imageRatios() {
// Get original dimensions of image (IE8+)
if (this.naturalWidth) {
i_width = this.naturalWidth;
i_height = this.naturalHeight;
} else {
// Get original dimensions of image with JQuery
i_width = this.width;
i_height = this.height;
}
i_ratio = i_width/i_height;
// Don't allow images to get bigger than their original size
$(this).css('max-width', i_width).css('max-height', i_height);
}
function setClass() {
console.log('number of images: '+images.length+', i_ratio from imageRatios function: '+i_ratio);
// Add ratio classes
if (c_ratio > i_ratio) {
$(this).parent('li').removeClass('landscape').addClass('portrait');
} else {
$(this).parent('li').removeClass('portrait').addClass('landscape');
}
// Identify long/tall panoramas and add zoom button
tolerance = c_ratio/i_ratio;
if (tolerance < 0.3 || tolerance > 5) {
$(this).after('<div class="zoom"></div>');
} else {
$(this).remove('.zoom');
}
// Show/hide zoomed image
var img = $(this);
$(this).next('.zoom').click(function() {
if (img.siblings('.big_image').size() > 0) {
$('.big_image').remove();
} else {
$(this).after('<div class="big_image"><img src="'+$img.attr('src')+'"></div>');
}
});
}
// Get images
var images = $('.main img');
images.each(function(i) {
if (this.complete) {
imageRatios.call(this);
setClass();
} else {
this.onload = imageRatios;
setClass();
}
});
// Update ratio class on resize
$(window).on("throttledresize", function() {
var c_ratio = container.width()/container.height();
images.each(function() {
setClass();
});
});
включают JavaScript для функций в вашем вопросе, пожалуйста – DGS
соответствующий код включен, спасибо. – daviestar
Ну, вы знаете, что вы можете передать аргументы функциям правильно? Кажется, вы используете глобальные переменные для обмена данными между функциями, что делает ваш код менее гибким и понятным. – plalx