CSS if(): 스마트한 스타일링을 위한 인라인 조건

발행: (2026년 6월 9일 AM 06:24 GMT+9)
7 분 소요
원문: Dev.to

출처: Dev.to

원래 danholloran.me에 게시되었습니다.
모든 CSS 개발자가 한 번쯤 겪는 순간이 있습니다. 뷰포트 너비, 사용자 선호도, 커스텀 프로퍼티 등 어떤 조건에 따라 단일 속성을 조정하고 싶지만, 깔끔한 한 줄 코드 대신 새로운 @media 블록을 만들고, 선택자를 중복시키며, 경우에 따라 가장자리 케이스를 처리하기 위해 약간의 JavaScript까지 넣게 됩니다. 동작은 하지만 절대 옳게 느껴지지는 않죠.

if() 함수가 그 문제를 해결합니다. Chrome 137에 도입된 이 함수는 인라인 조건 로직을 속성 선언 안으로 직접 가져와, 속성 자체를 떠나지 않고도 분기 스타일 로직을 표현할 수 있게 해줍니다.

문법

조건‑값 쌍을 위에서 아래로 순차적으로 평가하여 일치하는 것이 있으면 적용합니다.

property: if(condition: value; else: fallback);

함수는 세 가지 종류의 조건을 지원합니다.

  • style() — 계산된 CSS 커스텀 프로퍼티 값을 조회
  • media() — 인라인 미디어 쿼리 실행
  • supports() — CSS 속성이나 구문을 기능 감지

else 로 체이닝할 수 있습니다.

button {
  padding: if(media(width >= 1024px): 0.5rem 1.5rem; else: 0.75rem 1.25rem);
}

위 코드는 추가 @media 블록 없이 반응형 패딩 규칙을 구현한 예시입니다.

포인터 미디어 피처 활용

마우스 사용자와 터치스크린 사용자를 구분할 수 있습니다. 접근성을 위한 최소 탭 대상은 44 px이며, 마우스 사용자는 더 작게 설정할 수 있습니다.

.icon-button {
  width: if(media(any-pointer: fine): 32px; else: 44px);
  height: if(media(any-pointer: fine): 32px; else: 44px);
}

예전이라면 @media (any-pointer: coarse) 블록을 별도로 작성해야 했지만, 이제는 한 속성 안에 두 상태를 명시하는 형태가 됩니다.

커스텀 프로퍼티와 디자인 토큰

디자인 토큰—테마 플래그, 컴포넌트 변형, 상태 값—을 전달하기 위해 커스텀 프로퍼티를 자주 사용합니다. style() 쿼리를 이용하면 인라인으로 분기할 수 있습니다.

.status-badge {
  --status: pending;

  background: if(
    style(--status: complete): #22c55e; style(--status: error): #ef4444;
      else: #f59e0b
  );
  color: if(style(--status: complete): #fff; else: #111);
}

--status 를 캐스케이드 어디에서든(데이터 속성, 부모 클래스, JavaScript 등) 설정하면 배지는 규칙 자체를 수정하지 않아도 자동으로 변합니다.

기능 감지와 @supports 대체

이전에는 @supports 래퍼 블록을 만들어 일반 규칙을 복제해야 했습니다. 인라인에서는 훨씬 간결합니다.

.hero {
  background-color: if(
    supports(color: oklch(0.7 0.2 180)): oklch(0.7 0.2 180);
      else: hsl(180deg 40% 55%)
  );
}

최신 브라우저는 인지적으로 균일한 oklch 색상을, 구형 브라우저는 안전한 hsl 폴백을 하나의 선언만으로 받게 됩니다.

지원 현황 (2026년 중반 기준)

  • Chrome 137+, Edge, Opera (Chromium 기반) 지원
  • Firefox 지원 진행 중
  • Safari는 2026‑2027년에 도입 예정

따라서 아직 구조적인 부분에 if() 를 의존해서는 안 됩니다.

권장 사용 패턴

안전한 기본값을 먼저 작성하고, @supports 가드 뒤에 if() 를 레이어링합니다.

/* 모든 브라우저에 대한 안전한 기본값 */
.card {
  padding: 1rem;
}

/* if() 를 지원하는 브라우저에 대한 향상된 패딩 */
@supports (padding: if(media(width >= 768px): 1.5rem; else: 1rem)) {
  .card {
    padding: if(media(width >= 768px): 1.5rem; else: 1rem);
  }
}

현재는 다소 중복돼 보이지만, 기능이 표준이 되면 @supports 블록은 자연스럽게 사라집니다. 이는 CSS 스크롤‑드리븐 애니메이션이나 앵커 포지셔닝이 지원이 확대될 때 사용했던 점진적 향상 패턴과 동일합니다.

언제 사용하면 좋은가?

if()@media 블록을 완전히 대체하지는 않습니다. 복잡한 브레이크포인트 로직을 다수의 속성에 적용할 때는 전용 규칙이 더 가독성이 좋습니다. 하지만 다음과 같은 작은 조건부 경우에 강력합니다.

  • 터치 대상 크기 조정
  • 상태 플래그에 따른 색상 교체
  • 최신 색 공간이 사용 가능할 때 팔레트 업그레이드

마무리

이 기능은 아직 실험 단계이므로, 브라우저 지원이 확대될수록 MDN 문서와 CSS‑Tricks 보도를 꾸준히 확인하세요. 하지만 이미 Chrome 137+ 환경에서 개발 중이라면, 위험도가 낮고 점진적으로 향상시킬 수 있는 부분에 적용해 보면서 어떻게 작동하는지 체험해 보는 것이 좋습니다.

이 글은 원래 danholloran.me에 게시되었습니다. 더 많은 프론트엔드·개발 콘텐츠는 해당 사이트를 팔로우하세요.

0 조회
Back to Blog

관련 글

더 보기 »