Grid 栅格
Material Design 响应式布局的栅格可适应屏幕大小和方向,确保布局在不同尺寸之间的一致性。
Grid 栅格组件 能确保不同布局间的视觉层面的舒适感,同时在众多不同设计中保持灵活性。 Material Design 基于 12 列的网格布局来做到 UI 的响应式。
⚠️
栅格
组件不要与承载大量数据的表格(data grid)进行混淆;这个组件更倾向于在布局中使用。 如果需使用承载大量数据的表格,请看这里的数据表格
组件。
工作原理
栅格系统是通过 Grid
组件实现的:
- 它使用 CSS 弹性盒子模块 来做到高度灵活。
- 它有两种类型的布局: containers , _items_。
- 每项的宽度是按百分比设置的,所以它们的大小总是相对于它们的父元素流动。
- 子项目(items)使用内边距来保持和其他块(items)的间距。
- 其中五个断点可供使用:xs,sm,md,lg 和 xl。
- 你可以为每个断点提供整数值,表示当视口宽度满足 断点约束 时,12 个可用列中有多少列被组件占用。
若你对 flexbox 不太熟悉,我们建议你阅读 CSS-Tricks flexbox 手册。
Fluid grids 流式网格
流式网格可以通过列(column)来缩放和调整内容的大小。 A fluid grid's layout can use breakpoints to determine if the layout needs to change dramatically.
基本栅格
Column widths are integer values between 1 and 12; they apply at any breakpoint and indicate how many columns are occupied by the component.
A value given to a breakpoint applies to all the other breakpoints wider than it (unless overridden, as you can read later in this page). For example, xs={12}
sizes a component to occupy the whole viewport width regardless of its size.
<Grid container spacing={2}>
<Grid item xs={8}>
<Item>xs=8</Item>
</Grid>
<Grid item xs={4}>
<Item>xs=4</Item>
</Grid>
<Grid item xs={4}>
<Item>xs=4</Item>
</Grid>
<Grid item xs={8}>
<Item>xs=8</Item>
</Grid>
</Grid>
有断点的栅格
Components may have multiple widths defined, causing the layout to change at the defined breakpoint. Width values given to larger breakpoints override those given to smaller breakpoints.
For example, xs={12} sm={6}
sizes a component to occupy half of the viewport width (6 columns) when viewport width is 600 or more pixels. For smaller viewports, the component fills all 12 available columns.
<Grid container spacing={2}>
<Grid item xs={6} md={8}>
<Item>xs=6 md=8</Item>
</Grid>
<Grid item xs={6} md={4}>
<Item>xs=6 md=4</Item>
</Grid>
<Grid item xs={6} md={4}>
<Item>xs=6 md=4</Item>
</Grid>
<Grid item xs={6} md={8}>
<Item>xs=6 md=8</Item>
</Grid>
</Grid>
Spacing 间距
To control space between children, use the spacing
prop. The spacing value can be any positive number, including decimals and any string. The prop is converted into a CSS property using the theme.spacing()
helper.
<Grid container spacing={2}>
响应式的值
You can switch the props' value based on the active breakpoint. For instance, we can implement the "recommended" responsive layout grid of Material Design.
<Grid container spacing={{ xs: 2, md: 3 }} columns={{ xs: 4, sm: 8, md: 12 }}>
{Array.from(Array(6)).map((_, index) => (
<Grid item xs={2} sm={4} md={4} key={index}>
<Item>xs=2</Item>
</Grid>
))}
</Grid>
Responsive values is supported by:
columns
columnSpacing
direction
rowSpacing
spacing
- all the other props of the system
⚠️ When using a responsive
columns
prop, each grid item needs its corresponding breakpoint. For instance, this is not working. The grid item misses the value formd
:<Grid container columns={{ xs: 4, md: 12 }}> <Grid item xs={2} /> > </Grid>
Row & column spacing
The rowSpacing
and columnSpacing
props allow for specifying the row and column gaps independently. It's similar to the row-gap
and column-gap
properties of CSS Grid.
<Grid container rowSpacing={1} columnSpacing={{ xs: 1, sm: 2, md: 3 }}>
<Grid item xs={6}>
<Item>1</Item>
</Grid>
<Grid item xs={6}>
<Item>2</Item>
</Grid>
<Grid item xs={6}>
<Item>3</Item>
</Grid>
<Grid item xs={6}>
<Item>4</Item>
</Grid>
</Grid>
<Grid
container
direction="row"
justifyContent="center"
alignItems="center"
>
自适应布局
The Auto-layout makes the items equitably share the available space. That also means you can set the width of one item and the others will automatically resize around it.
<Grid container spacing={3}>
<Grid item xs>
<Item>xs</Item>
</Grid>
<Grid item xs={6}>
<Item>xs=6</Item>
</Grid>
<Grid item xs>
<Item>xs</Item>
</Grid>
</Grid>
复杂的栅格
The following demo doesn't follow the Material Design guidelines, but illustrates how the grid can be used to build complex layouts.
Full resolution 1920x1080 • JPEG
ID: 1030114
Remove
嵌套栅格
The container
and item
props are two independent booleans; they can be combined to allow a Grid component to be both a flex container and child.
A flex container is the box generated by an element with a computed display of
flex
orinline-flex
. In-flow children of a flex container are called flex items and are laid out using the flex layout model.
<Grid container spacing={1}>
<Grid container item spacing={3}>
<FormRow />
</Grid>
<Grid container item spacing={3}>
<FormRow />
</Grid>
<Grid container item spacing={3}>
<FormRow />
</Grid>
</Grid>
⚠️ Defining an explicit width to a Grid element that is flex container, flex item, and has spacing at the same time lead to unexpected behavior, avoid doing it:
<Grid spacing={1} container item xs={12}>
If you need to do such, remove one of the props.
列
You can change the default number of columns (12) with the columns
prop.
<Grid container spacing={2} columns={16}>
<Grid item xs={8}>
<Item>xs=8</Item>
</Grid>
<Grid item xs={8}>
<Item>xs=8</Item>
</Grid>
</Grid>
设计局限
负边距
The spacing between items is implemented with a negative margin. This might lead to unexpected behaviors. For instance, to apply a background color, you need to apply display: flex;
to the parent.
white-space: nowrap;
我们规定了 flex 元素的默认属性值为 min-width:auto
。 当子元素使用 white-space: nowrap;
时,则会出现位置的冲突。 以下的案例直观的反应了这个问题:
<Grid item xs>
<Typography noWrap>
若想让子项继续在容器内展示,您需要设置 min-width: 0
。 In practice, you can set the zeroMinWidth
prop:
<Grid item xs zeroMinWidth>
<Typography noWrap>
Truncation should be conditionally applicable on this long line of text as this is a much longer line than what the container can support.
Truncation should be conditionally applicable on this long line of text as this is a much longer line than what the container can support.
Truncation should be conditionally applicable on this long line of text as this is a much longer line than what the container can support.
direction: column | column-reverse
The xs
, sm
, md
, lg
, and xl
props are not supported within direction="column"
and direction="column-reverse"
containers.
They define the number of grids the component will use for a given breakpoint. They are intended to control width using flex-basis
in row
containers but they will impact height in column
containers. If used, these props may have undesirable effects on the height of the Grid
item elements.
CSS 栅格布局
The Grid
component is using CSS flexbox internally. But as seen below, you can easily use the system and CSS Grid to layout your pages.
<Box display="grid" gridTemplateColumns="repeat(12, 1fr)" gap={2}>
<Box gridColumn="span 8">
<Item>xs=8</Item>
</Box>
<Box gridColumn="span 4">
<Item>xs=4</Item>
</Box>
<Box gridColumn="span 4">
<Item>xs=4</Item>
</Box>
<Box gridColumn="span 8">
<Item>xs=8</Item>
</Box>
</Box>
System props
As a CSS utility component, the Grid
supports all system
properties. You can use them as props directly on the component. For instance, a padding:
<Grid item p={2}>