This is a React component that positions and arranges your items in a staggered grid
https://wakaztahir.github.io/react-staggered-grid
npm i react-staggered-grid
Here columns will be generated automatically according to fixed width of each item !
import {
StaggeredAlignment,
StaggeredGrid,
StaggeredGridItem,
StaggeredGridItemFunctional,
StaggeredItemSpan
} from "react-staggered-grid";
<StaggeredGrid
columns={totalColumns} // number of columns , don't pass if you want it to be gridWidth / columnWidth
columnWidth={columnWidth} // width of each column , don't pass if you want it to be gridWidth / columns
style={{width: "100%"}} // when width of the grid is fixed in pixels , use gridWidth prop
useElementWidth={true} // this would force css styled width (100%) , when false gridWidth = columnWidth * columnWidth
>
{items.map((item, index) => (
<StaggeredGridItem
index={index}
spans={span}
style={{transition: "left 0.3s ease,top 0.3s ease"}}
>
<MyItem style={{width: "100%"}}/>
</StaggeredGridItem>
))}
</StaggeredGrid>
StaggeredGrid takes props of a HTMLElement
, like style
,className
You have to give two of these parameters columnWidth
,columns
,gridWidth
This prop adjusts width of each column on the grid This prop is required if gridWidth
&& columns
props are not being
passed
This prop adjusts the number of columns , If you want the columns to be adjusted according to width , You don't need to
pass this prop , just pass columns
and gridWidth
Custom width of the grid , if you don't know width of the grid , pass useElementWidth = true
and set css style width
to be 100%
by default "div"
This is for gridWidth ,when using css styled width , this should be true If you pass columns
&& columnWidth
, grid
width would be columns
* columnWidth
but if you want to force gridWidth to be element width (css styled width) , you
can pass useElementWidth = true
and it will get width of the grid using a ref on the parent element
Increase the gap between items horizontally , This also decreases column width to make space for the gap
columnWidth = columnWidth - horizontalGap * 2
When true , horizontalGap will be subtracted from column width making column width to be decreased to allow for horizontal gap , Useful when all columns must fit inside gridWidth regardless of horizontal gap !
default : false
Increase the gap between items vertically
This should be mostly centered , unless you have a custom gridWidth and you'd like it to translate each item according to the given alignment
default StaggeredAlignment.Center
Children of the grid , should be StaggeredGridItem[]
| StaggeredGridItemFunctional[]
Since StaggeredGrid uses translate , it translates items on the page using position : relative
on the parent Which
makes the parent element has zero height when it contains height this is by default true , which means that when the
grid items are positioned , It tracks the total height and sets it later
when true , reposition will be run when the window is resized , true by default.
It is used to make the grid infinite , if given a scroll event listener is added and when the user scrolls to the end of grid , this function is called to add more items !
default : 20 , When user reaches the end - requestAppendScrollTolerance , request append is called
provide a controller object to call functions on the grid , see useStaggeredGridController
hook
There are two types of items : StaggeredGridItem
& StaggeredGridItemFunctional
, Functional component uses
a useStaggeredItemPosition
hook to get the item position on the grid
It's important to key your item correctly
StaggeredGridItem takes props for a HTMLElement
like onClick
and style
other props include...
by default "div"
{
initialWidth : number // defaut 0
initialTranslateX : number // default 0
initialTranslateY : number // default 0
}
If item height is known pixel height , You can provide it , otherwise the height will be calculated using a ref.
Span of the item , It's constrained in range (1 - totalColumnCount)
This is the index of the item in the array
Children of the item
This is a function which gets a parameter item position which contains item width , x and y which is transformed into props (attributes) for the staggered grid item element
By default, it uses css properties left
& top
to translate each item with position : absolute
relative to parent
If you want to force reposition items on the grid whenever you want ! You need a StaggeredGridController
// provide this controller to StaggeredGrid Component using gridController prop
const controller = createStaggeredGridController();
interface StaggeredGridController {
/** This will request reposition on the next animation frame , useful for multiple calls */
requestReposition: () => void;
/** Force reposition all the items */
reposition: () => void;
}