본문 바로가기

Frontend Development/CSS

[css] 단위 (px, pt, em, rem, vh, vw)

절대단위와 상대단위

절대단위 : in, cm, mm, pt, px가 있으며 출력장치(모니터)의 물리적 속성을 아는 경우 효율적

상대단위 : %, em, rem, vh, vw이 있으며 기종간, 플랫폼 간의 호환성을 유지하는데 유리

⇒ 모바일/태블릿/웹사이트 모두에 호환되는 반응형 어플리케이션을 만들고자 한다면, 상대단위를 사용하는 것이 유리하다.

 

절대단위

px 와 pt

px (pixel)

절대값으로 사용 되는 단위이다. 고정된 값이기 때문에 사용하기 편하고 이해하기도 쉽지만 반응형 웹사이트를 만들때에는 적절하지 않은것 같다.

pt (point)

1 px = 0.75 pt

1 px = 0.75 pt 이므로 100px = 75pt로 계산하기 편하게 환산한 모습이다. 실행결과도 둘간에 크기가 100px로 같게 나온다.

상대단위

%

부모 엘리먼트의 size를 기준으로 한 상대적인 size

width를 100%로 설정한 모습. 최상위 엘리먼트 이므로 브라우저 가로 크기 전체를 따라 가는 모습이다.

height 는 width랑 동작이 다르다. 부모의 height가 명시적으로 지정되어야 계산이 된다. 현재 부모의 고정사이즈가 없어서 100%로 하면 height는 0으로 나온다.

 

Parent를 만들고 height에 고정값 200px를 주었다. first 자식에 100% height를 주었을때 부모 크기 200을 그대로 따라간다.

 

%를 기준으로 max-width, min-width 를 설정할 수 있다.

 

최상위 박스를 200px x 200px로 설정한 모습. 거기에 max-width, min-width를 퍼센트 단위로 설정하였다.

 

부모 사이즈(여기서는 브라우저 크기)를 늘리면 min-width 50%를 맞추기 위해 width가 200px이상으로 늘어난다.

 

반대로 부모 사이즈를 줄이면 max-width: 90%를 맞추기 위해 박스 사이즈가 200px이하로 줄어든다.

 

em

부모 엘리먼트 font-size를 기준으로 한 상대적인 size

em 은 무슨 뜻일까?

단위 em은 [엠:]이라고 읽으며 과거 금속활자의 각 폰트디자인의 기준점을 알파벳 'M'으로 잡은것에서 유래했다고 한다. 가장 폭이 넓고 네모꼴이기 때문에 M의 너비를 전체 금속활자의 높이가 되게 만들면서 폰트디자인의 기준이 되었다고 한다. 그래서 'M'이라는 글자의 소리를 따서 em단위를 만들었고 지금의 css 단위로도 사용된다.

 

font-size: 16px인 경우, 상대 단위는 브라우저에 의해서 다음과 같이 계산된다.

  • 0.5em = 16 px x 0.5 = 8px
  • 1em = 16 px x 1 = 16px
  • 2em = 16 px x 2 = 32px
  • 3em = 16 px x 3 = 48px

여기서 font-size를 20px로 늘릴 경우, 상대 단위도 다음과 같이 비례해서 증가.

  • 0.5em = 20 px x 0.5 = 10px
  • 1em = 20 px x 1 = 20px
  • 2em = 20 px x 2 = 40px
  • 3em = 20 px x 3 = 60px

반대로 font-size를 10px로 줄일 경우, 상대 단위도 다음과 같이 비례해서 감소.

  • 0.5em = 10 px x 0.5 = 5px
  • 1em = 10 px x 1 = 10px
  • 2em = 10 px x 2 = 20px
  • 3em = 10 px x 3 = 30px

 

font-size가 기본 16px인 상태에서 M을 출력해보고 ruler앱으로 크기를 재보면 16px이 나온다.
5em의 height를 주었을때 16px x 5 = 80px이 나오게 된다.

 

em단위 사용시 주의할 점

