네이밍 규칙
Atomic CSS에는 규칙이 단 하나뿐입니다. CSS 속성과 값에서 각 단어의 첫 글자를 뽑아 조합하면 그것이 바로 클래스명입니다. 이 원리만 이해하면 거의 모든 클래스를 유추할 수 있습니다.
핵심 공식
CSS 속성: 값 → 속성의 첫 글자들 + 값의 첫 글자들 = 클래스명
기본 규칙
숫자가 없는 키워드 값을 가진 속성은 첫 글자만 조합하면 됩니다.
작동 방식
display: flex
d(display)+f(flex)=dfjustify-content: center
j(justify)+c(content)+c(center)=jccalign-items: flex-start
a(align)+i(items)+f(flex)+s(start)=aifsflex-direction: column
f(flex)+d(direction)+c(column)=fdcmargin-top: 16px
m(margin)+t(top)+16px(값 + 단위)=mt16px| CSS | 분해 | 클래스 |
|---|---|---|
| display: flex | d(isplay) + f(lex) | df |
| display: grid | d(isplay) + g(rid) | dg |
| display: none | d(isplay) + n(one) | dn |
| display: block | d(isplay) + b(lock) | db |
| display: inline-block | d(isplay) + i(nline)-b(lock) | dib |
| justify-content: center | j(ustify)-c(ontent) + c(enter) | jcc |
| justify-content: space-between | j(ustify)-c(ontent) + s(pace)-b(etween) | jcsb |
| justify-content: flex-end | j(ustify)-c(ontent) + f(lex)-e(nd) | jcfe |
| align-items: center | a(lign)-i(tems) + c(enter) | aic |
| align-items: flex-start | a(lign)-i(tems) + f(lex)-s(tart) | aifs |
| align-items: flex-end | a(lign)-i(tems) + f(lex)-e(nd) | aife |
| flex-direction: column | f(lex)-d(irection) + c(olumn) | fdc |
| flex-direction: row | f(lex)-d(irection) + r(ow) | fdr |
| flex-wrap: wrap | f(lex)-w(rap) + w(rap) | fww |
| position: absolute | p(osition) + a(bsolute) | pa |
| position: relative | p(osition) + r(elative) | pr |
| position: fixed | p(osition) + f(ixed) | pf |
| position: sticky | p(osition) + s(ticky) | ps |
| overflow: hidden | o(verflow) + h(idden) | oh |
| overflow: auto | o(verflow) + a(uto) | oa |
| cursor: pointer | c(ursor) + p(ointer) | cp |
| cursor: default | c(ursor) + d(efault) | cd |
| text-align: center | t(ext)-a(lign) + c(enter) | tac |
| text-align: left | t(ext)-a(lign) + l(eft) | tal |
| text-decoration: none | t(ext)-d(ecoration) + n(one) | tdn |
| text-transform: uppercase | t(ext)-t(ransform) + u(ppercase) | ttu |
| white-space: nowrap | w(hite)-s(pace) + n(owrap) | wsn |
| text-overflow: ellipsis | t(ext)-o(verflow) + e(llipsis) | toe |
| object-fit: cover | o(bject)-f(it) + c(over) | ofc |
| user-select: none | u(ser)-s(elect) + n(one) | usn |
| pointer-events: none | p(ointer)-e(vents) + n(one) | pen |
| visibility: hidden | v(isibility) + h(idden) | vh |
핵심 포인트
패턴을 살펴보세요. flex-direction처럼 하이픈으로 이어진 CSS 단어는 글자를 두 개(f + d) 기여합니다. flex-start(f + s) 같은 값도 마찬가지입니다.
단위가 있는 속성
CSS 값에 숫자와 단위가 포함될 때는 속성 약어 바로 뒤에 붙입니다.
공식: {속성 약어}{숫자}{단위}
| CSS | 분해 | 클래스 |
|---|---|---|
| margin-top: 16px | m(argin)-t(op) + 16px | mt16px |
| margin-bottom: 2.4rem | m(argin)-b(ottom) + 2.4rem (소수점 → 하이픈) | mb2-4rem |
| padding: 16px | p(adding) + 16px | p16px |
| padding-left: 2rem | p(adding)-l(eft) + 2rem | pl2rem |
| font-size: 1.6rem | f(ont)-s(ize) + 1.6rem | fs1-6rem |
| gap: 8px | gap + 8px | gap8px |
| gap: 2rem | gap + 2rem | gap2rem |
| width: 100px | w(idth) + 100px | w100px |
| width: 50% | w(idth) + 50 + p(%) | w50p |
| height: 100vh | h(eight) + 100vh | h100vh |
| max-width: 120rem | max-w(idth) + 120rem | maxw120rem |
| min-height: 100vh | min-h(eight) + 100vh | minh100vh |
| border-radius: 8px | b(order)-r(adius) + 8px | br8px |
| line-height: 1.7 | l(ine)-h(eight) + 1.7 (소수점 → 하이픈) | lh1-7 |
| letter-spacing: 0.05em | l(etter)-s(pacing) + 0.05em | ls0-05em |
| top: 0 | t(op) + 0 | t0 |
| left: 50% | l(eft) + 50 + p(%) | l50p |
%는 p로 표기합니다
%는 CSS 클래스명에 쓸 수 없으므로 대신 p를 사용합니다. 예: w50p = width: 50%, h100p = height: 100%.
지원하는 단위
| 단위 | 용도 | 예시 |
|---|---|---|
| px | 픽셀 | w100px |
| p (%) | 퍼센트 | w50p |
| rem | 루트 em (1rem = 10px) | fs1-6rem |
| em | 상대 em | p1em |
| vh | 뷰포트 높이 | h100vh |
| vw | 뷰포트 너비 | w100vw |
| vmin | 뷰포트 최소 | w50vmin |
| vmax | 뷰포트 최대 | w50vmax |
| fr | 그리드 분할(fraction) | gtc1fr-2fr |
하이픈(-) 사용법
하이픈 문자(-)는 맥락에 따라 4가지 서로 다른 역할을 합니다. 이 차이를 이해하는 것이 핵심입니다.
1. 소수점
CSS 클래스명에는 점(.)을 쓸 수 없으므로 하이픈이 소수점을 대신합니다.
| 클래스 | CSS 출력 |
|---|---|
gap1-5rem | gap: 1.5rem |
fs1-4rem | font-size: 1.4rem |
lh1-7 | line-height: 1.7 |
ls0-05em | letter-spacing: 0.05em |
mt2-4rem | margin-top: 2.4rem |
2. 값 구분자 (Grid)
grid 클래스에서 하이픈은 여러 값을 구분하며, CSS에서는 공백으로 바뀝니다.
| 클래스 | CSS 출력 |
|---|---|
gtc1fr-2fr-1fr | grid-template-columns: 1fr 2fr 1fr |
gtc200px-auto-1fr | grid-template-columns: 200px auto 1fr |
gtrauto-1fr-auto | grid-template-rows: auto 1fr auto |
gtcr3-1fr | grid-template-columns: repeat(3, 1fr) |
gtcrfit-minmax28rem-1fr | grid-template-columns: repeat(auto-fit, minmax(28rem, 1fr)) |
3. 미디어 쿼리 접두사
브레이크포인트 접두사 뒤에 하이픈을 붙이면 해당 화면 크기에서만 클래스가 활성화됩니다.
| 클래스 | CSS 출력 |
|---|---|
sm-dn | @media (max-width: 768px) { display: none } |
md-fdc | @media (max-width: 1024px) { flex-direction: column } |
lg-gtcr2-1fr | @media (max-width: 1280px) { grid-template-columns: repeat(2, 1fr) } |
es-db | @media (max-width: 640px) { display: block } |
4. 가상 클래스 접두사
가상 클래스명 뒤에 하이픈을 붙이면 특정 상태에서 스타일이 적용됩니다.
| 클래스 | CSS 출력 |
|---|---|
hover-bg333333 | :hover { background-color: #333333 } |
hover-cFFFFFF | :hover { color: #FFFFFF } |
focus-bc6366F1 | :focus { border-color: #6366F1 } |
active-bg000000 | :active { background-color: #000000 } |
hover-o80 | :hover { opacity: 0.8 } |
어떻게 구분하나요?
맥락을 보면 명확합니다. 알려진 브레이크포인트 접두사(sm, md, lg...)로 시작하면 미디어 쿼리이고, hover·focus 등으로 시작하면 가상 클래스입니다. 숫자 사이에 있으면 소수점이거나 값 구분자입니다.
특수 접미사 & 접두사
i 접미사 = !important
아무 클래스 끝에 i를 붙이면 !important가 추가됩니다.
| 클래스 | CSS 출력 |
|---|---|
w100pxi | width: 100px !important |
dni | display: none !important |
mt0i | margin-top: 0 !important |
dfi | display: flex !important |
taci | text-align: center !important |
neg- 접두사 = 음수 값
neg-를 앞에 붙이면 음수 값이 됩니다.
| 클래스 | CSS 출력 |
|---|---|
neg-mt10px | margin-top: -10px |
neg-ml2rem | margin-left: -2rem |
neg-t5px | top: -5px |
neg-l10px | left: -10px |
neg-zi5 | z-index: -5 |
neg-order1 | order: -1 |
p = 퍼센트(%)
p를 단위 접미사로 써서 %를 표현합니다.
| 클래스 | CSS 출력 |
|---|---|
w50p | width: 50% |
w100p | width: 100% |
h100p | height: 100% |
l50p | left: 50% |
t50p | top: 50% |
maxw80p | max-width: 80% |
중의성 해소
일부 약어는 여러 CSS 속성에 대응됩니다. 핵심 규칙은 단위의 유무가 어떤 속성을 가리키는지 결정한다는 것입니다.
| 클래스 | CSS | 이유 |
|---|---|---|
fs0 | flex-shrink: 0 | 단위 없음 = flex-shrink |
fs1 | flex-shrink: 1 | 단위 없음 = flex-shrink |
fs16px | font-size: 16px | 단위 있음 = font-size |
fs1-6rem | font-size: 1.6rem | 단위 있음 = font-size |
pr | position: relative | 단위 없음 = position |
pr16px | padding-right: 16px | 단위 있음 = padding-right |
br4px | border-radius: 4px | 단위 있음 = border-radius |
br50p | border-radius: 50% | 단위 있음 = border-radius |
fg1 | flex-grow: 1 | 단위 없이 숫자만 = flex-grow |
fw600 | font-weight: 600 | 단위 없이 100-900 범위 = font-weight |
기억하세요
단위 없음 = 키워드 속성(flex-shrink, position 등), 단위 있음 = 크기 속성(font-size, padding-right, border-radius 등). 이 원칙은 시스템 전체에서 일관되게 적용됩니다.
모든 CSS 속성 유추하기
네이밍 규칙은 보편적입니다. 문서화되지 않은 클래스라도 규칙으로 유추할 수 있습니다. 다양한 CSS 속성에 걸친 예시를 살펴보세요.
| CSS | 분해 | 클래스 |
|---|---|---|
| table-layout: fixed | t(able)-l(ayout) + f(ixed) | tlf |
| border-collapse: collapse | b(order)-c(ollapse) + c(ollapse) | bcc |
| object-fit: cover | o(bject)-f(it) + c(over) | ofc |
| object-fit: contain | o(bject)-f(it) + c(on)t(ain) | ofct |
| white-space: nowrap | w(hite)-s(pace) + n(owrap) | wsn |
| white-space: pre-wrap | w(hite)-s(pace) + p(re)-w(rap) | wspw |
| text-overflow: ellipsis | t(ext)-o(verflow) + e(llipsis) | toe |
| word-break: break-all | w(ord)-b(reak) + b(reak)-a(ll) | wbba |
| overflow-wrap: break-word | o(verflow)-w(rap) + b(reak)-w(ord) | owbw |
| backface-visibility: hidden | b(ack)f(ace)-v(isibility) + h(idden) | bfvh |
| box-sizing: border-box | b(ox)-si(z)ing + b(order)-b(ox) | bxzbb |
| list-style-type: none | l(ist)-s(tyle) + n(one) | lsn |
| resize: none | r(esi)z(e) + n(one) | rzn |
| appearance: none | app(earance) + n(one) | appn |
| background-size: cover | b(ackground)-s(ize) + c(over) | bsc |
| background-attachment: fixed | bg(background)-a(ttachment) + f(ixed) | bgaf |
| vertical-align: middle | v(ertical)-a(lign) + m(iddle) | vam |
| caption-side: bottom | c(aption)-s(ide) + b(ottom) | csb |
프로 팁
확신이 서지 않을 때는 MCP 도구(lookup_class, search_by_css)로 유추를 검증하세요. 이 규칙은 95% 이상의 경우에 들어맞습니다.
색상 네이밍
색상은 속성 접두사 뒤에 색상 값(HEX 또는 RGBA)을 붙입니다.
HEX 색상 (6자리)
| 접두사 | 속성 | 예시 | CSS 출력 |
|---|---|---|---|
| c | color | cFFFFFF | color: #FFFFFF |
| c | color | c333333 | color: #333333 |
| bg | background-color | bgFFFFFF | background-color: #FFFFFF |
| bg | background-color | bg000000 | background-color: #000000 |
| bc | border-color | bcDDDDDD | border-color: #DDDDDD |
| bc | border-color | bc6366F1 | border-color: #6366F1 |
RGBA 색상
형식: {접두사}{R}-{G}-{B}-{투명도}, 투명도는 0-100 범위입니다(0.0-1.0에 매핑).
| 클래스 | CSS 출력 |
|---|---|
c255-0-0-100 | color: rgba(255, 0, 0, 1) |
c0-0-0-50 | color: rgba(0, 0, 0, 0.5) |
bg0-0-0-50 | background-color: rgba(0, 0, 0, 0.5) |
bg255-255-255-80 | background-color: rgba(255, 255, 255, 0.8) |
bg99-102-241-10 | background-color: rgba(99, 102, 241, 0.1) |
불투명도
| 클래스 | CSS 출력 |
|---|---|
o0 | opacity: 0 |
o50 | opacity: 0.5 |
o80 | opacity: 0.8 |
o100 | opacity: 1 |
빠른 참조
금방 외우게 될, 가장 자주 쓰는 클래스들입니다.
<!-- Flexbox center -->
<div class="df jcc aic">centered content</div>
<!-- Flex column with gap -->
<div class="df fdc gap16px">stacked items</div>
<!-- Header: logo left, nav right -->
<header class="df jcsb aic px2rem py16px">
<div>Logo</div>
<nav class="df gap2rem">links</nav>
</header>
<!-- Grid 3 columns -->
<div class="dg gtcr3-1fr gap2rem">cards</div>
<!-- Responsive: 3col → 1col -->
<div class="dg gtcr3-1fr sm-gtc1fr gap2rem">cards</div>
<!-- Responsive show/hide -->
<div class="db sm-dn">desktop only</div>
<div class="dn sm-db">mobile only</div>
<!-- Hover button -->
<button class="bg6366F1 hover-bg4F46E5 cFFFFFF py12px px2rem br8px bn cp tall200msease">
Click me
</button>
<!-- Absolute positioned overlay -->
<div class="pr">
<div class="pa t0 l0 w100p h100p bg0-0-0-50 df jcc aic">overlay</div>
</div>
<!-- Text ellipsis (single line) -->
<p class="wsn oh toe">very long text that will be truncated...</p>팁
핵심부터 시작하세요
이 10개 클래스를 먼저 외우세요: df, dg, dn, jcc, aic, fdc, pr, pa, oh, cp. 거의 모든 컴포넌트에서 쓰게 됩니다.
MCP 도구로 검증하세요
확실하지 않을 때는 lookup_class로 클래스가 무엇을 출력하는지 확인하거나, search_by_css로 특정 CSS 속성에 맞는 클래스를 찾으세요.
규칙은 일관적입니다
예외는 거의 없습니다. 규칙 하나(첫 글자 조합)만 익히면 수천 개의 클래스를 유추할 수 있습니다. 이 시스템은 설계상 예측 가능합니다.
연습하면 빨라집니다
컴포넌트 몇 개만 만들어 보면 df jcc aic를 생각 없이 타이핑하게 됩니다. 대부분의 개발자는 하루 정도 실제로 써보면 익숙해집니다.