Grid 栅格
Grid 把 GridItem 排进等宽的 CSS 栅格里。列数、间距、跨度和偏移都可以随宽度变化,这个宽度可以是栅格自己的,也可以是视口的。切换全交给 CSS(容器查询和媒体查询)完成,所以第一次绘制时布局就是对的,不需要测量,也不会跳动。它只负责布局,自己不画任何东西。
演示
基础用法
cols 设置列数,每个元素默认占一列。
间距
xGap 和 yGap 可以是主题预设(small、medium、large),也可以是一个数字(单位 px)。默认没有间距。
跨度与偏移
span 是元素占几列,offset 是它前面空出几列。
响应式列数
响应式的值按宽度列出取值:"1 s:2 m:3" 表示默认 1 列,从断点 s 起 2 列,从 m 起 3 列。宽度也可以直接写 px:"1 360:2 520:3"。responsive="self"(默认)时看栅格自己的宽度,同一个栅格放在侧栏或主栏里都合适;设为 "screen" 时看视口宽度。cols、xGap、yGap、span 和 offset 都支持这种写法。
响应式元素
span 为 0 的元素会被隐藏,所以用响应式的 span 可以在栅格较窄时去掉某个元素。拖动右下角试试。
折叠
collapsed 只保留前 collapsedRows 行元素。最后一个元素设置 suffix 后,会固定在最后一行的末尾,并且始终显示;它的子元素写成函数时,能拿到是否有元素被藏起来,很适合给筛选表单放一个“展开”按钮。
断点
| 名称 | 最小宽度 |
|---|---|
xs | 0 |
s | 640px |
m | 1024px |
l | 1280px |
xl | 1536px |
xxl | 1920px |
这几个名字是按屏幕宽度定的;放在面板里、按自身宽度响应的栅格,通常直接写 px 更合适。CSS 查询条件里的宽度不能从变量读取,所以栅格会把它用到的容器查询或媒体查询写进一个只作用于自身的 <style>。
Props
Grid Props
| 名称 | 类型 | 默认值 | 说明 | 版本 |
|---|---|---|---|---|
cols | number | string | 24 | 列数,或者 "1 s:2 m:3"、"1 360:2" 这样的响应式值。 | 未发布 |
xGap | small | medium | large | number | string | 0 | 列间距:主题预设、px 值,或者二者的响应式值。 | 未发布 |
yGap | small | medium | large | number | string | 0 | 行间距,写法同 xGap。 | 未发布 |
responsive | self | screen | self | 断点看栅格自己的宽度还是视口宽度。 | 未发布 |
collapsed | boolean | false | 只显示前 collapsedRows 行元素,以及 suffix 元素。 | 未发布 |
collapsedRows | number | 1 | 折叠时保留的行数。 | 未发布 |
children | ReactNode | undefined | 里面的 GridItem。 | 未发布 |
Grid 在栅格外面包了一层 div(responsive="self" 量的就是它的宽度),原生 div 属性和 ref 都落在这层外壳上。它不附带任何 role;如果放的是一组卡片,可以给它加 role="list",给每个元素加 role="listitem"。
按自身宽度响应的栅格和普通块级元素一样,宽度由所在的位置决定;如果父元素按内容收缩(比如 inline-block,或者没设宽度的 flex 子元素),需要给它一个宽度。只有折叠且带响应式值的栅格才会在 JavaScript 里量宽度,用来判断该藏哪些元素。
GridItem Props
| 名称 | 类型 | 默认值 | 说明 | 版本 |
|---|---|---|---|---|
span | number | string | 1 | 元素占的列数,为 0 时隐藏。支持响应式值。 | 未发布 |
offset | number | string | 0 | 元素前面空出的列数。支持响应式值。 | 未发布 |
suffix | boolean | false | 把元素放到所在行的末尾,栅格折叠时也保持显示。只有最后一个元素能作为 suffix,它的 offset 不生效。 | 未发布 |
children | ReactNode | ({ overflow }) => ReactNode | undefined | 内容,或者一个函数,参数 overflow 表示折叠后是否有元素被隐藏。 | 未发布 |
GridItem 要直接放在 Grid 里(放在 fragment 里也可以):栅格要读取它们的 span 和 offset 来计算折叠。GridItem 渲染一个 div,同样接受原生 div 属性和 ref。
主题间距对应 token --r-grid-gap-small、--r-grid-gap-medium 和 --r-grid-gap-large。