Используем скрипт jQuery Masonry для оформления постов в стиле Pinterest. Masonry Layout для оптимизации пространства Практическое использование Masonry Layoutа

Сеточный вывод записей а-ля Pinterest – довольно популярный тип дизайна для главных страниц блогов WordPress. Популярен он не только потому, что подражает внешнему виду известного сайта, но и потому, что идеально использует свободное пространство экрана. Сеточный дизайн, примененный к главным страницам блогов WordPress, позволяет подогнать каждое превью записей так, чтобы они были в естественном размере, и на главной странице не оставалось пустого пространства.

В данном руководстве я покажу вам, как использовать популярную JS-библиотеку Masonry для создания каскадных сеточных макетов вашей главной страницы, а также архивных страниц вашей темы. Я раскрою решение нескольких проблем, с которыми вы можете столкнуться при мобильной оптимизации.

Шаг 1. Добавляем необходимые библиотеки к своей теме.

Перед тем, как мы начнем, вам понадобится скачать два файла и добавить их в каталог JS вашей темы. Первый файл – это Masonry 3 , второй файл – ImaglesLoaded . Последний позволит нам использовать задержку вычисления сеточного макета, чтобы получить все необходимые размеры изображений, что позволит избежать различных проблем с разметкой.

WordPress включает в себя Masonry 2, однако вместе с WordPress 3.7 библиотека не была обновлена до 3. В результате нам придется отменить регистрацию Masonry, что я обычно не делаю, но в данном случае поступить иначе не получится. Как вы можете заметить в функции ниже, мы просто добавляем Masonry 3 к фронт-энду, а не к области администратора, где библиотека по сути не требуется.

Вот функция, а также действие для добавления двух библиотек и таблицы стилей для Masonry:

If (! function_exists("slug_scripts_masonry")) : if (! is_admin()) : function slug_scripts_masonry() { //deregister built in masonry since it is old version 3. wp_deregister_script("jquery-masonry"); wp_enqueue_script("imagesLoaded", get_template_directory_uri()."/js/imagesloaded.pkgd.min.js", false, null, true); wp_enqueue_script("jquery-masonry", get_template_directory_uri()."/js/masonry.pkgd.min.js", array("imagesLoaded"), null, true); } wp_enquqe_style("masonry’, get_template_directory_uri()."/css/’); add_action("wp_enqueue_scripts", "slug_scripts_masonry"); endif; //! is_admin() endif; //! slug_scripts_masonry exists

Единственное, что стоит отметить здесь: мы передаем хэндл imagesLoaded в качестве третьего параметра wp_enqueue_scripts(), который определяет зависимости. С его помощью мы убедимся в том, что Masonry будет загружаться всегда после imagesLoaded. Также отметьте для себя то, что мы не добавляем jQuery в качестве зависимостей для них. Одно из преимуществ Masonry 3 над Masonry 2 заключается в том, что версия 3 не требует библиотеки jQuery, но может использоваться с ней. Как показывает мой опыт, инициализация Masonry без jQuery более надежная, и открывает возможность пропуска загрузки jQuery, что позволяет решить проблемы с совместимостью и временем загрузки страниц.

Шаг 2. Инициализируем Javascript.

Следующая функция устанавливает Masonry, определяет контейнеры, которые будут использоваться библиотекой, а также проверяет корректность подключения. Masonry необходимо вычислить размер каждого из элементов страницы, чтобы динамично расположить свою сетку. Проблема, с которой я столкнулся, используя Masonry в большинстве браузеров, заключается в том, что Masonry неверно высчитывает высоту элементов при медленной загрузке изображений, что приводит к перекрытию элементов. Решение состоит в том, чтобы использовать imagesLoaded. Это поможет предотвратить проведение вычислений для разметки до тех пор, пока все изображения не будут загружены. В итоге будут проведены корректные измерения.

Вот функция и действия, которые будут выводить скрипт инициализации в футере страницы:

If (! function_exists("slug_masonry_init")) : function slug_masonry_exists() { ?> //set the container that Masonry will be inside of in a var var container = document.querySelector("#masonry-loop"); //create empty var msnry var msnry; // initialize Masonry after all images have loaded imagesLoaded(container, function() { msnry = new Masonry(container, { itemSelector: ".masonry-entry" }); }); >