Для интеграции Masonry в React-проект используется
пакет react-masonry-css, который является обёрткой над
оригинальной библиотекой Masonry и обеспечивает удобную работу с
компонентной архитектурой React. Установка производится через npm или
yarn:
npm install react-masonry-css
# или
yarn add react-masonry-css
После установки компонент можно импортировать в нужном файле:
import Masonry from 'react-masonry-css';
Библиотека использует сетку с адаптивными колонками. Основная идея —
задать количество колонок для разных размеров экрана и обернуть элементы
в компонент Masonry.
const breakpointColumnsObj = {
default: 4,
1100: 3,
700: 2,
500: 1
};
function Gallery({ items }) {
return (
<Masonry
breakpointCols={breakpointColumnsObj}
className="my-masonry-grid"
columnClassName="my-masonry-grid_column"
>
{items.map((item, index) => (
<div key={index} className="item">
<img src={item.src} alt={item.title} />
</div>
))}
</Masonry>
);
}
Ключевые моменты:
breakpointCols — объект, в котором ключи — ширины
экрана, а значения — количество колонок.className и columnClassName используются
для кастомной стилизации сетки и колонок.key для
корректной работы React.Для корректного отображения сетки необходимо добавить CSS:
.my-masonry-grid {
display: flex;
margin-left: -30px; /* Отрицательный margin для выравнивания колонок */
width: auto;
}
.my-masonry-grid_column {
padding-left: 30px; /* Отступ между колонками */
background-clip: padding-box;
}
.item {
margin-bottom: 30px; /* Расстояние между элементами внутри колонок */
border-radius: 8px;
overflow: hidden;
}
Эти стили создают адаптивную сетку с ровными отступами между колонками и элементами, а также обеспечивают визуальную аккуратность контента.
Masonry в React корректно работает с динамическими данными. При
изменении массива items сетка автоматически
перераспределяет элементы. Для анимации перестройки можно использовать
CSS-переходы:
.item img {
width: 100%;
display: block;
transition: transform 0.3s ease;
}
.item img:hover {
transform: scale(1.05);
}
Для более сложных анимаций можно применять сторонние библиотеки,
например framer-motion, вместе с Masonry.
Для больших галерей критично использовать ленивую загрузку
изображений. В React это можно реализовать с помощью тега
loading="lazy":
<img src={item.src} alt={item.title} loading="lazy" />
Также рекомендуется использовать оптимизированные форматы изображений (WebP, AVIF) и заранее задавать размеры контейнеров, чтобы избежать “скачков” при рендеринге Masonry.
items перед
передачей в компонент.useEffect и useState, чтобы
подгружать новые элементы и обновлять сетку.layoutComplete, removeComplete),
которые можно отслеживать через ref и Masonry
API для более сложного взаимодействия.const masonryRef = useRef(null);
useEffect(() => {
const instance = masonryRef.current;
if (instance) {
instance.on('layoutComplete', () => {
console.log('Сетка обновлена');
});
}
}, []);
react-virtualized).Хотя Masonry реализует сетку самостоятельно, компоненты можно комбинировать с Flexbox или CSS Grid, чтобы создать гибридные макеты:
.gallery-wrapper {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
Здесь Masonry отвечает за вертикальное позиционирование элементов, а CSS Grid — за общую адаптивность контейнера.
Для проектов на Next.js важно учитывать, что Masonry
зависит от window. Чтобы избежать ошибок при SSR:
const MasonryComponent = dynamic(() => import('react-masonry-css'), { ssr: false });
Это гарантирует, что компонент будет рендериться только на клиенте, исключая конфликты при серверной генерации HTML.
Использование Masonry в React позволяет создавать адаптивные,
динамические и визуально аккуратные сетки. Ключевые аспекты —
настройка колонок через breakpointCols, правильная
стилизация className и columnClassName,
ленивое подгружение изображений и контроль динамического контента через
хуки. Masonry легко интегрируется с современными инструментами React,
включая SSR, анимации и оптимизацию производительности, что делает его
универсальным инструментом для создания сложных галерей и интерфейсных
макетов.