Box 容器组件 #

什么是 Box? #

Box 是 Chakra UI 最基础的布局组件,它是一个带样式的 div 元素,支持所有的 Style Props。Box 是构建其他组件的基础。

jsx
import { Box } from '@chakra-ui/react'

function Example() {
  return (
    <Box
      p={4}
      bg="blue.500"
      color="white"
      borderRadius="md"
    >
      这是一个 Box
    </Box>
  )
}

基本用法 #

简单容器 #

jsx
<Box>
  内容区域
</Box>

带样式的容器 #

jsx
<Box
  p={4}
  m={2}
  bg="gray.100"
  borderRadius="md"
  shadow="md"
>
  带样式的 Box
</Box>

常用属性 #

间距 #

jsx
<Box p={4}>内边距 16px</Box>
<Box m={4}>外边距 16px</Box>
<Box px={4} py={2}>水平内边距 16px,垂直内边距 8px</Box>
<Box mx="auto">水平居中</Box>

尺寸 #

jsx
<Box w="100%" h="100px">
  宽度 100%,高度 100px
</Box>

<Box w="200px" h="200px">
  固定尺寸 200x200
</Box>

<Box maxW="container.md" mx="auto">
  最大宽度 768px,水平居中
</Box>

颜色 #

jsx
<Box bg="blue.500" color="white">
  蓝色背景,白色文字
</Box>

<Box bg="linear-gradient(to right, blue.500, purple.500)">
  渐变背景
</Box>

边框 #

jsx
<Box border="1px solid" borderColor="gray.200">
  边框盒子
</Box>

<Box borderWidth="2px" borderStyle="dashed" borderColor="blue.500">
  虚线边框
</Box>

<Box borderRadius="lg">
  大圆角
</Box>

<Box borderRadius="full">
  完全圆形
</Box>

阴影 #

jsx
<Box shadow="sm">小阴影</Box>
<Box shadow="md">中等阴影</Box>
<Box shadow="lg">大阴影</Box>
<Box shadow="xl">超大阴影</Box>

布局示例 #

卡片 #

jsx
<Box
  maxW="sm"
  borderWidth="1px"
  borderRadius="lg"
  overflow="hidden"
  bg="white"
  shadow="md"
>
  <Box p={6}>
    <Box fontWeight="bold" fontSize="xl" mb={2}>
      卡片标题
    </Box>
    <Box color="gray.500">
      卡片描述内容
    </Box>
  </Box>
</Box>

分隔区域 #

jsx
<Box>
  <Box p={4} bg="gray.100">
    头部区域
  </Box>
  <Box p={4} bg="white">
    内容区域
  </Box>
  <Box p={4} bg="gray.100">
    底部区域
  </Box>
</Box>

居中容器 #

jsx
<Box
  display="flex"
  alignItems="center"
  justifyContent="center"
  h="100vh"
>
  <Box p={8} bg="white" shadow="lg" borderRadius="lg">
    居中内容
  </Box>
</Box>

伪类样式 #

Hover 效果 #

jsx
<Box
  p={4}
  bg="blue.500"
  color="white"
  borderRadius="md"
  cursor="pointer"
  transition="all 0.2s"
  _hover={{
    bg: 'blue.600',
    transform: 'translateY(-2px)',
    shadow: 'lg',
  }}
>
  悬停查看效果
</Box>

Focus 效果 #

jsx
<Box
  p={4}
  borderWidth="2px"
  borderColor="gray.200"
  borderRadius="md"
  tabIndex={0}
  _focus={{
    borderColor: 'blue.500',
    shadow: 'outline',
  }}
>
  可聚焦的 Box
</Box>

Active 效果 #

jsx
<Box
  p={4}
  bg="blue.500"
  color="white"
  borderRadius="md"
  cursor="pointer"
  _active={{
    bg: 'blue.700',
    transform: 'scale(0.98)',
  }}
>
  点击查看效果
</Box>

响应式设计 #

响应式尺寸 #

