ATRI
科幻サクラノ詩
剧情天文台的午后
日常银河另一端
科幻书页之间
校园静谧的信号
治愈import { AspectRatio, Card, Grid, Stack, Tag, Text } from '@hina-ui/react'
const works = [
{ title: 'ATRI', tag: '科幻' },
{ title: 'サクラノ詩', tag: '剧情' },
{ title: '天文台的午后', tag: '日常' },
{ title: '银河另一端', tag: '科幻' },
{ title: '书页之间', tag: '校园' },
{ title: '静谧的信号', tag: '治愈' },
]
export default function Demo() {
return (
<Grid cols={3} className="w-full max-w-2xl">
{works.map(work => (
<Card key={work.title}>
<Stack gap="xs" align="start">
<AspectRatio className="bg-inset w-full rounded-md" />
<Text className="font-medium">{work.title}</Text>
<Tag>{work.tag}</Tag>
</Stack>
</Card>
))}
</Grid>
)
}
tsx
用法
import { Grid } from '@hina-ui/react'
ts
cols 是列数,取 1 到 12。子元素按顺序填入格子,超出一行的自动换到下一行。
1
2
3
4
5
6
import { Card, Grid } from '@hina-ui/react'
export default function Demo() {
return (
<Grid cols={3} className="w-full max-w-md">
{[1, 2, 3, 4, 5, 6].map(i => (
<Card key={i} className="bg-inset grid h-16 place-items-center" padded={false}>
{i}
</Card>
))}
</Grid>
)
}
tsx
示例
列数
cols 2
1
2
cols 3
1
2
3
cols 4
1
2
3
4
cols 6
1
2
3
4
5
6
import { Card, Grid, Stack, Text } from '@hina-ui/react'
const counts = [2, 3, 4, 6] as const
export default function Demo() {
return (
<Stack className="w-full max-w-md">
{counts.map(cols => (
<Stack key={cols} gap="xs">
<Text tone="muted" size="sm">
cols {cols}
</Text>
<Grid cols={cols} gap="sm">
{Array.from({ length: cols }, (_, i) => i + 1).map(i => (
<Card
key={i}
className="bg-inset grid h-10 place-items-center text-sm"
padded={false}
>
{i}
</Card>
))}
</Grid>
</Stack>
))}
</Stack>
)
}
tsx
间距
gap 只接受档位。md 是默认档,两个方向取值不同:列间是 --hn-inline-gap,行间是 --hn-stack-gap,常规密度下分别是 12 与 16 像素。其余档位两轴相同,分别是 0、4、8、24 与 32 像素。
md 档:列间 12 像素,行间 16 像素
其余档位两轴相同,这里是 lg 的 24 像素
import { Card, Grid, Stack, Text } from '@hina-ui/react'
export default function Demo() {
return (
<Stack className="w-full max-w-md">
<Stack gap="xs">
<Text tone="muted" size="sm">
md 档:列间 12 像素,行间 16 像素
</Text>
<Grid cols={3} gap="md">
{[1, 2, 3, 4, 5, 6].map(i => (
<Card key={i} className="bg-inset h-10" padded={false} />
))}
</Grid>
</Stack>
<Stack gap="xs">
<Text tone="muted" size="sm">
其余档位两轴相同,这里是 lg 的 24 像素
</Text>
<Grid cols={3} gap="lg">
{[1, 2, 3, 4, 5, 6].map(i => (
<Card key={i} className="bg-inset h-10" padded={false} />
))}
</Grid>
</Stack>
</Stack>
)
}
tsx
跨列
子元素占据多列时,在子元素上写 Tailwind 的 col-span-*。Grid 不提供列组件。
col-span-2
1
col-span-3
import { Card, Grid } from '@hina-ui/react'
export default function Demo() {
return (
<Grid cols={3} className="w-full max-w-md">
<Card className="bg-inset col-span-2 grid h-16 place-items-center text-sm" padded={false}>
col-span-2
</Card>
<Card className="bg-inset grid h-16 place-items-center text-sm" padded={false}>
1
</Card>
<Card className="bg-inset col-span-3 grid h-16 place-items-center text-sm" padded={false}>
col-span-3
</Card>
</Grid>
)
}
tsx
随断点变化
列数在不同断点下不同时,用 Tailwind 的断点类覆盖,例如 sm:grid-cols-4。cols 属性本身不接受响应式对象。
窄屏两列,宽屏四列
import { Card, Grid, Stack, Text } from '@hina-ui/react'
export default function Demo() {
return (
<Stack gap="sm" className="w-full max-w-2xl">
<Text tone="muted" size="sm">
窄屏两列,宽屏四列
</Text>
<Grid cols={2} className="sm:grid-cols-4">
{[1, 2, 3, 4, 5, 6, 7, 8].map(i => (
<Card key={i} className="bg-inset h-12" padded={false} />
))}
</Grid>
</Stack>
)
}
tsx
API
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cols | 1 到 12 | 1 | 列数 |
gap | 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'md' | 格子之间的间距 |
as | string | 'div' | 渲染的标签 |
className | string | — | 追加至容器的类名 |
| 属性 | 说明 |
|---|---|
children | 子元素 |