프론트엔드 개발자라면 누구나 경험하는 상황: 디자인 목업에는 24px이라고 되어 있는데 코드베이스는 rem을 사용합니다. 계산기를 열어 16으로 나누고, 한 시간 뒤에 같은 계산을 반복합니다. 전용 CSS 단위 변환기가 이 마찰을 완전히 해소합니다.

CSS 단위 전체 그림

CSS는 여러 단위 유형을 제공하며, 올바른 단위 선택이 접근성과 반응형 디자인에 실제로 영향을 미칩니다.

px — 절대 픽셀

픽셀은 가장 직관적인 단위입니다. font-size: 16px는 정확히 16 CSS 픽셀입니다. 그런데 “절대”라는 말은 오해를 줍니다——CSS 픽셀은 디바이스 픽셀이 아닙니다. 레티나 디스플레이에서는 1 CSS 픽셀이 두 개(이상)의 물리적 픽셀에 매핑됩니다.

px 사용처: 보더(border: 1px solid), 그림자, 사용자 폰트 설정에 따라 스케일되면 안 되는 것.

rem — 루트 em

1rem은 루트 <html> 요소의 폰트 크기와 같습니다. 기본값이 16px이므로 1.5rem = 24px입니다. 핵심 장점: 사용자가 접근성을 위해 브라우저 폰트 크기를 크게 하면, rem 기반 레이아웃이 비례하여 스케일됩니다.

html { font-size: 16px; }   /* 기본값 */
h1   { font-size: 2rem; }   /* 32px */
p    { font-size: 1rem; }   /* 16px */

rem 사용처: 폰트 크기, 스페이싱, 레이아웃 치수——사용자 접근성 설정을 존중해야 하는 모든 것.

em — 부모 em

1em현재 요소의 부모 폰트 크기와 같습니다. 이것은 복합됩니다: 이미 1.5em인 컨테이너 내부의 1.5em 폰트는 실효 크기가 2.25rem이 됩니다. 이 복합 동작은 강력하기도 하고 오류 원인이 되기도 합니다.

.card          { font-size: 1.25em; }   /* 부모가 16px이면 20px */
.card .caption { font-size: 0.8em;  }   /* 16px (0.8 × 20) */

em 사용처: 컴포넌트 자체 폰트 크기에 따라 스케일되어야 하는 컴포넌트 내부 스페이싱(예: 버튼 패딩).

vw와 vh — 뷰포트 단위

1vw는 뷰포트 너비의 1%; 1vh는 뷰포트 높이의 1%입니다. 풀스크린 레이아웃, 히어로 섹션, 유동적 타이포그래피에 이상적입니다.

.hero     { height: 100vh;  }
.headline { font-size: 5vw; }

주의: iOS Safari의 동적 툴바가 100vh 동작에 영향을 줍니다. 모바일 안전한 풀스크린 레이아웃에는 dvh(dynamic viewport height)를 사용하세요.

% — 퍼센트

퍼센트는 부모 요소의 해당 치수에 상대적입니다. width: 50%는 부모 너비의 절반을 의미합니다.

단위 간 변환 방법

기준값을 알면 계산은 간단합니다.

px → rem

rem = px / 루트 폰트 크기

기본 16px 루트에서:

pxrem
80.5
120.75
161
241.5
322
483

rem → px

px = rem × 루트 폰트 크기

px → vw

vw = (px / 뷰포트 너비) × 100

1440px 디자인 뷰포트에서 240px 요소는 240/1440 × 100 = 16.67vw.

온라인 CSS 단위 변환기

직접 계산하는 대신 브라우저 기반 도구를 사용하세요:

ZeroTool CSS 단위 변환기 사용해보기 →

임의의 단위(px, rem, em, vw, vh, pt, cm, mm, in)로 값을 입력하면 다른 모든 단위의 등가값이 즉시 표시됩니다. 프로젝트에 맞게 루트 폰트 크기와 뷰포트 치수를 설정할 수 있습니다.

모든 것이 브라우저 내에서 실행됩니다——데이터가 기기 밖으로 나가지 않습니다.

실용적인 워크플로

디자인 인수인계

디자이너가 Figma 기본값인 px로 스펙을 전달합니다. 스타일 토큰은 rem을 사용합니다. 변환기를 사용하면 전체 스페이싱 스케일을 몇 초 만에 일괄 변환할 수 있습니다.

접근성 감사

브라우저 폰트 크기를 20px로 변경하고 어떤 요소가 깨지는지 확인하세요. px로 크기가 지정된 요소는 리플로우되지 않습니다——그것이 수정 목록입니다. 해당 값을 rem으로 다시 작성할 때 변환기가 시간을 절약합니다.

clamp()를 이용한 반응형 타이포그래피

clamp()는 최솟값, 선호 값, 최댓값 세 가지를 받습니다. 단위 혼합이 일반적입니다:

font-size: clamp(1rem, 2.5vw, 2rem);

2.5vw 선호 값 선택: 800px 뷰포트에서 폰트를 20px로 하려면 20/800 × 100 = 2.5vw를 계산합니다. 변환기가 이 계산을 즉시 처리합니다.

rem vs em: 선택 기준

시나리오단위
본문 텍스트rem
제목rem
버튼 패딩 (버튼 폰트에 따라 스케일)em
카드 패딩 (카드 폰트에 따라 스케일)em
전역 스페이싱 스케일rem
미디어 쿼리 브레이크포인트em (브라우저 줌 호환성)

확장 가능한 시스템을 위한 CSS 커스텀 속성

기본 단위에서 파생된 CSS 변수로 스페이싱 스케일을 정의하는 것이 최선의 접근법입니다:

:root {
  --space-1: 0.25rem;   /* 4px */
  --space-2: 0.5rem;    /* 8px */
  --space-3: 0.75rem;   /* 12px */
  --space-4: 1rem;      /* 16px */
  --space-6: 1.5rem;    /* 24px */
  --space-8: 2rem;      /* 32px */
}

이 시스템에서 html { font-size }를 변경하면 전체 레이아웃이 스케일됩니다. CSS 단위 변환기는 디자인의 픽셀 값에서 스케일을 구축하는 데 도움이 됩니다.

요약

  • 폰트 크기와 전역 스페이싱에는 rem 사용——사용자 접근성 설정을 존중합니다.
  • 로컬 폰트 크기에 따라 스케일되어야 하는 컴포넌트 내부 스페이싱에는 em 사용.
  • 뷰포트 상대 레이아웃과 유동적 타이포그래피에는 vw/vh 사용.
  • 보더, 그림자, 절대로 스케일되면 안 되는 요소에는 px 사용.

px, rem, em, vw 등 CSS 단위 즉시 변환 →