CSS 단위 변환기

px·rem·em 변환 + clamp()·aspect-ratio 자동 생성.

2026년 9월 기준 점검W3C CSS Values and Units 4(rem·vw·dvh·clamp)·CSS Text 4(letter-spacing)·CSS Box Sizing 4(aspect-ratio)·CSS 2.1(line-height) 정의 기준출처 W3C CSS Values and Units Level 4(새 창) ·W3C CSS Text Module Level 4(새 창) ·W3C CSS Box Sizing Level 4(새 창) ·W3C CSS 2.1 line-height(새 창)작성 리만 (Youtil 운영자)

변환 결과
root 16px · parent 16px · viewport 1440×900 · % 기준 부모 글꼴 16px
단위결과값CSS 선언
px24pxfont-size: 24px;
rem1.5remfont-size: 1.5rem;
em1.5emfont-size: 1.5em;
%150%font-size: 150%;
vw1.6667vwfont-size: 1.6667vw;
vh2.6667vhfont-size: 2.6667vh;
가이드

알아두면 좋은 내용

리만 작성 · Youtil 운영자 소개
최종 업데이트 2026.09.26 · 읽는 시간 약 14분

CSS 단위 핵심 공식 참조표

변환공식예시 (root 16px)
px → rempx ÷ rootFontSize24px = 1.5rem
rem → pxrem × rootFontSize1.5rem = 24px
px → empx ÷ parentFontSize24px = 1.5em
px → %(px ÷ 기준) × 100 — font-size는 부모 글꼴, width 등은 부모 너비font-size 24px ÷ 16px = 150%
px → vw(px ÷ viewportWidth) × 10024px ÷ 1440px ≈ 1.67vw
px → vh(px ÷ viewportHeight) × 10024px ÷ 900px ≈ 2.67vh

변환기는 어떤 단위로 입력하든 먼저 px로 바꾼 뒤(입력값 × 원래 단위의 기준) 각 단위의 기준으로 다시 나눕니다. 그래서 기준값 패널의 root·parent·viewport·부모 크기를 바꾸면 모든 행이 한꺼번에 다시 계산됩니다. 주의할 곳은 %입니다 — 같은 24px도 어느 속성이냐에 따라 기준이 달라집니다. 기본값(root·parent 16px, 뷰포트 1440×900, 부모 크기 100px)으로 계산하면 font-size 24px은 1.5rem · 150% · 1.6667vw · 2.6667vh이고, 같은 24px을 width로 보면 rem·vw 값은 그대로지만 %는 부모 크기 기준이라 24%가 됩니다.

px → rem 조견표 (root 16px)

아래 표는 root font-size 16px 기준의 px ÷ 16 산술입니다. 한 가지 주의 — 16px은 CSS 표준이 정한 수치가 아닙니다. W3C 명세(CSS Values Level 4)는 rem을 “루트 요소 font-size와 같다”로만 정의하고 숫자를 정하지 않으며, 16px은 주요 브라우저의 기본 글꼴 크기 관행이라 사용자 설정으로 바뀔 수 있습니다. rem을 쓰는 이유가 정확히 이 지점입니다 — 사용자가 브라우저 설정에서 기본 글꼴을 20px로 키우면 px로 고정한 텍스트는 그대로지만, rem으로 쓴 텍스트는 20 ÷ 16 = 1.25배로 함께 커져 사용자의 선택을 존중합니다.

pxrem흔한 쓰임
4px0.25rem간격 스케일 최소 단위 — Tailwind 1단위와 동일
8px0.5rem기본 간격
12px0.75rem캡션·라벨
13px0.8125rem본문 보조
14px0.875rem모바일 본문
16px1rem루트 기준값 — 브라우저 관행 기본
20px1.25rem소제목·리드 문장
24px1.5remh3·아이콘
32px2remh2
40px2.5rem대형 제목
48px3rem히어로 타이틀

13px = 0.8125rem처럼 암산이 지저분한 값도 표 그대로 쓰면 됩니다. 루트 font-size가 16px이 아닌 프로젝트라면 위 변환기에서 root 값을 바꿔 다시 계산하세요.

rem vs em 완전 비교

