Shorthand for alignItems style prop
Chakra UI Stack - Horizon UI
Stack is a layout component that makes it easy to stack elements together and apply a space between them. It uses a modified version of the CSS lobotomized owl selector to add spacing between its children.
Import#
import { Stack, HStack, VStack } from "@chakra-ui/react"
- Stack: Used to add spacing between elements in the horizontal or vertical direction. It supports responsive values.
- HStack: Used to add spacing between elements in horizontal direction, and centers them.
- VStack: Used to add spacing between elements in vertical direction only, and centers them.
Usage#
To stack elements in horizontal or vertical direction only, use the HStack or
VStack components. You can also use the Stack component as well and pass the
direction prop.
<HStack spacing="24px"><Box w="40px" h="40px" bg="yellow.200">1</Box><Box w="40px" h="40px" bg="tomato">2</Box><Box w="40px" h="40px" bg="pink.100">3</Box></HStack>
<HStack spacing="24px"><Box w="40px" h="40px" bg="yellow.200">1</Box><Box w="40px" h="40px" bg="tomato">2</Box><Box w="40px" h="40px" bg="pink.100">3</Box></HStack>
Responsive direction#
You can pass responsive values to the Stack component to change stack
direction and/or spacing between elements.
<Stack direction={["column", "row"]} spacing="24px"><Box w="40px" h="40px" bg="yellow.200">1</Box><Box w="40px" h="40px" bg="tomato">2</Box><Box w="40px" h="40px" bg="pink.100">3</Box></Stack>
<Stack direction={["column", "row"]} spacing="24px"><Box w="40px" h="40px" bg="yellow.200">1</Box><Box w="40px" h="40px" bg="tomato">2</Box><Box w="40px" h="40px" bg="pink.100">3</Box></Stack>
Adding dividers#
In some scenarios, you may want to add dividers between stacked elements. Pass
the divider prop and set its value to the StackDivider or any custom React
element.
<VStackdivider={<StackDivider borderColor="gray.200" />}spacing={4}align="stretch"><Box h="40px" bg="yellow.200">1</Box><Box h="40px" bg="tomato">2</Box><Box h="40px" bg="pink.100">3</Box></VStack>
<VStackdivider={<StackDivider borderColor="gray.200" />}spacing={4}align="stretch"><Box h="40px" bg="yellow.200">1</Box><Box h="40px" bg="tomato">2</Box><Box h="40px" bg="pink.100">3</Box></VStack>
Example#
function Feature({ title, desc, ...rest }) {return (<Box p={5} shadow="md" borderWidth="1px" {...rest}><Heading fontSize="xl">{title}</Heading><Text mt={4}>{desc}</Text></Box>)}function StackEx() {return (<Stack spacing={8}><Featuretitle="Plan Money"desc="The future can be even brighter but a goal without a plan is just a wish"/><Featuretitle="Save Money"desc="You deserve good things. With a whooping 10-15% interest rate per annum, grow your savings on your own terms with our completely automated process"/></Stack>)}render(<StackEx />)
function Feature({ title, desc, ...rest }) {return (<Box p={5} shadow="md" borderWidth="1px" {...rest}><Heading fontSize="xl">{title}</Heading><Text mt={4}>{desc}</Text></Box>)}function StackEx() {return (<Stack spacing={8}><Featuretitle="Plan Money"desc="The future can be even brighter but a goal without a plan is just a wish"/><Featuretitle="Save Money"desc="You deserve good things. With a whooping 10-15% interest rate per annum,grow your savings on your own terms with our completely automated process"/></Stack>)}render(<StackEx />)
Stack items horizontally#
Pass the direction and set it to row. Optionally, you can use align and
justify to adjust the alignment and distribution of the items.
function Feature({ title, desc, ...rest }) {return (<Boxp={5}shadow="md"borderWidth="1px"flex="1"borderRadius="md"{...rest}><Heading fontSize="xl">{title}</Heading><Text mt={4}>{desc}</Text></Box>)}function StackEx() {return (<HStack spacing={8}><Featuretitle="Plan Money"desc="The future can be even brighter but a goal without a plan is just a wish"/><Featuretitle="Save Money"desc="You deserve good things. With a whooping 10-15% interest rate per annum, grow your savings."/></HStack>)}render(<StackEx />)
function Feature({ title, desc, ...rest }) {return (<Boxp={5}shadow="md"borderWidth="1px"flex="1"borderRadius="md"{...rest}><Heading fontSize="xl">{title}</Heading><Text mt={4}>{desc}</Text></Box>)}function StackEx() {return (<HStack spacing={8}><Featuretitle="Plan Money"desc="The future can be even brighter but a goal without a plan is just a wish"/><Featuretitle="Save Money"desc="You deserve good things. With a whooping 10-15% interest rate per annum, grow your savings."/></HStack>)}render(<StackEx />)
Notes on Stack vs Flex#
Stack's primary use case is to lay items out and control the spacing between
each item. If you have a more complicated use case, such as changing the margin
on the last child, you can combine Stack and Flex and use
justify-content: space-between for more control of the layout.
Props#
align
alignSystemProps["alignItems"]direction
directionThe direction to stack the items.
"column" | "column-reverse" | "row" | "row-reverse" | ResponsiveArray<"column" | "column-reverse" | "row" | "row-reverse"> | Partial<Record<string, "column" | "column-reverse" | "row" | "row-reverse">>divider
dividerIf true, each stack item will show a divider
React.ReactElementisInline
isInlineIf true the items will be stacked horizontally.
booleanjustify
justifyShorthand for justifyContent style prop
SystemProps["justifyContent"]shouldWrapChildren
shouldWrapChildrenIf true, the children will be wrapped in a Box with
`display: inline-block`, and the Box will take the spacing props
booleanspacing
spacingThe space between each stack item
SystemProps["margin"]wrap
wrapShorthand for flexWrap style prop
SystemProps["flexWrap"]