jsx
<Box
  w={{
    base: '100%',
    md: '50%',
    lg: '25%',
  }}
  p={{
    base: 2,
    md: 4,
    lg: 6,
  }}
>
  响应式 Box
</Box>

响应式显示 #

jsx
<Box display={{ base: 'block', md: 'none' }}>
  仅在移动端显示
</Box>

<Box display={{ base: 'none', md: 'block' }}>
  仅在桌面端显示
</Box>

组合使用 #

作为其他组件的基础 #

jsx
<Box
  as="button"
  p={4}
  bg="blue.500"
  color="white"
  borderRadius="md"
  _hover={{ bg: 'blue.600' }}
>
  作为按钮使用
</Box>

<Box
  as="a"
  href="#"
  p={4}
  color="blue.500"
  _hover={{ textDecoration: 'underline' }}
>
  作为链接使用
</Box>

<Box
  as="section"
  p={8}
  bg="gray.50"
>
  作为 section 使用
</Box>

嵌套布局 #

jsx
<Box p={4} bg="gray.100">
  <Box p={4} bg="white" borderRadius="md">
    <Box fontWeight="bold" mb={2}>
      标题
    </Box>
    <Box color="gray.600">
      内容
    </Box>
  </Box>
</Box>

定位 #

相对定位 #

jsx
<Box position="relative" h="200px" bg="gray.100">
  <Box position="absolute" top={4} right={4} bg="blue.500" color="white" p={2}>
    绝对定位元素
  </Box>
</Box>

固定定位 #

jsx
<Box
  position="fixed"
  bottom={0}
  left={0}
  right={0}
  bg="white"
  p={4}
  shadow="lg"
>
  固定底部栏
</Box>

粘性定位 #

jsx
<Box
  position="sticky"
  top={0}
  bg="white"
  p={4}
  shadow="sm"
  zIndex="sticky"
>
  粘性导航栏
</Box>

溢出处理 #

jsx
<Box overflow="hidden" maxH="100px">
  内容超出时隐藏
</Box>

<Box overflow="auto" maxH="200px">
  内容超出时滚动
</Box>

<Box overflowX="auto" whiteSpace="nowrap">
  水平滚动内容
</Box>

实用示例 #

头像组件 #

jsx
function Avatar({ src, name, size = 'md' }) {
  const sizes = {
    sm: '32px',
    md: '48px',
    lg: '64px',
  }
  
  return (
    <Box
      w={sizes[size]}
      h={sizes[size]}
      borderRadius="full"
      overflow="hidden"
      bg="gray.200"
    >
      {src ? (
        <Box as="img" src={src} alt={name} w="100%" h="100%" objectFit="cover" />
      ) : (
        <Box
          display="flex"
          alignItems="center"
          justifyContent="center"
          h="100%"
          fontWeight="bold"
          color="gray.500"
        >
          {name.charAt(0)}
        </Box>
      )}
    </Box>
  )
}

标签组件 #

jsx
function Tag({ children, colorScheme = 'gray' }) {
  return (
    <Box
      display="inline-block"
      px={2}
      py={1}
      fontSize="sm"
      fontWeight="medium"
      borderRadius="md"
      bg={`${colorScheme}.100`}
      color={`${colorScheme}.800`}
    >
      {children}
    </Box>
  )
}

分割线 #

jsx
<Box as="hr" border="none" h="1px" bg="gray.200" my={4} />

Box 属性速查表 #

属性类别 常用属性
间距 m, mt, mr, mb, ml, mx, my, p, pt, pr, pb, pl, px, py
尺寸 w, h, minW, maxW, minH, maxH
颜色 bg, color, opacity
边框 border, borderColor, borderRadius, borderWidth
布局 display, position, overflow, zIndex
Flex flex, flexDir, justify, align, wrap, gap
变换 transform, transformOrigin
动画 transition, animation

下一步 #

现在你已经掌握了 Box 组件,接下来学习 Flex 弹性布局,了解如何使用 Flexbox 布局!

最后更新:2026-03-28