항목remem
기준root(html) font-size자기 font-size (font-size 속성에서는 부모)
상속일관성 유지중첩 시 누적되어 복잡
사용처전역 크기 조절컴포넌트 내부 상대 크기
추천 상황font-size, spacing아이콘, 버튼 내부 padding

이 변환기의 em 계산은 ‘parent font-size’를 기준으로 합니다. font-size에 쓰는 em이라면 그대로 맞고, padding·margin처럼 다른 속성에 쓰는 em은 명세상 그 요소 자신의 font-size가 기준이므로 parent 칸에 해당 요소의 글자 크기를 넣고 계산하세요.

px→rem 62.5% 트릭(1rem = 10px)의 함정

html에 font-size: 62.5%를 선언하면 브라우저 기본 16px × 0.625 = 10px가 되어 1.6rem = 16px, 2.4rem = 24px처럼 암산이 쉬워집니다. 문제는 rem이 문서 전체에 적용되는 전역 기준이라는 점입니다. Shadow DOM 내부의 rem까지 예외 없이 바뀌므로, 1rem = 16px를 전제로 만들어진 서드파티 코드가 전부 62.5% 크기로 줄어듭니다.

html { font-size: 62.5%; } /* 1rem = 10px */ /* 내 코드 — 의도대로 */ h1 { font-size: 3.2rem; } /* 32px ✅ */ /* 1rem = 16px 전제의 서드파티 — 함께 축소 */ .btn { font-size: 1rem; } /* 기대 16px → 실제 10px ❌ */ .p-4 { padding: 1rem; } /* Tailwind 4단위, 기대 16px → 10px ❌ */

타이포그래피·여백 기본값을 rem으로 정의한 Bootstrap 5, spacing 1단위 = 0.25rem인 Tailwind CSS, rem을 쓰는 임베드 위젯(댓글·결제창 등)이 대표적인 충돌 지점입니다. 게다가 이 트릭은 프로젝트 전체를 한 번에 바꾸는 일괄 전환만 가능해, 이미 rem이 섞인 코드베이스에 점진적으로 도입할 수 없습니다. 62.5%가 고정 font-size: 10px 선언보다 나은 점은 사용자의 브라우저 글꼴 크기 설정에 비례해 확대된다는 것 하나인데, 루트를 100%로 두어도 같은 이점을 얻습니다. 결론적으로 외부 CSS를 전부 통제할 수 없다면 루트를 100%(16px)로 유지하고 px ÷ 16 나눗셈은 변환기에 맡기는 편이 안전합니다 — 이 변환기의 root font-size 기본값이 16인 이유입니다.

Tailwind와 rem — spacing scale·임의값

Tailwind의 spacing 유틸리티는 rem 기반입니다. v3 공식 문서의 명문은 “spacing 1단위 = 0.25rem, 일반적인 브라우저 기본값에서 4px” — v4는 같은 결과를 테마 변수 --spacing: 0.25rem에 숫자를 곱하는 방식으로 만듭니다(2026-07 v3·v4 문서 기준). 단위가 rem이므로 위에서 본 ‘사용자 글꼴 설정 존중’이 유틸리티 전체에 자동으로 적용됩니다.

/* spacing: 1단위 = 0.25rem (root 16px일 때 4px) */ p-1 = 0.25rem = 4px p-4 = 1rem = 16px p-2 = 0.5rem = 8px p-6 = 1.5rem = 24px p-3 = 0.75rem = 12px p-8 = 2rem = 32px /* v4 내부 구현 — 테마 변수 × 숫자 */ --spacing: 0.25rem; .p-4 { padding: calc(var(--spacing) * 4); }

스케일에 없는 값은 대괄호 임의값(arbitrary value) 문법으로 즉석 생성합니다. 공식 문서 예시는 top-[117px]·text-[22px]이고, w-[13px]처럼 어느 유틸리티에나 같은 문법이 통하며 lg:top-[344px]처럼 반응형·상태 수정자와도 결합됩니다. 다만 공식 문서가 임의값을 소개하는 맥락 자체가 “배경 이미지를 딱 맞는 자리에 놓기 위해 top: 117px이 정말로 필요할 때” — 즉 1회용 탈출구입니다. 같은 값이 여러 곳에서 반복된다면 임의값을 복붙하기보다 테마 변수로 등록해 일반 유틸리티처럼 쓰는 편이 유지보수에 낫습니다.