너무 em단위를 font-size를 지정하는데 너무 남용하면 조상요소와 후손요소간의 관계구조가 복잡했을 때 상속 된 font-size를 예측하기 어려울 수 있다.

rem

rem = root em의 약자로 root 요소(html)의 font-size과 비교하여 size를 계산한다.

 

root는 최상위 요소인 html을 의미한다.

html의 기본 font-size는 16px이다.

기준이 부모 요소의 font-size인 em과 달리, rem은 루트 요소인 html이 기준이기 때문에, 복잡하지 않게 상대적인 크기를 정할 수 있다.

IE9 부터 사용되었다.

em, rem 차이점. 중간에 header div가 font-size를 32px로 바꿀경우 content div는 32px x 10em = 320px이 되지만 content2 div는 root의 16px x 10rem으로 160px을 유지하게 된다.

 

vh, vw, vmin, vmax

  • Viewport Height (vh) : viewport의 높이에 근거한다. 1vh는 viewport의 높이의 1%와 같다
  • Viewport Width (vw) : viewport의 폭에 근거한다. 1vw는 viewport의 넓이의 1%와 같다
  • Viewport Minimum (vmin) : viewport의 (높이와 너비 중) 작은 쪽의 치수에 기초로한다. viewport의 높이가 폭보다 작은 경우, 1vmin는 viewport의 높이의 1%에 해당한다. 마찬가지로 viewport의 폭이 높이보다 작은 경우, 1vmin는 viewport의 넓이의 1%와 같다
  • Viewport Maximum (vmax) : viewport의 (높이와 너비 중) 큰 쪽의 치수에 기초로한다. viewport의 높이가 폭보다 큰 경우, 1vmax는 viewport의 높이의 1%에 해당한다. 마찬가지로 viewport의 폭이 높이보다 큰 경우, 1vmax는 viewport의 넓이의 1%와 같다

Viewport가 다양한 상황에서 어떤 값을 가지고 있는지를 살펴보면

  • viewport의 폭이 1200px, 높이가 1000px의 경우 10vw는 120px, 10vh는 100px이된다. 이 viewport는 폭이 높이보다 더 크기 때문에 10vmax는 120px, 10vmin는 100px이된다
  • 이 장치의 방향이 바뀌어 viewport의 폭이 1000px 높이가 1200px되면 10vh는 120px, 10vw는 100px이된다. 흥미롭게도, 10vmax는 큰 쪽의 viewport의 값에 따라 결정되므로 120px 상태이다. 마찬가지로 10vmin도 100px로 그대로이다.
  • 브라우저 창의 크기를 변경하여 viewport의 넓이를 1000px 높이를 800px하면 10vh는 80px, 10vw는 100px이된다. 마찬가지로 10vmax는 100px, 10vmin은 80px된다

이 시점에서는 Viewport 단위는 % 지정 것처럼 보일지 모른다. 그러나 Viewport 단위와 % 사이에 큰 차이가 있음. % 지정 되어있다면 자식 요소의 폭과 높이는 부모 요소의 폭과 높이에 결정 된다.

 

자식 요소의 폭은 부모 요소의 너비의 80 %로 설정되어 있다. 그런데 두 번째 예제에서는 자식 요소의 폭이 80vw로 설정되어 있기 때문에 자식 요소의 폭이 부모 요소보다 넓어지고 있음.

 

Viewport 단위의 사용처

풀스크린의 배경이미지와 섹션 전체 화면으로 표시되는 요소에 배경 이미지를 설정하는 것이 많다. 제품이나 서비스에 대한 개별 섹션이 화면 가득 표시되도록 Web 사이트를 디자인하고 싶은 경우가 있을 때 각 요소의 폭을 100 %로 높이를 100vh에 설정할 수 있다.

 

Viewport 단위는 사용자 화면의 중앙에 요소를 정확하게 배치 할 필요가있는 경우에 매우 유용하다. 요소의 높이를 알고 있으면 margin 속성에서 top과 bottom의 값을 (100 - height) / 2] vh로 설정하면 볼 수 있다.

 

-- The End --