Files
react-test/docs/data/system/components/stack/stack.md
how2ice 005cf56baf
Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
init project
2025-12-12 14:26:25 +09:00

3.7 KiB

productId, title, components, githubLabel
productId title components githubLabel
system React Stack component Stack component: Stack

Stack

Stack is a container component for arranging elements vertically or horizontally.

Introduction

The Stack component manages the layout of its immediate children along the vertical or horizontal axis, with optional spacing and dividers between each child.

:::info Stack is ideal for one-dimensional layouts, while Grid is preferable when you need both vertical and horizontal arrangement. :::

{{"component": "@mui/docs/ComponentLinkHeader", "design": false}}

Basics

import Stack from '@mui/system/Stack';

The Stack component acts as a generic container, wrapping around the elements to be arranged.

Use the spacing prop to control the space between children. The spacing value can be any number, including decimals, or a string. (The prop is converted into a CSS property using the theme.spacing() helper.)

{{"demo": "BasicStack.js", "bg": true}}

Stack vs. Grid

Stack is concerned with one-dimensional layouts, while Grid handles two-dimensional layouts. The default direction is column which stacks children vertically.

Direction

By default, Stack arranges items vertically in a column. Use the direction prop to position items horizontally in a row:

{{"demo": "DirectionStack.js", "bg": true}}

Dividers

Use the divider prop to insert an element between each child, as shown below:

{{"demo": "DividerStack.js", "bg": true}}

Responsive values

You can switch the direction or spacing values based on the active breakpoint.

{{"demo": "ResponsiveStack.js", "bg": true}}

Flexbox gap

To use flexbox gap for the spacing implementation, set the useFlexGap prop to true.

It removes the known limitations of the default implementation that uses CSS nested selector. However, CSS flexbox gap is not fully supported in some browsers.

We recommend checking the support percentage before using it.

{{"demo": "FlexboxGapStack.js", "bg": true}}

Interactive demo

Below is an interactive demo that lets you explore the visual results of the different settings:

{{"demo": "InteractiveStack.js", "hideToolbar": true, "bg": true}}

System props

:::info System props are deprecated and will be removed in the next major release. Please use the sx prop instead.

- <Stack mt={2} />
+ <Stack sx={{ mt: 2 }} />

:::

Limitations

Margin on the children

Customizing the margin on the children is not supported by default.

For instance, the top-margin on the button component below will be ignored.

<Stack>
  <button style={{ marginTop: '30px' }}>...</button>
</Stack>

:::success To overcome this limitation, set useFlexGap prop to true to switch to CSS flexbox gap implementation.

You can learn more about this limitation by visiting this RFC. :::

white-space: nowrap

The initial setting on flex items is min-width: auto. This causes a positioning conflict when children use white-space: nowrap;. You can reproduce the issue with:

<Stack direction="row">
  <span style={{ whiteSpace: 'nowrap' }}>

In order for the item to stay within the container you need to set min-width: 0.

<Stack direction="row" sx={{ minWidth: 0 }}>
  <span style={{ whiteSpace: 'nowrap' }}>

Anatomy

The Stack component is composed of a single root <div> element:

<div class="MuiStack-root">
  <!-- Stack contents -->
</div>