UNPKG

react-staggered-grid

Version:

This is a React component that positions and arranges your items in a staggered grid

190 lines (121 loc) 6.36 kB
# React Staggered Grid This is a React component that positions and arranges your items in a staggered grid ## Demo https://wakaztahir.github.io/react-staggered-grid ## Install `npm i react-staggered-grid` ## Usage Here columns will be generated automatically according to fixed width of each item ! ```typescript jsx 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 Props StaggeredGrid takes props of a `HTMLElement` , like `style`,`className` You have to give two of these parameters `columnWidth`,`columns`,`gridWidth` #### columnWidth : number This prop adjusts width of each column on the grid This prop is required if `gridWidth` && `columns` props are not being passed #### columns : number 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` #### gridWidth : number 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%` #### elementType : string (optional) by default "div" #### useElementWidth : boolean (optional) 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 #### horizontalGap : number (optional) Increase the gap between items horizontally , This also decreases column width to make space for the gap `columnWidth = columnWidth - horizontalGap * 2` #### fitHorizontalGap : boolean (optional) 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 #### verticalGap : number (optional) Increase the gap between items vertically #### alignment : StaggeredAlignment (optional) 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 : ReactNode | undefined (optional) Children of the grid , should be `StaggeredGridItem[]` | `StaggeredGridItemFunctional[]` #### calculateHeight: boolean (optional) 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 #### repositionOnResize : boolean (optional) when true , reposition will be run when the window is resized , true by default. #### requestAppend : () => void (optional) 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 ! #### requestAppendScrollTolerance : number (optional) default : 20 , When user reaches the end - requestAppendScrollTolerance , request append is called #### gridController : StaggeredGridController (optional) provide a controller object to call functions on the grid , see `createStaggeredGridController` ## StaggeredGridItem 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 Props StaggeredGridItem takes props for a `HTMLElement` like `onClick` and `style` other props include... #### elementType : string (optional) by default "div" #### initialPosition (optional) { initialWidth : number // defaut 0 initialTranslateX : number // default 0 initialTranslateY : number // default 0 } #### itemHeight : number (optional) If item height is known pixel height , You can provide it , otherwise the height will be calculated using a ref. #### spans: StaggeredItemSpan | number (optional) Span of the item , It's constrained in range (1 - totalColumnCount) #### index: number (required) This is the index of the item in the array #### children: ReactNode | undefined (optional) Children of the item #### transform (optional) 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 ## StaggeredGridController If you want force reposition items on the grid whenever you want ! You need a StaggeredGridController ```typescript // provide this controller to StaggeredGrid Component using gridController prop const controller = createStaggeredGridController(); ``` ```typescript interface StaggeredGridController { /** This will request reposition on the next animation frame , useful for multiple calls */ requestReposition: () => void; /** Force reposition all the items */ reposition: () => void; } ```