Flex 弹性布局组件 #
什么是 Flex? #
Flex 是一个基于 CSS Flexbox 的布局组件,它简化了 Flexbox 的使用,让你能够快速构建灵活的响应式布局。
jsx
import { Flex } from '@chakra-ui/react'
function Example() {
return (
<Flex justify="center" align="center" h="100vh">
<Box>居中内容</Box>
</Flex>
)
}
基本用法 #
Flex 容器 #
jsx
<Flex>
<Box>项目 1</Box>
<Box>项目 2</Box>
<Box>项目 3</Box>
</Flex>
带间距的 Flex #
jsx
<Flex gap={4}>
<Box>项目 1</Box>
<Box>项目 2</Box>
<Box>项目 3</Box>
</Flex>
Flex 属性 #
flexDirection 方向 #
jsx
<Flex flexDirection="row">
<Box>水平排列(默认)</Box>
</Flex>
<Flex flexDirection="row-reverse">
<Box>反向水平排列</Box>
</Flex>
<Flex flexDirection="column">
<Box>垂直排列</Box>
</Flex>
<Flex flexDirection="column-reverse">
<Box>反向垂直排列</Box>
</Flex>
justifyContent 主轴对齐 #
jsx
<Flex justify="flex-start">起点对齐</Flex>
<Flex justify="flex-end">终点对齐</Flex>
<Flex justify="center">居中对齐</Flex>
<Flex justify="space-between">两端对齐</Flex>
<Flex justify="space-around">环绕对齐</Flex>
<Flex justify="space-evenly">均匀对齐</Flex>
alignItems 交叉轴对齐 #
jsx
<Flex align="flex-start">起点对齐</Flex>
<Flex align="flex-end">终点对齐</Flex>
<Flex align="center">居中对齐</Flex>
<Flex align="stretch">拉伸对齐</Flex>
<Flex align="baseline">基线对齐</Flex>
flexWrap 换行 #
jsx
<Flex wrap="nowrap">不换行(默认)</Flex>
<Flex wrap="wrap">换行</Flex>
<Flex wrap="wrap-reverse">反向换行</Flex>
gap 间距 #
jsx
<Flex gap={2}>间距 8px</Flex>
<Flex gap={4}>间距 16px</Flex>
<Flex gap={6}>间距 24px</Flex>
<Flex gap="20px">自定义间距</Flex>
常用布局示例 #
水平居中 #
jsx
<Flex justify="center" align="center" h="200px" bg="gray.100">
<Box p={4} bg="blue.500" color="white">
水平垂直居中
</Box>
</Flex>
导航栏 #
jsx
<Flex justify="space-between" align="center" p={4} bg="white" shadow="sm">
<Box fontWeight="bold" fontSize="xl">
Logo
</Box>
<Flex gap={4}>
<Link href="#">首页</Link>
<Link href="#">功能</Link>
<Link href="#">价格</Link>
</Flex>
<Button colorScheme="blue">登录</Button>
</Flex>
卡片列表 #
jsx
<Flex wrap="wrap" gap={6}>
{items.map((item) => (
<Box key={item.id} p={4} bg="white" shadow="md" borderRadius="lg" flex="1 1 300px">
{item.title}
</Box>
))}
</Flex>
侧边栏布局 #
jsx
<Flex h="100vh">
<Box w="250px" bg="gray.800" color="white" p={4}>
侧边栏
</Box>
<Box flex="1" bg="gray.100" p={4}>
主内容区
</Box>
</Flex>
页脚 #
jsx
<Flex justify="space-between" align="center" p={4} bg="gray.100">
<Box color="gray.600">© 2024 Company</Box>
<Flex gap={4}>
<Link href="#">隐私政策</Link>
<Link href="#">服务条款</Link>
<Link href="#">联系我们</Link>
</Flex>
</Flex>
Flex 子元素属性 #
flex 属性 #
jsx
<Flex>
<Box flex="1">flex: 1</Box>
<Box flex="2">flex: 2</Box>
<Box flex="1">flex: 1</Box>
</Flex>
flexGrow #
jsx
<Flex>
<Box flexGrow={0}>不增长</Box>
<Box flexGrow={1}>自动增长</Box>
</Flex>
flexShrink #
jsx
<Flex>
<Box flexShrink={0}>不收缩</Box>
<Box flexShrink={1}>可收缩</Box>
</Flex>
flexBasis #
jsx
<Flex>
<Box flexBasis="200px">基础宽度 200px</Box>
<Box flexBasis="auto">自动</Box>
</Flex>
alignSelf #
jsx
<Flex h="200px" align="center">
<Box alignSelf="flex-start">顶部对齐</Box>
<Box>居中</Box>
<Box alignSelf="flex-end">底部对齐</Box>
</Flex>
order #
jsx
<Flex>
<Box order={3}>第一(order: 3)</Box>
<Box order={1}>第二(order: 1)</Box>
<Box order={2}>第三(order: 2)</Box>
</Flex>
响应式 Flex #
响应式方向 #
jsx
<Flex
direction={{
base: 'column',
md: 'row'
}}
gap={4}
>
<Box>项目 1</Box>
<Box>项目 2</Box>
<Box>项目 3</Box>
</Flex>
响应式对齐 #
jsx
<Flex
justify={{
base: 'center',
md: 'space-between'
}}
>
<Box>项目 1</Box>
<Box>项目 2</Box>
</Flex>
响应式间距 #
jsx
<Flex
gap={{
base: 2,
md: 4,
lg: 6
}}
>
<Box>项目 1</Box>
<Box>项目 2</Box>
</Flex>
实用示例 #
表单行 #
jsx
function FormRow({ label, children }) {
return (
<Flex align="center" gap={4} mb={4}>
<Box w="120px" fontWeight="medium">
{label}
</Box>
<Box flex="1">
{children}
</Box>
</Flex>
)
}
标签组 #
jsx
function TagGroup({ tags }) {
return (
<Flex wrap="wrap" gap={2}>
{tags.map((tag) => (
<Tag key={tag}>{tag}</Tag>
))}
</Flex>
)
}
头像组 #
jsx
function AvatarGroup({ users, max = 4 }) {
const visible = users.slice(0, max)
const remaining = users.length - max
return (
<Flex>
{visible.map((user, index) => (
<Box
key={user.id}
ml={index > 0 ? '-8px' : 0}
borderRadius="full"
border="2px solid white"
>
<Avatar src={user.avatar} size="sm" />
</Box>
))}
{remaining > 0 && (
<Box
ml="-8px"
borderRadius="full"
border="2px solid white"
bg="gray.200"
w="32px"
h="32px"
display="flex"
alignItems="center"
justifyContent="center"
fontSize="xs"
fontWeight="bold"
>
+{remaining}
</Box>
)}
</Flex>
)
}
分页组件 #
jsx
function Pagination({ current, total, onChange }) {
return (
<Flex justify="center" align="center" gap={2}>
<Button
size="sm"
isDisabled={current === 1}
onClick={() => onChange(current - 1)}
>
上一页
</Button>
{Array.from({ length: total }, (_, i) => i + 1).map((page) => (
<Button
key={page}
size="sm"
colorScheme={current === page ? 'blue' : 'gray'}
onClick={() => onChange(page)}
>
{page}
</Button>
))}
<Button
size="sm"
isDisabled={current === total}
onClick={() => onChange(current + 1)}
>
下一页
</Button>
</Flex>
)
}
面包屑 #
jsx
function Breadcrumb({ items }) {
return (
<Flex align="center" gap={2}>
{items.map((item, index) => (
<Flex key={index} align="center">
{index > 0 && <ChevronRightIcon mx={2} color="gray.400" />}
<Link
href={item.href}
color={index === items.length - 1 ? 'gray.800' : 'blue.500'}
fontWeight={index === items.length - 1 ? 'medium' : 'normal'}
>
{item.label}
</Link>
</Flex>
))}
</Flex>
)
}
Flex 属性速查表 #
| 属性 | 简写 | CSS 属性 | 值 |
|---|---|---|---|
| flexDirection | flexDir | flex-direction | row, column, row-reverse, column-reverse |
| justifyContent | justify | justify-content | flex-start, center, flex-end, space-between, space-around |
| alignItems | align | align-items | flex-start, center, flex-end, stretch, baseline |
| flexWrap | wrap | flex-wrap | nowrap, wrap, wrap-reverse |
| alignContent | - | align-content | flex-start, center, flex-end, stretch |
| gap | - | gap | 0-96, 像素值 |
下一步 #
现在你已经掌握了 Flex 组件,接下来学习 Grid 网格布局,了解如何使用 CSS Grid 构建复杂布局!
最后更新:2026-03-28