크기와 단위


픽셀 단위로 폰트 크기를 정해서 페이지를 배포했는데, 눈이 편하도록 브라우저 글자 크기를 키워둔 독자에게는 아무 변화가 없습니다. 카드에 고정 너비를 줬는데 폰에서는 화면 밖으로 넘칩니다. 두 문제 모두 결국 같은 질문으로 이어집니다. CSS에 숫자를 적었을 때, 그 숫자는 무엇을 기준으로 재는 걸까요? 어떤 단위는 고정되어 있고, 어떤 단위는 폰트에 맞춰 커지고, 어떤 단위는 부모 요소에 맞춰 커지고, 어떤 단위는 화면에 맞춰 커집니다. 어떤 단위가 무엇을 기준으로 하는지 알면, 더 이상 감으로 찍지 않고 목적에 맞는 단위를 골라 쓸 수 있습니다.
절대 단위 vs 상대 단위
CSS 단위는 두 부류로 나뉩니다. **절대 단위**는 절대 변하지 않는 고정된 크기입니다. px(픽셀)가 어디서나 마주치게 될 대표적인 절대 단위입니다. 상대 단위는 독자의 폰트 크기나 화면 너비처럼 다른 무언가에 맞춰 커지는 크기입니다.
방 크기를 재는 상황을 떠올려 보세요. 센티미터는 절대적입니다. 키가 크든 작든 벽의 길이는 400cm입니다. "내 걸음으로 세 걸음"은 상대적입니다. 누구의 걸음이냐에 따라 달라지니까요. 절대 단위는 정확한 통제를 주고, 상대 단위는 페이지가 보는 사람에 맞춰 적응하게 해 줍니다.
이 적응이 중요합니다. 어떤 독자는 눈이 편하도록 기본 글자 크기를 더 크게 설정해 둡니다. 텍스트 크기를 상대 단위로 정하면 그 설정이 그대로 반영되어 페이지가 그 사람에 맞게 커집니다. 픽셀로 고정하면 그 자리에 그대로 머물러 그 설정을 무시합니다.
px와 같은 절대 단위는 절대 변하지 않는 고정된 크기입니다. 상대 단위는 독자의 폰트 크기나 화면 너비처럼 다른 무언가에 맞춰 커집니다. 상대 단위는 페이지가 보는 사람에 맞춰 적응하게 해 주기 때문에, 글자 크기를 더 크게 설정한 독자에게 중요합니다. 픽셀과 그것이 적절한 경우
픽셀(px)은 작고 고정된 길이 단위입니다. 16px은 언제나 16px이라서 가장 직관적으로 다룰 수 있는 단위입니다. 그래서 무엇이 되든 크기가 그대로 유지되어야 하는 작은 요소, 예를 들어 테두리 두께, 작은 모서리 둥글기, 고정된 아이콘 같은 것에 잘 맞습니다.
.card {
border: 1px solid #ccc; /* 언제나 1px인 얇은 테두리선 */
border-radius: 8px; /* 고정된 모서리 둥글기 */
}문제는 픽셀이 독자를 신경 쓰지 않는다는 점입니다. 누군가 브라우저에서 더 큰 글자를 표시하도록 설정해 놓았다면, 24px로 고정한 제목은 그 설정을 무시하고 그대로 24px에 머뭅니다. 그래서 px는 테두리나 작은 디테일에는 괜찮은 선택이지만, 텍스트에 쓸 단위는 아닙니다.
px)은 고정된 크기라서 16px은 언제나 16px입니다. 그래서 1px 테두리나 작은 모서리 둥글기처럼 크기가 그대로 유지되어야 하는 작은 요소에 잘 맞습니다. 대신 px는 글자를 크게 설정한 독자를 무시하므로, 페이지의 글자에 쓸 단위는 아닙니다. em과 rem
폰트 크기에 맞춰 커지는 상대 단위 두 가지가 있습니다. em과 rem입니다. 이 중 먼저 써야 할 단위는 **rem**입니다. 이 단위는 페이지의 루트 폰트 크기, 즉 문서 전체에 설정된 기본 텍스트 크기(기본값 16px)를 기준으로 잡습니다. 그래서 1rem은 16px, 1.5rem은 24px, 2rem은 32px입니다.
h1 {
font-size: 2rem; /* 2 x 16px = 32px */
}
p {
font-size: 1rem; /* 16px, 기본 크기 */
margin-bottom: 1.5rem; /* 아래쪽 여백 24px */
}rem은 이 단 하나의 루트 크기에 묶여 있기 때문에 예측하기 쉽습니다. 1.5rem은 페이지 어디서나 같은 값을 뜻합니다. 그리고 독자가 기본 텍스트 크기를 키우면 rem으로 지정한 모든 요소가 함께 커집니다. 반면 em은 해당 요소 자신의 폰트 크기를 기준으로 커지기 때문에 복잡하게 꼬일 수 있습니다. 그러니 rem부터 시작하면 실수할 일이 거의 없습니다.
rem과 em은 둘 다 폰트 크기에 맞춰 커지는데, 먼저 써야 할 것은 rem입니다. 페이지의 루트 크기, 기본값 16px를 기준으로 잡으므로 1.5rem은 24px이고 어디서나 같은 값을 뜻합니다. em은 대신 해당 요소 자신의 폰트 크기를 기준으로 하기 때문에 복잡해질 수 있으니, rem을 먼저 쓰세요. 퍼센트
퍼센트(%)는 부모 요소를 기준으로 크기를 정합니다. 너비의 경우 width: 50%는 그 요소가 담긴 상자의 너비가 얼마든 그 절반을 뜻합니다.
.sidebar {
width: 25%; /* 부모 너비의 4분의 1 */
}
.content {
width: 75%; /* 나머지 4분의 3 */
}이것이 레이아웃을 유동적으로 만들어 주는 이유입니다. 너비가 부모의 일부분이기 때문에, 부모가 늘어나거나 줄어들면 함께 늘어나거나 줄어듭니다. 창 크기를 조절해도 50% 칼럼은 여전히 절반의 너비를 유지하며, 고정 500px 칼럼이었다면 화면 밖으로 넘칠 상황을 피하게 됩니다. 이런 유연함 때문에 퍼센트는 반응형 디자인에서 자주 등장합니다.
width: 50%는 그 요소가 담긴 상자 너비의 절반입니다. 이 덕분에 칼럼이 유동적으로 동작하여, 창 크기를 조절해도 넘치지 않고 함께 늘어나고 줄어듭니다. 어떤 화면에도 맞는 레이아웃을 만드는 핵심 도구 중 하나입니다. 뷰포트 단위
뷰포트 단위는 브라우저 창 자체를 기준으로 크기를 정합니다. **vw**는 뷰포트 너비의 퍼센트이고 vh는 뷰포트 높이의 퍼센트입니다. 여기서 뷰포트는 페이지에서 보이는 영역을 뜻합니다. 그래서 100vw는 창의 전체 너비이고 100vh는 창의 전체 높이입니다.
.hero {
height: 100vh; /* 화면 전체 높이를 채움 */
}랜딩 배너처럼 창의 크기가 어떻든 화면을 가득 채워야 하는 전체 화면 섹션에 이 단위가 딱 맞습니다. 이 단위가 창을 기준으로 하기 때문에, 누군가 창 크기를 조절하거나 기기를 회전시켜도 이 섹션은 전체 화면을 유지합니다. 특정 화면에만 맞는 고정 픽셀 높이를 지정할 필요가 없습니다.
vw와 vh는 브라우저 창을 기준으로 크기를 정합니다. 100vw는 창의 전체 너비, 100vh는 창의 전체 높이입니다. 랜딩 배너 같은 전체 화면 섹션에 딱 맞는 단위인데, 특정 픽셀 높이에 고정되지 않고 창 크기가 바뀌어도 전체 화면을 유지하기 때문입니다. 
