조건부 스타일

조건부 스타일 (Conditional Styles)

의사 상태(pseudo state), 미디어 쿼리, 커스텀 data 속성에 따른 스타일을 조건부 style prop으로 작성하는 방법을 알려드려요. 반응형이고 상태 기반인 UI를 만들 때 핵심이에요.

출처: 문서

본문

개요

Chakra를 사용하면 조건부 style prop으로 의사 상태, 미디어 쿼리, 커스텀 data 속성에 대한 스타일을 작성할 수 있어요.

:::note

아래 내장 조건 목록을 참고하세요.

:::

사용법

예를 들어 버튼에 마우스를 올렸을 때 배경색을 바꾸는 방법은 다음과 같아요.

<Box bg="red.500" _hover={{ bg: "red.700" }}>
  Hover me
</Box>

중첩 조건

조건값은 중첩해서 복잡한 선택자 규칙을 만들 수 있어요.

호버 상태에서 포커스 상태일 때 배경색을 바꾸는 방법은 다음과 같아요.

<Box bg={{ base: "red.500", _hover: { _focus: "red.700" } }}>
  Hover & Focus me
</Box>

At 규칙

지원되는 at-rule(@media, @layer, @container, @supports, @page)에서도 동작해요.

<Box
  css={{
    "@container (min-width: 10px)": {
      color: "green.300",
    },
  }}
>
  Hello
</Box>

의사 클래스

Hover, Active, Focus, Disabled

요소의 hover, active, focus, disabled 상태를 스타일링하는 예시예요.

<chakra.button
  _hover={{ bg: "red.700" }}
  _active={{ bg: "red.900" }}
  _focus={{ bg: "red.800" }}
  _disabled={{ opacity: "0.5" }}
>
  Hover me > Hover me
</chakra.button>

First, Last, Odd, Even

리스트에서 첫 번째, 마지막, 홀수, 짝수 요소를 스타일링하는 예시예요.

<Box as="ul">
  {items.map((item) => (
    <Box
      as="li"
      key={item}
      _first={{ color: "red.500" }}
      _last={{ color: "red.800" }}
    >
      {item}
    </Box>
  ))}
</Box>

_even과 _odd 수정자를 사용해서 짝수/홀수 요소도 스타일링할 수 있어요.

<table>
  <tbody>
    {items.map((item) => (
      <chakra.tr key={item} _even={{ bg: "gray.100" }} _odd={{ bg: "white" }}>
        <td>{item}</td>
      </chakra.tr>
    ))}
  </tbody>
</table>

의사 요소

Before와 After

요소의 ::before와 ::after 의사 요소를 스타일링하려면 _before와 _after 수정자를 사용해요.

<Box _before={{ content: '"👋"' }} _after={{ content: '"🥂"' }}>
  Hello
</Box>

Placeholder

input이나 textarea의 placeholder 텍스트를 스타일링하려면 _placeholder 수정자를 사용해요.

<chakra.input
  placeholder="Enter your name"
  _placeholder={{ color: "gray.500" }}
/>

파일 입력

파일 입력 버튼을 스타일링하려면 _file 수정자를 사용해요.

<chakra.input
  type="file"
  _file={{ bg: "gray.500", px: "4", py: "2", marginEnd: "3" }}
/>

미디어 쿼리

모션 줄이기

사용자의 모션 선호도에 따라 요소를 스타일링하려면 _motionReduce와 _motionSafe 수정자를 사용해요.

<Box _motionSafe={{ transition: "all 0.3s" }}>Hello</Box>

색상 스킴

prefers-color-scheme 미디어 기능은 사용자가 시스템에 밝은/어두운 색 테마를 요청했는지 감지할 때 사용돼요.

사용자의 색상 스킴 선호도에 따라 요소를 스타일링하려면 _osLight와 _osDark 수정자를 사용해요.

<chakra.div bg={{ base: "white", _osDark: "black" }}>Hello</chakra.div>

색상 대비

prefers-contrast 미디어 기능은 사용자가 시스템에 높거나 낮은 대비 테마를 요청했는지 감지할 때 사용돼요.

사용자의 색상 대비 선호도에 따라 요소를 스타일링하려면 _highContrast와 _lessContrast 수정자를 사용해요.

<Box bg={{ base: "white", _highContrast: "black" }}>Hello</Box>

방향

orientation 미디어 기능은 사용자 기기가 세로(portrait)인지 가로(landscape) 모드인지 감지할 때 사용돼요.

기기 방향에 따라 요소를 스타일링하려면 _portrait와 _landscape 수정자를 사용해요.

<Box pb="4" _portrait={{ pb: "8" }}>
  Hello
</Box>

선택자

임의 선택자

임의의 선택자를 쓰려면 css prop으로 일회성 선택자 스타일을 작성해요.

<Box css={{ "&[data-state=closed]": { color: "red.300" } }} />

부모 요소의 자식 요소를 대상으로 하는 또 다른 예시예요.

<Box
  css={{
    "& > *": { margin: "2" },
  }}
/>

그룹 선택자

부모 요소의 상태나 속성에 따라 요소를 스타일링하려면 부모 요소에 group 클래스를 추가하고, 자식 요소에서 _group* 수정자를 사용해요.

<div className="group">
  <Text _groupHover={{ bg: "red.500" }}>Hover me</Text>
</div>

이 수정자는 _groupHover, _groupActive, _groupFocus, _groupDisabled 등 모든 의사 클래스 수정자에서 동작해요.

형제 선택자

형제 요소의 상태나 속성에 따라 요소를 스타일링하려면 형제 요소에 peer 클래스를 추가하고, 대상 요소에서 _peer* 수정자를 사용해요.

<div>
  <p className="peer">Hover me</p>
  <Box _peerHover={{ bg: "red.500" }}>I'll change by bg</Box>
</div>

참고: 이 기능은 peer로 표시된 요소가 이전 형제(즉, 스타일링하려는 요소보다 앞에 오는 요소)일 때만 동작해요.

Data 속성

LTR과 RTL

텍스트 방향에 따라 요소를 스타일링하려면 _ltr과 _rtl 수정자를 사용해요.

<div dir="ltr">
  <Box _ltr={{ ml: "3" }} _rtl={{ mr: "3" }}>
    Hello
  </Box>
</div>

State

data-{state} 속성에 따라 요소를 스타일링하려면 해당하는 _{state} 수정자를 사용해요.

<Box data-loading _loading={{ bg: "gray.500" }}>
  Hello
</Box>

이것은 data-active, data-disabled, data-focus, data-hover, data-invalid, data-required, data-valid 같은 일반적인 상태에서 동작해요.

<Box data-active _active={{ bg: "gray.500" }}>
  Hello
</Box>

방향

data-orientation 속성에 따라 요소를 스타일링하려면 _horizontal과 _vertical 수정자를 사용해요.

<Box
  data-orientation="horizontal"
  _horizontal={{ bg: "red.500" }}
  _vertical={{ bg: "blue.500" }}
>
  Hello
</Box>

ARIA 속성

aria-{state}=true 속성에 따라 요소를 스타일링하려면 해당하는 _{state} prop을 사용해요.

<Box aria-expanded="true" _expanded={{ bg: "gray.500" }}>
  Hello
</Box>

참고

Chakra에서 사용할 수 있는 모든 조건 prop 목록이에요.

커스터마이징

Chakra는 나만의 조건을 만들 수 있게 해줘서 기본 preset에 있는 것에 제한되지 않아요. 조건 커스터마이징에 대해 더 알아보려면 여기를 참고하세요.

더 알아보기 (Learn more)