Part 2: 커스텀 프로퍼티(Custom Properties) — 진짜 변수의 힘
Sass 변수와 완전히 다른 CSS 커스텀 프로퍼티의 개념과 활용법을 배웁니다. 런타임 변경, 상속, JavaScript 제어, 다크모드 구현까지 실전 예제를 중심으로 설명합니다.
Part 2: 커스텀 프로퍼티(Custom Properties) — 진짜 변수의 힘
Part 1에서 선택자와 특정도를 배웠습니다. 이제부터는 실제로 코드를 더 깔끔하고 유지보수하기 쉽게 만들어주는 강력한 기능들을 하나씩 알아보겠습니다. 그중에서도 가장 먼저 배워야 할 것이 바로 커스텀 프로퍼티(Custom Properties)입니다.
많은 개발자들이 Sass나 Less 같은 전처리기를 사용하면서 $primary-color나 $font-size-base 같은 변수를 사용해왔습니다. CSS에도 이제 비슷한 개념이 공식적으로 들어왔는데, 이름은 커스텀 프로퍼티입니다. 그런데 이 기능은 단순히 Sass 변수를 대체하는 수준이 아니라, 여러 면에서 훨씬 더 강력하고 유연합니다.
이번 파트에서는 커스텀 프로퍼티의 기본 사용법부터 시작해서, Sass 변수와의 차이점, 실전에서 어떻게 활용하는지까지 자세히 알아보겠습니다.
1. 커스텀 프로퍼티란?
AD
제휴 광고 · 일부 링크는 수수료를 받을 수 있습니다
커스텀 프로퍼티는 개발자가 직접 이름을 붙여 값을 저장하고, 필요할 때 불러서 사용하는 CSS의 변수 기능입니다. 기존 CSS 속성과 구분하기 위해 반드시 --로 시작하는 이름을 사용해야 합니다.
:root {
--primary-color: #0a66c2;
--text-color: #111827;
--border-radius: 12px;
--card-shadow: 0 10px 15px rgb(0 0 0 / 0.1);
--spacing-unit: 8px;
}
:root는 HTML 문서의 최상위 요소를 선택하는 특수한 선택자입니다. 여기서 변수를 선언하면 전체 문서 어디에서든 해당 변수를 사용할 수 있습니다.
2. var() 함수로 값 불러오기
선언한 커스텀 프로퍼티는 var() 함수를 사용해서 불러올 수 있습니다.
.btn-primary {
background-color: var(--primary-color);
color: white;
border-radius: var(--border-radius);
padding: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 3);
box-shadow: var(--card-shadow);
}
.card {
border-radius: var(--border-radius);
box-shadow: var(--card-shadow);
padding: calc(var(--spacing-unit) * 3);
}
이렇게 하면 같은 값을 여러 곳에서 반복해서 작성할 필요가 없어집니다. 나중에 색상이나 간격을 변경하고 싶을 때 :root 안의 값만 수정하면 전체가 한 번에 바뀌는 장점이 있습니다.
3. Sass 변수와 커스텀 프로퍼티의 결정적 차이
많은 사람들이 “Sass 변수랑 비슷한 거 아니야?”라고 생각하지만, 실제로는 큰 차이가 있습니다. 아래 표를 통해 비교해보겠습니다.
| 구분 | Sass 변수 ($var) | CSS 커스텀 프로퍼티 (--var) |
|---|---|---|
| 값이 결정되는 시점 | 빌드(컴파일)할 때 결정됨 | 런타임(브라우저 실행 중)에도 변경 가능 |
| 상속 | 상속되지 않음 | 자식 요소로 상속됨 |
| 미디어 쿼리에서 변경 | 불가능 | 가능 |
| JavaScript로 제어 | 불가능 | 가능 |
| 다크모드 대응 | 상대적으로 어려움 | 매우 쉬움 |
가장 큰 차이점은 런타임에 값을 변경할 수 있다는 점입니다. Sass 변수는 컴파일이 끝나면 일반 CSS 값으로 고정되지만, 커스텀 프로퍼티는 브라우저가 실행되는 동안에도 값을 동적으로 바꿀 수 있습니다.
4. 실전 예제: 다크모드 구현
AD
제휴 광고 · 일부 링크는 수수료를 받을 수 있습니다
데이톡 - 매일 100만 회원과 새로운 인연
커스텀 프로퍼티를 사용하면 다크모드를 매우 깔끔하고 효율적으로 구현할 수 있습니다.
:root {
--bg-color: #ffffff;
--text-color: #111827;
--card-bg: #ffffff;
--border-color: #e5e7eb;
}
@media (prefers-color-scheme: dark) {
:root {
--bg-color: #0f172a;
--text-color: #f1f5f9;
--card-bg: #1e293b;
--border-color: #334155;
}
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.card {
background-color: var(--card-bg);
border: 1px solid var(--border-color);
}
이 코드의 핵심은 @media (prefers-color-scheme: dark) 안에서 :root의 커스텀 프로퍼티 값을 다시 정의했다는 점입니다. 이렇게 하면 사용자의 시스템 설정에 따라 색상이 자동으로 전환됩니다.
5. 컴포넌트 단위로 커스텀 프로퍼티 사용하기
커스텀 프로퍼티는 전역뿐만 아니라 컴포넌트 단위로도 유용하게 사용할 수 있습니다.
.user-card {
--padding: 24px;
--avatar-size: 64px;
--title-size: 1.1rem;
padding: var(--padding);
}
.user-card.compact {
--padding: 16px;
--avatar-size: 48px;
--title-size: 1rem;
}
이렇게 하면 .compact 클래스를 붙이는 것만으로 패딩, 아바타 크기, 제목 크기가 한 번에 조절됩니다. 나중에 값을 변경하고 싶을 때도 변수 하나만 수정하면 됩니다.
6. JavaScript로 커스텀 프로퍼티 제어하기
커스텀 프로퍼티는 JavaScript에서도 쉽게 읽고 쓸 수 있다는 큰 장점이 있습니다.
// 값 변경하기
document.documentElement.style.setProperty('--primary-color', '#e11d48');
// 현재 값 읽어오기
const currentColor = getComputedStyle(document.documentElement)
.getPropertyValue('--primary-color')
.trim();
이 기능은 테마 변경, 사용자 설정 저장, 실시간 미리보기 등에서 매우 강력하게 활용됩니다.
7. 초보자가 자주 하는 실수
:root대신 특정 선택자에만 변수를 선언해서 상속이 제대로 되지 않는 경우var(--color, #000)처럼 fallback 값을 넣는 것을 잊는 경우- 변수 이름을 너무 길거나 일관성 없이 지어서 나중에 관리하기 어려워지는 경우
- 커스텀 프로퍼티를 너무 많이 만들어서 오히려 코드가 복잡해지는 경우
8. 정리
AD
제휴 광고 · 일부 링크는 수수료를 받을 수 있습니다
이번 파트에서 배운 내용을 정리하면 다음과 같습니다:
- 커스텀 프로퍼티는
--로 시작하는 이름을 가진 CSS 변수입니다. :root에 선언하면 전역에서 사용할 수 있습니다.var()함수로 값을 불러옵니다.- Sass 변수와 달리 런타임에 값을 변경할 수 있고, 상속이 되며, JavaScript로 제어할 수 있습니다.
- 다크모드, 테마 변경, 컴포넌트 커스터마이징에 매우 유용합니다.
다음 파트에서는 CSS 네스팅(Nesting)과 & 선택자에 대해 자세히 알아보겠습니다. 이 기능이 바로 많은 사람들이 “이제 Sass가 필요 없을 수도 있겠다”고 느끼게 만든 핵심입니다.
AD
제휴 광고
일부 링크는 제휴 링크이며, 구매 또는 가입 시 일정 수수료를 받을 수 있습니다.
AD






