Contents
see List작성일 2025. 11. 30.
CSS 변수 (Custom Properties) 활용
CSS 변수(Custom Properties)는 스타일시트 전체에서 재사용할 수 있는 값을 정의하는 기능입니다. JavaScript로 동적 제어가 가능하고, 테마 시스템 구축에 필수적인 기술입니다.
언제 사용하나요?
- 다크모드/라이트모드 테마 구현
- 일관된 디자인 시스템 구축
- 반복되는 색상, 크기 값 관리
- JavaScript와 CSS 간 값 공유
기본 문법
/* 변수 선언 (--로 시작) */
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--font-size-base: 16px;
--spacing-unit: 8px;
--border-radius: 4px;
--shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* 변수 사용 */
.button {
background-color: var(--primary-color);
padding: calc(var(--spacing-unit) * 2);
border-radius: var(--border-radius);
box-shadow: var(--shadow);
}
/* 기본값 지정 */
.card {
color: var(--text-color, #333);
}다크모드 구현
/* 라이트 테마 (기본) */
:root {
--bg-color: #ffffff;
--text-color: #333333;
--card-bg: #f5f5f5;
--border-color: #e0e0e0;
}
/* 다크 테마 */
[data-theme="dark"] {
--bg-color: #1a1a1a;
--text-color: #f0f0f0;
--card-bg: #2d2d2d;
--border-color: #404040;
}
/* 시스템 설정 따르기 */
@media (prefers-color-scheme: dark) {
:root {
--bg-color: #1a1a1a;
--text-color: #f0f0f0;
}
}
/* 적용 */
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.card {
background: var(--card-bg);
border: 1px solid var(--border-color);
}JavaScript로 제어
// 변수 값 읽기
const root = document.documentElement;
const primaryColor = getComputedStyle(root)
.getPropertyValue("--primary-color");
// 변수 값 변경
root.style.setProperty("--primary-color", "#e74c3c");
// 테마 토글
function toggleTheme() {
const current = document.body.dataset.theme;
document.body.dataset.theme =
current === "dark" ? "light" : "dark";
localStorage.setItem("theme", document.body.dataset.theme);
}
// 저장된 테마 적용
document.body.dataset.theme =
localStorage.getItem("theme") || "light";컴포넌트 스코프
/* 컴포넌트별 변수 오버라이드 */
.btn {
--btn-bg: var(--primary-color);
--btn-color: white;
--btn-padding: 10px 20px;
background: var(--btn-bg);
color: var(--btn-color);
padding: var(--btn-padding);
}
.btn--secondary {
--btn-bg: var(--secondary-color);
}
.btn--outline {
--btn-bg: transparent;
--btn-color: var(--primary-color);
}
.btn--large {
--btn-padding: 15px 30px;
}디자인 토큰 시스템
:root {
/* 기본 색상 */
--color-blue-50: #eff6ff;
--color-blue-500: #3b82f6;
--color-blue-900: #1e3a8a;
/* 시맨틱 토큰 */
--color-primary: var(--color-blue-500);
--color-bg: var(--color-blue-50);
/* 타이포그래피 */
--font-xs: 0.75rem;
--font-sm: 0.875rem;
--font-base: 1rem;
--font-lg: 1.125rem;
--font-xl: 1.25rem;
/* 스페이싱 (4px 기반) */
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-4: 1rem;
--space-8: 2rem;
/* 브레이크포인트 참조용 */
--breakpoint-sm: 640px;
--breakpoint-md: 768px;
--breakpoint-lg: 1024px;
}calc()와 함께 사용
.container {
--container-padding: 20px;
width: calc(100% - var(--container-padding) * 2);
padding: var(--container-padding);
}
.grid {
--gap: 16px;
--columns: 3;
display: grid;
gap: var(--gap);
grid-template-columns:
repeat(var(--columns), 1fr);
}
@media (max-width: 768px) {
.grid {
--columns: 2;
--gap: 12px;
}
}애니메이션 변수
:root {
--transition-fast: 150ms;
--transition-normal: 300ms;
--transition-slow: 500ms;
--ease-out: cubic-bezier(0, 0, 0.2, 1);
}
.button {
transition: all var(--transition-normal) var(--ease-out);
}브라우저 지원
모든 최신 브라우저 지원 (IE 미지원). IE 대응 시 PostCSS 플러그인 사용.
html
| No | 작성일 | Title |
|---|---|---|
| 3364 | 2026. 08. 16. | HTML 폼 오류를 누구나 이해하게 만드는 방법: label·aria-describedby·aria-live 실전 가이드 |
| 3332 | 2026. 08. 07. | CSS @layer로 스타일 충돌 줄이기: 대규모 웹 프로젝트 우선순위 설계 가이드 |
| 3300 | 2026. 07. 30. | CSS Container Query 실전 적용: 컴포넌트가 놓인 영역에 맞춰 반응형 만들기 |
| 3269 | 2026. 07. 22. | 접근성 있는 모달 만들기: HTML dialog와 포커스 관리 실전 가이드 |
| 3241 | 2026. 07. 14. | 반응형 이미지 최적화: picture·srcset·sizes로 모바일 전송량 줄이기 |
| 3186 | 2026. 07. 05. | HTML Popover API로 자바스크립트 드롭다운 메뉴 줄이기 |
| 3144 | 2026. 06. 27. | CSS 컨테이너 쿼리 운영 가이드: 화면이 아니라 컴포넌트 폭에 맞춰 레이아웃 바꾸기 |
| 3088 | 2026. 06. 19. | 접근성 있는 모달 창 구현: dialog, focus, 닫기 동작을 함께 설계하기 |
| 2999 | 2026. 06. 11. | HTML 폼 검증 운영 가이드: 브라우저 기본 검증과 서버 검증을 함께 설계하기 |
| 2943 | 2026. 06. 03. | CSS 컨테이너 쿼리 실전 적용: 화면이 아니라 컴포넌트 너비에 맞춰 카드 레이아웃 바꾸기 |