CSS Custom Properties 활용 가이드

개요

현대 웹 개발에서 스타일 일관성 유지와 유지보수 효율성은 핵심 과제입니다. CSS Custom Properties(일명 CSS 변수)는 이러한 문제를 해결하는 강력한 도구로, 동적 테마 적용과 컴포넌트 기반 스타일링에 탁월합니다.

선언 방식

CSS 변수는 하이픈 두 개(--)로 시작하는 고유한 구문을 사용합니다. 전역 범위에서 사용하려면 :root 선택자에 정의하는 것이 일반적입니다.

:root {
  --brand-main: #6366f1;
  --brand-accent: #f43f5e;
  --spacing-unit: 8px;
}

지역 범위에서는 특정 선택자 내부에 선언하여 해당 요소와 자손에서만 접근 가능하게 할 수 있습니다.

.card-component {
  --card-radius: 12px;
  --card-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  
  border-radius: var(--card-radius);
  box-shadow: var(--card-shadow);
}

값 참조와 연산

var() 함수로 변수 값을 불러오며, 두 번째 인자로 대체값(fallback)을 지정할 수 있습니다.

.button-primary {
  background: var(--brand-main, #3b82f6);
  padding: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 3);
}

변수끼리 중첩 참조도 가능합니다:

:root {
  --ratio: 1.618;
  --base: 1rem;
  --scale-lg: calc(var(--base) * var(--ratio));
}

상속과 우선순위

CSS 변수는 캐스케이딩의 영향을 받습니다. 동일한 이름의 변수가 여러 레벨에 존재하면, 가장 가까운 조상의 값을 상속받습니다.

.theme-dark {
  --surface-bg: #18181b;
  --text-primary: #fafafa;
}

.theme-light {
  --surface-bg: #ffffff;
  --text-primary: #18181b;
}

.panel {
  background-color: var(--surface-bg);
  color: var(--text-primary);
}

JavaScript와의 상호작용

CSS 변수는 DOM API를 통해 런타임에 조작 가능합니다. 이 특성으로 실시간 테마 전환이나 사용자 설정 반영이 용이합니다.

// 변수 값 읽기
const accent = getComputedStyle(document.documentElement)
  .getPropertyValue('--brand-accent').trim();

// 변수 값 갱신
document.documentElement.style.setProperty('--brand-accent', '#10b981');

활용 전략

  • 디자인 토큰 체계화: 색상, 타이포그래피, 간격 등을 변수화하여 디자인 시스템의 단일 진실 공원 확보
  • 반응형 구현: 미디어 쿼리에서 변수 값만 교체하여 일관된 비율 유지
  • 컴포넌트 변형: 수정자 클래스로 변수만 덮어씌워 스타일 변형 생성
@media (min-width: 768px) {
  :root {
    --spacing-unit: 12px;
    --container-max: 1200px;
  }
}

.badge {
  --badge-tone: var(--brand-main);
}

.badge-success {
  --badge-tone: #22c55e;
}

.badge-warning {
  --badge-tone: #eab308;
}

태그: CSS CSS-Variables Custom-Properties Design-Tokens Frontend-Architecture

7월 24일 02:37에 게시됨