Использование кладки с загруженными изображениями
Я новичок в JS и надеюсь, что эти вопросы не кажутся слишком глупыми.
Я использую кладку для своего сайта - работает отлично. Я хотел, чтобы мои коробки появлялись как раз тогда, когда кладка закончила загрузку. Ища в интернете, я нашел несколько постов, рекомендующих использовать загружаемый плагин для решения этой проблемы. Это просто ничего не меняет. Это означает, что мои макеты и блоки содержимого продолжают портиться до тех пор, пока кладка не закончит загрузку, и только тогда блоки внезапно переместятся на свои правильные позиции.
Мой код:
$(document).ready(function() {
var $container = $('#post-area');
$container.imagesLoaded( function() {
$container.masonry({
itemSelector : '.box',
columnwidth: 300,
gutter: 20,
isFitWidth: true,
isAnimated: !Modernizr.csstransitions
});
});
});
Я также получаю эту ошибку Firebug:
TypeError: EventEmitter is not a constructor
ImagesLoaded.prototype = new EventEmitter();
Я загружаю изображения в формате js вот так в конце моего сайта (я не смог найти никакой информации, если загруженные изображения уже включены в кладку или нет, некоторые писали, что она больше не включена - сбивает с толку):
<script src="http://www.domainname.com/js/imagesloaded.js"></script>
Я был бы очень рад, если бы кто-нибудь мог мне помочь. И скажите мне, является ли загружаемый файл подходящим плагином для решения этой проблемы!
3 ответа
imagesLoaded не включен в Masonry, поэтому вы должны использовать отдельный плагин. Я бы порекомендовал использовать скомпилированную версию.min.
По поводу вашей проблемы со сложенными изображениями: проблема не в загруженных изображениях, ни в масонстве. В вашем коде imagesLoaded ожидает загрузки всех изображений, а затем запускает кладку. После загрузки всех изображений плагин Masonry может правильно определить их размеры и поместить их в сетку. До этого браузер загружал изображения как обычно и отображал их в соответствии с определенным CSS, поэтому они запутались.
Одним из возможных решений является скрытие элементов по умолчанию, а затем fadein, пока imagesLoaded подтверждает, что загруженные изображения:
$(document).ready(function() {
var $boxes = $('.box');
$boxes.hide();
var $container = $('#post-area');
$container.imagesLoaded( function() {
$boxes.fadeIn();
$container.masonry({
itemSelector : '.box',
columnwidth: 300,
gutter: 20,
isFitWidth: true,
isAnimated: !Modernizr.csstransitions
});
});
});
Другое решение - инициализировать Masonry внутри $(window).load() вместо $(document).ready(). Это вызовет Masonry после того, как все материалы на странице загружены - изображения, шрифты, внешние скрипты и таблицы стилей и т. Д.
$(window).load(function(){
$('#container').masonry({
// options...
});
});
Устанавливать
npm install masonry-layout --save
npm install imagesloaded --save
Тогда варианты Vanilla JS будут
'use strict'
const Masonry = require('masonry-layout')
const imgloaded = require('imagesloaded')
const elem = document.querySelector('.grid')
var imgLoad = imgloaded( elem )
function onAlways() {
const msnry = new Masonry( elem, {
// options
columnWidth: '.grid-sizer',
// do not use .grid-sizer in layout
itemSelector: '.grid-item',
percentPosition: true,
gutter: 10
})
// console.log('all images are loaded')
}
if (elem) {
// bind with .on()
imgLoad.on( 'always', onAlways )
// unbind with .off()
// imgLoad.off( 'always', onAlways )
}
Затем проверьте консоль для всех загруженных изображений.