clamp() 완전 가이드

clamp(최솟값, 선호값, 최댓값)은 뷰포트 크기에 따라 값을 부드럽게 변화시키면서도 안전한 상·하한을 보장합니다. 생성기는 두 점(최소 뷰포트에서 최솟값, 최대 뷰포트에서 최댓값)을 지나는 직선을 구해 선호값을 ‘rem + vw’ 형태로 적습니다.

/* 선호값 계산 (선형 보간) */ slope = (maxPx - minPx) / (maxVw - minVw) intercept = minPx - slope × minVw preferred = `${intercept/16}rem + ${slope*100}vw` /* 결과 예시 — 360~1440px, 16→32px */ clamp(1rem, 0.6667rem + 1.4815vw, 2rem) → 360px 화면: 16px (최솟값) → 1440px 화면: 32px (최댓값) → 그 사이: 부드럽게 변화

검산: 기울기는 (32 − 16) ÷ (1440 − 360) = 0.0148…이므로 뷰포트가 100px 넓어질 때마다 글자는 1.4815px씩 커지고(그래서 선호값의 vw 계수가 기울기 × 100 = 1.4815vw), 절편은 16 − 0.0148… × 360 = 10.667px = 0.6667rem입니다. 뷰포트 900px이라면 10.667 + 0.014815 × 900 ≈ 24px로, 정확히 16과 32의 중간값이 나옵니다.

Chrome 79+Firefox 75+Safari 13.1+IE 미지원

타이포 스케일 실전 — h1~캡션 clamp() 세트

위 선형 보간 공식을 실제 타이포 단계에 적용한 세트입니다. 뷰포트 기준은 360~1440px — 이 페이지 clamp() 생성기의 기본값과 같아서, 같은 px를 입력하면 아래와 동일한 코드가 나옵니다. CSS Values Level 4 정의대로 clamp(MIN, VAL, MAX)는 max(MIN, min(VAL, MAX))와 같은 값이므로, 선호값(가운데 vw 식)이 어떤 값이 되어도 결과는 항상 MIN~MAX 사이로 잘립니다. 이 등가식을 그대로 계산해 보면, 실수로 MIN을 MAX보다 크게 지정했을 때 바깥쪽 max()가 마지막에 적용되어 MIN이 이긴다는 것도 도출됩니다.

단계크기 (360→1440px)clamp() 코드
h128 → 42pxclamp(1.75rem, 1.4583rem + 1.2963vw, 2.625rem)
h222 → 32pxclamp(1.375rem, 1.1667rem + 0.9259vw, 2rem)
h318 → 24pxclamp(1.125rem, 1rem + 0.5556vw, 1.5rem)
본문14 → 16pxclamp(0.875rem, 0.8333rem + 0.1852vw, 1rem)
캡션12 → 13pxclamp(0.75rem, 0.7292rem + 0.0926vw, 0.8125rem)

단계가 내려갈수록 vw 계수(기울기)가 작아지는 점에 주목하세요 — 본문·캡션은 360→1440px 전 구간에서 각각 2px·1px만 변합니다. 변화 폭이 이 정도로 작은 단계는 clamp() 없이 고정 rem으로 두는 선택도 실용적입니다. 큰 제목일수록 유동의 이득이 크고, 작은 글자일수록 고정이 단순합니다.

100vh 모바일 주소창 문제 — dvh·svh·lvh

모바일 브라우저의 주소창은 스크롤에 따라 나타났다 사라지지만, 기존 100vh는 주소창이 접힌 가장 큰 화면 기준으로 계산되는 경우가 대부분입니다. 그래서 첫 화면에서 100vh 요소의 하단 — 고정 버튼·CTA — 이 주소창에 가려지는 문제가 생깁니다. CSS Values Level 4는 이를 해결하는 세 가지 뷰포트 높이 단위를 추가했습니다.

