Packery — это библиотека для динамического расположения элементов в виде сетки с возможностью «мозаичного» размещения. При использовании в реальных проектах важно учитывать обратную совместимость с различными браузерами и старыми версиями JavaScript.
Packery активно использует свойство CSS
transform для позиционирования элементов и
JavaScript события для перерасчета расположения при
изменении размеров контейнера. В старых браузерах, таких как IE9 или
ранние версии Firefox и Chrome, некоторые свойства могут работать
некорректно или отсутствовать вовсе:
requestAnimationFrame, который используется для анимации
перестановки элементов.classList может привести к ошибкам
при добавлении/удалении классов у элементов.getBoundingClientRect при трансформациях.Для обеспечения работы Packery на старых браузерах необходимо подключать полифиллы:
requestAnimationFrame
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function(callback) {
return setTimeout(callback, 16);
};
}classList Для IE9 и IE10 можно использовать полифилл, предоставляемый MDN.
CustomEvent Для старых версий Firefox и IE
необходимо полифиллить событие CustomEvent:
(function () {
if ( typeof window.CustomEvent === "function" ) return false;
function CustomEvent(event, params) {
params = params || { bubbles: false, cancelable: false, detail: null };
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent.prototype = window.Event.prototype;
window.CustomEvent = CustomEvent;
})();Packery поддерживает опцию transitionDuration, которая
управляет анимацией перестановки элементов. В старых браузерах можно
отключить анимацию для повышения стабильности:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
transitionDuration: 0 // отключение анимации для старых браузеров
});
Также рекомендуется использовать фиксированные размеры
элементов, так как старые браузеры часто неправильно
обрабатывают динамическое изменение размеров элементов с
transform.
Для работы Packery критически важны свойства:
transform и transform-origintransitionbox-sizingМожно использовать библиотеку Modernizr для проверки поддержки и условного подключения полифиллов:
if (!Modernizr.csstransforms) {
// подключение fallback для абсолютного позиционирования элементов
}
Packery реагирует на изменения контейнера и перетаскивания элементов
через события layoutComplete и
dragItemPositioned. Для старых браузеров необходимо
убедиться, что события addEventListener и
dispatchEvent поддерживаются:
if (!Element.prototype.addEventListener) {
Element.prototype.addEventListener = function(event, callback) {
this.attachEvent('on' + event, callback);
};
}
requestAnimationFrame, classList,
CustomEvent.addEventListener и dispatchEvent.Соблюдение этих правил обеспечивает корректную работу Packery на широком диапазоне браузеров и позволяет поддерживать обратную совместимость без потери функциональности сетки и интерактивных элементов.