Ответ 1
выглядит так, как будто мне нужен плагин под названием imagesLoaded для того, чтобы Monsry script работал правильно с хром и сафари
Похоже, что когда я пытаюсь загрузить страницу, все изображения сложены друг над другом. Но если вам нужно щелкнуть ссылку, которая приведет вас к той же странице (например, к домашней ссылке), тогда будет сдана каменная кладка. Поэтому я думаю, что кладка загружается слишком рано, например, перед тем, как jquery готовит страницу или что-то в этом роде.
Здесь мой вызов jquery:
$(document).ready(function(){
$('#image_roll_container').masonry({
itemSelector: '.box'
});
....
Вот страница, о которой идет речь:
он отлично работает в firefox и IE8.
выглядит так, как будто мне нужен плагин под названием imagesLoaded для того, чтобы Monsry script работал правильно с хром и сафари
Мне удалось исправить эту проблему следующим образом:
<script type="text/javascript">
$(document).ready(function(){
$('img').load(function(){
$(".content_photo").masonry();
});
$(".content_photo").masonry();
});
</script>
Пробовал все, что было предложено в этом потоке, ничего не получилось, а затем нашел это:
$(window).load(function(){ $('#content').masonry(); });
Хорошо работает сейчас, нашел его здесь: https://github.com/desandro/masonry/issues/35
Оригинальный автор сообщения: https://github.com/desandro
Вы правы относительно imagesLoaded. Он отлично работал в Firefox, но укладывался в Chrome/Safari.
Вот ссылка http://masonry.desandro.com/demos/images.html
код:
var $container = $('#container');
$container.imagesLoaded( function(){
$container.masonry({
itemSelector : '.box'
});
});
Недавно я столкнулся с этой проблемой. Чтобы исправить это, я использовал атрибуты ширины и высоты img. Проблема разрешилась сама.
Другой способ, если вы знаете высоту изображения, - назначить их в CSS перед загрузкой масонства, тогда макет будет быстрее, чем ждать изображений. Этот метод работает, если, например, все ваши изображения имеют одинаковый размер. Тогда ваш сайт будет по-прежнему быстро загружаться на медленных соединениях, например, на мобильных устройствах.
Я отправил немного script для альтернативного метода здесь:
http://instancia.net/loading-jquery-masonry-on-mobile/
Если вы используете этот script, отредактируйте числа, соответствующие вашим.
В Firefox и на моем iPad 2 каменная кладка работала нормально, но в хроме и сафари на OS X элементы перекрывались/укладывались на загрузку страницы и до тех пор, пока не изменилось размер окна. После копания в коде jquery.masonry.js я обнаружил, что могу вызвать изменение размера() сразу после создания кладки, чтобы все элементы правильно упорядочивались. Теперь все работает нормально.
jQuery(document).ready(function(){
var $container = $('#container');
$container.imagesLoaded(function(){
$container.masonry({
itemsSelector: '.thumbnail',
isFitWidth: true
}).resize();
});
})
все другие решения: (window).load, ширина и высота установки в CSS и атрибуты img и т.д., просто не работали для меня.
В этих браузерах необходимо, чтобы высота отображалась правильно, как говорит Дженнифер. Я использую функцию php getimagesize() для получения высоты и ширины изображений. Теперь работает отлично.
<script>
var container = document.querySelector('#masonry');
var msnry = new Masonry( container, {
itemSelector: '.item',
"columnWidth": 200,
});
$('.item img').load(function(){
var msnry = new Masonry( container, {
itemSelector: '.item',
"columnWidth": 200,
});
})
</script>
если использовать $('img'). load (function() F5 (refesh) = > ошибка
Новые методы:
$(window).on('load resize', function() {
if ($('.masonry-wrap').length) {
$('.masonry-wrap')
.css('max-width', $(window).width());
}
});
$(window).on('load', function() {
if ($('.masonry-wrap').length) {
setTimeout(function() {
$('.masonry').masonry({
columnWidth: 0,
itemSelector: '.grid-item'
});
}, 1);
}
});
<div class="masonry-wrap">
<div class="masonry">
<div class="grid-item">...</div>
<div class="grid-item">...</div>
....
</div>
</div>
Событие "load" будет запускаться для каждого изображения в DOM, это излишне. Вам необходимо обновить макет кладки при загрузке последнего изображения в DOM. Вот код:
$(document).ready(function(){
// init the masonry on document ready event;
// at this point the images are not loaded so the layout will break UNLESS you set up the correct values for the "width" and "height" attributes of the img tags
$('.content_photo').masonry();
// to make sure the layout will not break apart we update the masonry layout just after the last image from the DOM was loaded
var total_images = $('img').length;
var counter = 1;
$('img').load(function() {
if(counter == total_images) {
alert('the last image in the DOM was loaded. now we can update the masonry layout');
$('.content_photo').masonry('layout');
}
counter++;
});
});
У меня была обратная проблема, как описано: первая загрузка отлично работала в Mac OS X Safari, но изменение сетки со всеми новыми элементами заставило их всех стечь в верхнем левом углу. Кроме того, ожидание готового события и установка высоты и ширины CSS на наших элементах не исправили его.
На нашем сайте у нас есть категории данных, которые отображаются в сетке кладки, и показывается только одна категория. Пользователь может переключать категорию в любое время и запускать запрос AJAX для загрузки новых данных. В последних версиях Safari (9.1, 10) и браузерах, таких как Chrome, мы могли бы просто сделать это, изменив категорию для замены всех новых элементов:
// domData is HTML string from the server
// IMJS is our global variable that we use for globals and lookups
$("#divTemplateCategoryName").after(domData); // insert new HTML
var elementsToAdd = $(".grid-item-template-info"); //select the elements
IMJS.MasonryGrid.masonry('addItems', elementsToAdd); // tell masonry to add them
IMJS.MasonryGrid.masonry('layout'); // tell masonry to layout again
Однако в некоторых версиях Safari это не сработало, и мы должны были сделать это вместо:
// domData is HTML string from the server
// IMJS is our global variable that we use for globals and lookups
IMJS.MasonryGrid.masonry('destroy'); // destroy the grid
$("#divTemplateCategoryName").after(domData); // insert new HTML
InitMasonry(); // re-do our entire masonry init
Поскольку у меня нет времени отслеживать каждую версию браузера, на которую может повлиять эта ошибка, я перешел к последнему методу для всех браузеров.