단위기준적합한 곳
100svh주소창이 모두 표시된 가장 작은 화면첫 화면 히어로·하단 고정 버튼 — 절대 가려지지 않음
100lvh주소창이 접힌 가장 큰 화면배경·장식 레이어 — 기존 모바일 100vh와 사실상 동일
100dvh지금 실제로 보이는 높이(실시간 변동)풀스크린 모달·채팅 입력창 — 스크롤 중 리사이즈 주의

기존 vh를 dvh로 바꿔야 하는 경우는 스크롤 중에도 요소가 항상 보이는 영역과 일치해야 할 때뿐입니다. dvh는 주소창이 움직일 때마다 다시 계산되므로 대형 레이아웃이나 font-size에 쓰면 스크롤 중 요소가 계속 늘었다 줄었다 합니다. 첫 화면 잘림만 문제라면 svh가 더 안정적입니다. px→vh 공식(px ÷ viewportHeight × 100)은 세 단위에 그대로 적용되며 기준 높이만 달라집니다.

/* 구형 브라우저 폴백 — 아랫줄이 지원되면 덮어씀 */ .hero { height: 100vh; height: 100dvh; }
Chrome 108+Firefox 101+Safari 15.4+
100vw는 스크롤바 폭을 포함합니다
가로 방향에도 비슷한 함정이 있습니다. CSS Values Level 4는 루트의 overflow가 스크롤바를 항상 띄우는 값(overflow: scroll 등)이 아니면 뷰포트 단위를 스크롤바가 없다고 가정하고 계산하도록 정합니다. 그래서 스크롤바가 자리를 차지하는 데스크톱 환경(윈도우의 기본 스크롤바 등)에서 width: 100vw 요소는 스크롤바 폭만큼 넘쳐 가로 스크롤이 생깁니다. 전체 폭이 필요하면 100vw 대신 width: 100%를 쓰세요.

aspect-ratio vs padding-top trick

현행 방법 (aspect-ratio)

.box { aspect-ratio: 16 / 9; }

장점: 직관적, 코드 단순, 자식 배치 자유
단점: IE 미지원

구형 방법 (padding-top)

.wrapper { position: relative; padding-top: 56.25%; } .content { position: absolute; inset: 0; }

장점: 모든 브라우저 지원
단점: 코드 복잡, absolute 포지셔닝 필요

padding-top 방식이 동작하는 이유는 CSS에서 세로 padding의 %도 부모의 너비를 기준으로 계산되기 때문입니다. 16:9라면 9 ÷ 16 × 100 = 56.25%, 4:3이라면 75%, 21:9라면 약 42.86%입니다. aspect-ratio는 너비나 높이 중 하나가 정해져 있을 때만 나머지를 계산하므로, 둘 다 고정값을 주면 비율이 무시된다는 점도 기억해 두세요.

line-height unitless 권장 이유

unitless(단위 없는) line-height는 자식 요소에 상속될 때 자식의 font-size로 재계산됩니다. 반면 em·%는 계산된 px값이 그대로 상속되어 의도와 달라질 수 있습니다.

/* 부모 */ .parent { font-size: 20px; line-height: 1.5; } /* 자식 */ .child { font-size: 12px; } /* unitless (1.5) → 자식 line-height = 12px × 1.5 = 18px ✅ */ /* em (1.5em) → 자식 line-height = 20px × 1.5 = 30px ❌ (부모 값 그대로 상속) */ /* % (150%) → 자식 line-height = 20px × 1.5 = 30px ❌ */

Figma → CSS 변환 치트시트

Figma 표기CSS 변환
letter-spacing 5%letter-spacing: 0.05em
line-height 150%line-height: 1.5
font 16px · line-height 24pxline-height: 1.5 (24 ÷ 16)
width ratio 16:9aspect-ratio: 16/9
corner 8border-radius: 8px

Figma의 자간·행간은 font-size 대비 %로 표시되므로 CSS에서는 em(자간)이나 단위 없는 숫자(행간)로 옮기면 글자 크기를 바꿔도 비율이 유지됩니다. 행간을 px로 지정한 디자인(예: 16px 글자에 24px)은 나눗셈 결과를 단위 없이 쓰는 것이 위 line-height 절의 이유로 가장 안전합니다.

