颜色模式 #

基本配置 #

配置 ColorModeScript #

在应用入口添加 ColorModeScript

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

function App() {
  return (
    <>
      <ColorModeScript initialColorMode="light" />
      <App />
    </>
  )
}

配置主题 #

jsx
import { extendTheme, type ThemeConfig } from '@chakra-ui/react'

const config: ThemeConfig = {
  initialColorMode: 'light',
  useSystemColorMode: false,
}

const theme = extendTheme({ config })

使用颜色模式 #

useColorMode Hook #

jsx
import { useColorMode, Button } from '@chakra-ui/react'

function ColorModeToggle() {
  const { colorMode, toggleColorMode } = useColorMode()

  return (
    <Button onClick={toggleColorMode}>
      {colorMode === 'light' ? '切换到深色模式' : '切换到浅色模式'}
    </Button>
  )
}

useColorModeValue #

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

function Example() {
  const bgColor = useColorModeValue('gray.100', 'gray.700')
  const textColor = useColorModeValue('gray.800', 'white')

  return (
    <Box bg={bgColor} color={textColor}>
      根据颜色模式自动切换样式
    </Box>
  )
}

全局样式配置 #

jsx
const theme = extendTheme({
  config: {
    initialColorMode: 'light',
    useSystemColorMode: true,
  },
  styles: {
    global: (props) => ({
      body: {
        bg: props.colorMode === 'dark' ? 'gray.900' : 'white',
        color: props.colorMode === 'dark' ? 'white' : 'gray.800',
      },
    }),
  },
})

组件颜色模式 #

jsx
const theme = extendTheme({
  components: {
    Button: {
      baseStyle: (props) => ({
        bg: props.colorMode === 'dark' ? 'blue.300' : 'blue.500',
        color: props.colorMode === 'dark' ? 'gray.800' : 'white',
      }),
    },
  },
})

实用示例 #

完整切换按钮 #

jsx
import { useColorMode, IconButton } from '@chakra-ui/react'
import { SunIcon, MoonIcon } from '@chakra-ui/icons'

function ColorModeButton() {
  const { colorMode, toggleColorMode } = useColorMode()

  return (
    <IconButton
      aria-label="切换颜色模式"
      icon={colorMode === 'light' ? <MoonIcon /> : <SunIcon />}
      onClick={toggleColorMode}
      variant="ghost"
    />
  )
}

响应式颜色 #

jsx
function ThemedCard({ children }) {
  const bg = useColorModeValue('white', 'gray.800')
  const borderColor = useColorModeValue('gray.200', 'gray.600')
  const textColor = useColorModeValue('gray.800', 'white')

  return (
    <Box
      bg={bg}
      borderColor={borderColor}
      color={textColor}
      borderWidth="1px"
      borderRadius="lg"
      p={6}
    >
      {children}
    </Box>
  )
}

配置选项 #

选项 说明
initialColorMode 初始颜色模式 light, dark
useSystemColorMode 使用系统颜色模式 boolean

下一步 #

现在你已经掌握了颜色模式,接下来学习 响应式设计,了解如何构建响应式布局!

最后更新:2026-03-28