Масонство JS Перекрытие предметов
У меня здесь очень странная проблема: [реферальная ссылка удалена]. Продукты первой строки перекрываются с элементами второй строки.
Элементы кладки находятся под главной страницей над нижним колонтитулом. Как видите, с Chrome все выглядит иначе. В Firefox это выглядит хорошо.
Вот как это выглядит у меня в chrome: http://clip2net.com/s/5LIRko
Мой код jQuery:
jQuery(function($){
var $container = $('.woocommerce ul.products');
$container.masonry({
columnWidth:10,
gutterWidth: 15,
itemSelector: '.product-category'
});
});
Есть ли какое-нибудь правило css, которое влияет на вывод строки?
Ответы
Ответ 1
Проблема заключается в ваших изображениях. К тому времени, когда вызывается кладка, ваши изображения не загружены. Таким образом, он предполагает высоту ваших элементов БЕЗ высоты изображения, в котором учитывается.
Если вы обновите свой экран после того, как изображения уже сохранены в кеше, вы увидите, что он загружается правильно. Если вы затем очистите кеш и обновите, вы увидите, что они снова перекрываются.
Четыре Пять вариантов:
- Дождитесь завершения загрузки изображений (есть плагины, которые можно подождать, пока не загрузятся все изображения внутри определенного div)
- Дождитесь события загрузки вместо готового события. Вместо использования
jQuery(function($){
используйте jQuery(window).on('load', function(){ var $ = jQuery;
, и вы увидите результаты.
- Повторно примените кладку после загрузки изображений (не нравится этот... вы увидите мерцание)
- Мой любимый, не используйте кладку здесь! Отключите JS на своей странице и посмотрите на макет. Это то, что вы хотите. Все divs - это даже высоты и даже ширина. Здесь нет никакой причины использовать кирпичную кладку. Просто плавайте свои элементы и пусть они отображаются в сетке естественным образом.
- EDIT: еще один вариант. Укажите высоту div, чтобы высота не зависела от загружаемых изображений.
Ответ 2
Вам нужно начать масонство после загрузки всех изображений. Если вы используете jQuery, попробуйте:
var $container = $('#container');
// initialize Masonry after all images have loaded
$container.imagesLoaded( function() {
$container.masonry();
});
другие варианты см. в документации по масонству - http://masonry.desandro.com/layout.html#imagesloaded
Ответ 3
Спасибо, ваше решение работает после замены document.ready с помощью jQuery (window).on('load', function() {
Ответ 4
Я решил эту проблему с помощью функции setimeout. Предоставляя секунду или около того (в зависимости от размера # и размера загружаемых изображений), вы можете сначала загрузить изображения, а затем применить кладку.
$(document).ready(function(){
setTimeout(function() { masonry_go();masonry_go2();}, 1000);
});
$(window).resize(function()
{
// jQuery
$('.grid').masonry( 'destroy')
$('.grid2').masonry( 'destroy')
setTimeout(function() { masonry_go();masonry_go2();}, 1000);
});
function masonry_go(){
$('.grid').masonry({
// options
itemSelector: '.grid-item',
columnWidth: 300
});
}
function masonry_go2(){
$('.grid2').masonry({
// options
itemSelector: '.grid-item2',
gutter: 15,
columnWidth: 200
});
}
Ответ 5
Использовать библиотеку ImagesLoaded, сделанную специально для реорганизации блоков при загрузке каждого изображения.
Вы можете скачать его из:
https://github.com/desandro/imagesloaded
Ответ 6
Добавьте минимальную высоту для изображений с CSS. Это решило бы проблему.
.image{ min-height: 250px; }
Ответ 7
У меня работает загрузка кладки после загрузки окна.
jQuery(window).on('load', function(){
//masonry init and options
// .. codes
}