자주 묻는 질문

rem과 em의 차이는 무엇인가요?
rem은 루트 요소(html)의 font-size를, em은 그 요소 자신의 font-size를 기준으로 합니다(font-size 속성에 쓴 em만 부모 글꼴 기준). 그래서 em을 중첩된 컴포넌트의 font-size에 쓰면 1.2em 안의 1.2em이 1.44배가 되는 식으로 누적됩니다. 문서 전체에서 같은 크기가 필요하면 rem, 버튼 안 아이콘·여백처럼 “이 요소 글자 크기에 비례”해야 하면 em이 맞습니다.
line-height에 단위 없는 값이 권장되는 이유는?
line-height: 1.5처럼 단위 없는 값은 숫자 그대로 상속되어 자식마다 자기 font-size에 곱해집니다. 반면 em이나 %는 부모에서 px로 계산이 끝난 값이 상속되므로, 부모 20px·1.5em(=30px) 아래의 12px 자식도 줄 간격 30px을 물려받아 줄 사이가 지나치게 벌어집니다. CSS 2.1 명세의 line-height 정의(숫자는 지정값 그대로 상속, %는 계산된 길이로 상속)가 이 차이의 근거입니다.
clamp()에서 vw 단위만 쓰면 안 되나요?
font-size: 2vw처럼 vw만 쓰면 상·하한이 없어 360px 화면에서는 7.2px, 2560px 화면에서는 51.2px처럼 극단적인 값이 됩니다. 또 vw는 브라우저 확대(Ctrl +)에 반응하지 않아 저시력 사용자가 글자를 키울 수 없습니다. clamp(최솟값, rem + vw, 최댓값)처럼 선호값에 rem을 섞고 양쪽을 rem으로 묶으면 두 문제가 함께 해결됩니다 — 이 변환기의 clamp() 생성기가 만드는 형태입니다.
letter-spacing에 % 단위를 쓸 수 있나요?
현행 CSS Text Module Level 4는 letter-spacing에 % 값을 허용하고, 기준을 그 요소의 font-size로 정합니다. 즉 CSS의 5%는 0.05em과 같고, font-size의 %로 표시하는 Figma 자간과도 기준이 같습니다. 다만 Chrome은 145 버전부터 지원해(Firefox·Safari는 먼저 지원) 그보다 오래된 브라우저에서는 선언이 통째로 무시됩니다. 폭넓은 호환이 필요하면 같은 값을 em으로 쓰는 편이 안전합니다 — 예: Figma 자간 −2% → letter-spacing: -0.02em.
aspect-ratio와 padding-top 방식 중 어느 것을 써야 하나요?
지금은 aspect-ratio가 기본입니다. Chrome 88·Firefox 89·Safari 15부터 지원해 현행 브라우저에서는 문제가 없고, 코드가 한 줄이며 자식 요소를 absolute로 띄울 필요도 없습니다. padding-top 방식은 %가 부모 너비 기준이라는 성질(16:9면 9 ÷ 16 = 56.25%)을 이용한 우회로, 인터넷 익스플로러나 아주 오래된 웹뷰를 지원해야 할 때만 필요합니다. 이 계산기는 두 방식의 코드를 모두 만들어 줍니다.

참고 자료

  1. W3C CSS Values and Units Level 4(새 창)w3.org
  2. W3C CSS Text Module Level 4(새 창)w3.org
  3. W3C CSS Box Sizing Level 4(새 창)w3.org
  4. W3C CSS 2.1 line-height(새 창)w3.org
이 계산기를 만든 사람 · 리만Youtil 운영자 · 혼자 만들고 운영하는 1인 서비스입니다
운영자 소개
계산 기준
W3C CSS Values and Units 4(rem·vw·dvh·clamp)·CSS Text 4(letter-spacing)·CSS Box Sizing 4(aspect-ratio)·CSS 2.1(line-height) 정의 기준
오류 제보
결과가 다르면 contact@youtil.kr로 입력 조건을 알려 주세요. 평일 기준 1~3일 안에 답변합니다.

함께 쓰면 좋은 계산기