2015-09-19 2 views
0

Итак, я написал код для равномерного распределения изображений в горизонтальном div, сохраняя при этом их высоты одинаковыми, и, похоже, он работает хорошо, за исключением того, что он изменяет размер первого экземпляра класс горизонтально, а затем останавливается. Если я снова запустил код вручную в консоли инспектора хрома, он изменит размер следующего, но не на загрузку страницы.jQuery каждый цикл останавливается после первого экземпляра класса

JS выглядит следующим образом:

$('.horizontal').each(function(i, div){ 

    var heights = []; 
    var sum = 0; 
    var count = 0; 

    $(div).find('img').each(function(j, img){ 
    heights.push($(img).get(0).naturalWidth/$(img).get(0).naturalHeight); 
    }); 

    $.each(heights,function(){sum+=parseFloat(this) || 0;}); 

    $(div).find('img').each(function(k, img){ 
    $(img).css('width', heights[count] * (100/sum) + "%"); 
    count += 1; 
    }); 

}); 

Вот является JSFiddle на основе того, что было любезно предоставлено lshettyl с моим кодом (игнорировать странную HTML скобку, они просто исправить пробельный вопрос) http://jsfiddle.net/rck79c1L/1/

Хорошо, так что это работает, и, как отмечено в комментарии, проблема заключается не в том, чтобы каждый из них не зацикливался, а неправильно искажал естественную ширину/высоту изображений.

И, кажется, были зафиксированы изменения

$(document).ready(function() 

в

$(window).load(function() 
+3

'$ .each (высоты, функция (индекс, val) {sum + = parseFloat (val) || 0;});'? – Tushar

+0

почему высота [k-1], а не высоты [k] в вашем последнем каждом? – gbalduzzi

+0

Проверьте каждую собранную вами коллекцию: 'console.log ($ ('. Horizontal'). Length)', 'console.log ($ (div) .find ('img'). Length)', 'console .log (heights.length) 'и' console.log ($ (div) .find ('img')) '- Это все, что вы ожидаете? –

ответ

0

Как указано в комментариях, $.each(heights,function(){sum+=parseFloat(this) || 0;}); имеет ошибку, а также это each является излишним, поскольку сумма может быть сделано в ваш второй each.

Вам не нужно преобразовывать объект изображения в объект jQuery, а затем обратно в объект изображения, чтобы получить его свойство. Это просто бессмысленно обзорные экскурсии =>$(img).get(0).naturalWidth

$('.horizontal').each => Вам не нужно each здесь, как вы могли бы просто сделать $('.horizontal img')

Вот ваш код, упрощена с уменьшенными each петель.

var heights = []; 
var sum = 0; 
var $images = $('.horizontal img'); 

$images.each(function(i, img){ 

    var height = img.naturalWidth/img.naturalHeight || 0; 
    sum += parseFloat(height); 
    heights.push(height); 
}); 

$images.each(function(k, img) { 
    $(img).css({ 
     'width': (heights[k] * (100/sum)).toFixed(2) + "%" 
    }); 
}); 

Это a demo для вышеуказанных.

+0

Новым в этом, большая часть этого кода была вымощена из разных примеров по всему миру. Вы выглядите намного лучше и применимы ко всем экземплярам класса, но не правильно изменяете размеры изображений. В вашем примере есть два изображения одинакового размера, поэтому ширина должна быть установлена ​​равной 50%, но оба они установлены на 16,67%. Вероятно, это математическая ошибка, которую я должен заметить, как только я приступлю к изменениям. – brendan

+0

Этот код заканчивается назначением ширины, как если бы все изображения на странице находились в одной строке. В то время как предполагается, что это только изображения в каждом div в одной строке. – brendan

+0

Не очень понятно, создайте пример в скрипке, так как это поможет нам отлаживать в реальном времени. Разумеется, в этом случае вам нужно каждый через divs, а также исправлять математику в соответствии с вашими потребностями. – lshettyl

0

Так что в стороне от беспорядочного кода проблема оказалась естественнойHight/naturalWidth иногда сообщается как 0 (иногда правильно). Это привело к делению на нуль в коде, и поэтому ничего не происходит.

Изменение старт:

$(window).load(function(){... 

, кажется, исправили проблему.

Смежные вопросы