[CSS]%? vw/vh? rem/em? 헷갈리는 반응형 단위들 정리

2025. 2. 27. 22:20·Css

반응형 웹을 구현할 때 가장 헷갈리는 것 중 하나가 적절한 단위 선택이다.

%, vw/vh, rem/em은 각각 다른 기준점과 동작 방식을 가지고 있어서, 제대로 이해하지 못하고 사용하면 의도한 디자인과 완전히 다른 결과물이 나올 수 있다...!

각 단위들의 특징과 실제 프로젝트에서 언제, 어떻게 활용하면 좋을지 정리해보고자 한다.


✅ % (퍼센트) - 부모 요소 기준

- 부모 요소의 크기를 기준으로 상대적인 크기를 설정

🤔 언제 사용할까?

  1️⃣ 컨테이너나 박스의 너비나 높이를 부모 요소에 비례하여 조정해야 할 때

  2️⃣ 반응형 그리드 레이아웃을 구현할 때 (예: 12칼럼 그리드 시스템)

  3️⃣ 다양한 화면 크기에서 일관된 비율을 유지해야 하는 요소들

.container {
  width: 80%; /* 부모 요소의 80% */
  height: 50%; /* 부모 요소의 50% */
}

  ➕ 퍼센트 단위는 항상 부모 요소의 크기에 직접적인 영향을 받기 때문에, 부모가 auto이거나 크기가 정해지지 않았다면 예상과 다르게 동작할 수 있으니 주의할 것!


✅ vw / vh - 뷰포트 기준

- vw(viewport width): 브라우저 뷰포트 너비의 백분율을 나타내는 단위

- vh(viewport height): 브라우저 뷰포트 높이의 백분율을 나타내는 단위

- 100vw는 브라우저 화면 전체 너비, 100vh는 브라우저 화면 전체 높이를 의미하며 스크롤바 포함

🤔 언제 사용할까?

  1️⃣ 화면 전체를 채우는 요소를 만들 때 (예: 풀스크린 배경 이미지, Hero 섹션, 랜딩 페이지)

  2️⃣ 뷰포트 크기에 따라 직접적으로 반응해야 하는 반응형 요소를 구현할 때

  3️⃣ 디바이스 화면 크기에 관계없이 일정한 비율을 유지해야 하는 요소

.full-screen {
  width: 100vw;
  height: 100vh;
}

  ➕ 모바일 브라우저에서는 vh 단위가 주소창(URL 바)을 포함한 전체 화면 높이를 기준으로 계산되기 때문에, 스크롤 시 주소창이 사라지는 경우 레이아웃이 깨질 수 있음 -> 최신 CSS의 단위인 svh(small viewport height), lvh(large viewport height), dvh(dynamic viewport height) 등을 활용해서 해결!

🤔 그럼 svh, lvh, dvh은 언제 사용할까?

svh - 최소한의 화면 높이를 유지해야 할 때 (모바일 주소창이 열려 있어도 레이아웃 유지)
lvh - 주소창이 완전히 사라졌을 때 화면을 꽉 채우고 싶을 때 (예: 배경 이미지, Hero 섹션)
dvh - 사용자의 브라우저 환경 변화(주소창 유무, 키보드 열기/닫기 등)에 따라 자동 조정하고 싶을 때

✅ rem / em - 폰트 크기 기준

◼ rem (root em) - 루트 요소 기준

- html 요소(루트 요소)의 font-size를 기준으로 크기가 결정되는 단위

🤔 언제 사용할까?

  1️⃣ 폰트 크기, 패딩, 마진 등 다양한 UI 요소의 크기를 일관되게 조정할 때

  2️⃣ 전역적인 크기 조정이 필요한 경우 (예: 다크 모드, 접근성 기능)

  3️⃣ 브라우저 기본 폰트 크기를 존중하면서도 일관된 디자인을 유지해야 할 때

body {
  font-size: 16px;
}
.text {
  font-size: 1.5rem; /* 16px * 1.5 = 24px */
}

◼ em - 부모 요소 기준

- 부모 요소의 font-size를 기준으로 크기가 결정되는 상대적인 단위

🤔 언제 사용할까?

  1️⃣ 버튼, 입력 필드, 아이콘 등 특정 컴포넌트 내부에서 요소 간의 상대적인 크기를 조정할 때

  2️⃣ 부모 요소의 폰트 크기에 따라 크기가 자동으로 달라져야 하는 유동적인 UI 요소를 만들 때

  3️⃣ 특정 컴포넌트 내에서만 유지되어야 하는 비율 관계를 설정할 때

.button {
  font-size: 1em; /* 부모의 font-size와 동일 */
  padding: 1.2em; /* 글자 크기를 기준으로 패딩 설정 */
}

  ➕ em은 부모 요소의 폰트 크기에 직접적인 영향을 받으므로, 여러 요소가 깊게 중첩될 경우 예상보다 크기가 기하급수적으로 커질 수 있음!


💡 정리 및 느낀점

레이아웃(그리드, 컨테이너, 박스) -> %

전체 화면을 차지하는 요소들(배경, 헤더, 모달) -> vw, vh

폰트 크기, 여백, 전역 UI 요소 -> rem (일부 em)

컴포넌트 내부 요소들 -> em

처음에 반응형 웹을 구현할 때 굉장히 헷갈려서 이리저리 막 바꿔가면서 사용했었다...

아니면 컨벤션을 정해서 일관성 있고 유지보수성이 높은 방식으로 코드를 작성하는 것도 좋을 것 같다! 


📜관련 공식문서들

https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units

https://developer.mozilla.org/en-US/docs/Web/CSS/length

https://www.w3.org/TR/css-values-4/

https://css-tricks.com/fun-viewport-units/

 

저작자표시 비영리 변경금지 (새창열림)

'Css' 카테고리의 다른 글

[CSS]Grid의 모든 것  (0) 2025.03.06
[CSS]Flex의 모든 것  (0) 2025.03.05
'Css' 카테고리의 다른 글
  • [CSS]Grid의 모든 것
  • [CSS]Flex의 모든 것
버그잡는고양이발
버그잡는고양이발
주니어 개발자입니다!
  • 버그잡는고양이발
    지극히평범한개발블로그
    버그잡는고양이발
  • 전체
    오늘
    어제
    • 분류 전체보기 (381)
      • React (16)
      • Next.js (5)
      • Javascript (5)
      • Typescript (4)
      • Node.js (2)
      • Cs (16)
      • 트러블 슈팅 (5)
      • Html (1)
      • Css (3)
      • Django (0)
      • vue (0)
      • Java (1)
      • Python (0)
      • 독서 (1)
      • 기타 (3)
      • 백준 (192)
      • swea (31)
      • 프로그래머스 (30)
      • 이코테 (4)
      • 99클럽 코테 스터디 (30)
      • ssafy (31)
      • IT기사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 인기 글

  • 태그

    개발자취업
    99클럽
    코딩테스트준비
    항해99
    Til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
버그잡는고양이발
[CSS]%? vw/vh? rem/em? 헷갈리는 반응형 단위들 정리
상단으로

티스토리툴바