본문 바로가기

웹언어/CSS3

[CSS3강좌] 37강 CSS단위 - px, em, rem, vw, vh 등

728x90
반응형

 

 

 

 

 

 

 

 

** 영상으로 보고 싶은 분은 아래 주소를 클릭해주세요.

https://youtu.be/gQqkSZvDtbM

 

 

 

 

 

 

 

 

 

 

 

 

- CSS는 길이를 표현하는 몇 가지 다른 단위가 있습니다. 

- 예를 들어 width로 가로폭을 표현할 때 [ width: 300px; ]이라고 쓰죠? 이때 px이 단위입니다.

- 이번 강좌에서는 단위의 종류들을 알아보고자 합니다. 

 

** 단위의 몇가지 특징

- 숫자와 단위 사이에는 공백을 쓸 수 없습니다. 

- 0은 단위 생략이 가능합니다. 

- 일부 CSS 속성의 경우 음수 길이가 허용됩니다.

 

 

 

 

 

 

 

 

 

 

 

1. 절대적 길이 단위

- 절대적 길이 단위는 고정되어 있으며, 정확히 그 크기로 나타내는 것을 말합니다.

- 화면 크기(뷰포트)는 기기에 따라 모두 다르기 때문에 절대적 단위만 쓰는 것은 추천하지 않습니다. 

- 아래 표로 여러가지 단위를 보여드리지만, 웹에서는 절대적 단위는 px만 쓴다는 것을 기억해주시면 됩니다.

단위 설명
cm centimeters, 센치미터 단위, 인쇄용 단위로 웹에서는 사용하지 않습니다.
mm millimeters, 밀리미터 단위, 역시 인쇄용 단위로 웹에서는 사용하지 않습니다. 
in inches, 인치 (1in = 96px = 2.54cm)
px pixels, 픽셀 (1px = 1/96th of 1in)
pt points, 포인트 (1pt = 1/72 of 1in)
pc picas, 피카스 (1pc = 12pt)

 

 

 

 

 

 

 

 

 

 

 

2. 상대적 길이 단위

- 상대적 길이 단위는 요소에서 상대적인 길이를 지정합니다. 

- 상대적 길이 단위는 서로 다른 기기(모니터 폭) 간에 더 잘 확장됩니다. 

- 그래서 반응형웹이나 모바일 웹을 하려면 상대적 단위를 잘 알아야 합니다. 

단위 설명
em 글꼴을 상대적으로 표현하는 단위, 부모 요소가 갖고 있는 크기에 등배단위로 처리  ex) 2em => 2배
ex 현재 글꼴의 x-height로 상대적으로 표현하는 단위(거의 사용되지 않음)
ch 0(영)의 너비를 기준으로 상대적으로 처리
rem 글꼴을 root element(html태그) 기준으로 크기에 등배단위로 처리
vw 뷰포트 너비(width)의 1%로 처리
vh 뷰포트 높이(height)의 1%로 처리
vmin 현재 뷰포트 중(width와 height 중) 작은 쪽으로 선택해서 vw 혹은 vh 수치로 처리
** 익스플로러(IE)는 안되므로 잘 알고 사용해야 합니다.
vmax 현재 뷰포트 중(width와 height 중) 큰 쪽으로 선택해서 vw 혹은 vh 수치로 처리
** 익스플로러(IE)는 안되므로 잘 알고 사용해야 합니다.
% 부모요소가 갖고 있는 크기에 %처리 ex) 200% => 2배

 

 

 

 

 

 

 

 

 

 

 

 

3. em과 rem의 차이

- 둘다 등배 단위를 뜻하는 상대적 단위입니다.

- 하지만 em은 부모 크기를 기준으로 등배 단위가 처리되고, rem은 root(즉 html)를 기준으로 등배 단위가 처리됩니다.

- 아래 코드로 비교해보도록 하겠습니다.

 

 

## 코드보기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>사이즈</title>
        <style>
            /* 등배단위 사이즈 - 기준으로부터 몇배 */
            *{ font-size: 20px; } /* 모든 요소에 사이즈를 20으로 처리 - html태그도 포함 */
            
            /* em : 기준이 부모가되서 거기에 대한 등배단위 */
            .box01{ font-size: 10px; }
            .box01 h1{ font-size: 3em; }
            .box01 p{ font-size: 2em; }
            
            /* rem : 기준이 루트(html)이 되서 거기에 대한 등배단위 */
            .box02{ font-size: 10px; }
            .box02 h1{ font-size: 3rem; }
            .box02 p{ font-size: 2rem; }
        </style>
    </head>
    <body>
        <div class="box01">
            <h1>제목태그</h1>
            <p>문단태그</p>
        </div>
        <hr>
        <div class="box02">
            <h1>제목태그</h1>
            <p>문단태그</p>
        </div>
    </body>
</html>

- 일단 전체 선택자(*)로 글자크기를 20px로 처리했습니다. 모든 태그 선택이라 root격인  <html> 태그에도 20px을 준 것입니다.

<div> 태그는 두 개로 각각. box01과. box02라는 클래스로 처리했습니다. 

-  <div> 태그에도 글자크기를 주었습니다. 10px로 처리했어요.

.box01 의 자손들을 em단위로 글자크기를 지정할것이고,  .box02 의 자손들을 rem단위로 글자크기를 지정할 겁니다.

 

 

## 결과 보기

- 위의 두 글자는 부모크기(10px)에서 상속받아, 제목 태그는 3em이라 30px로 처리, 문단태그는 2em이라 20px로 처리됩니다.

- 아래의 두글자는 root(* = 20px)에서 상속받아, 제목태그는 3 rem이라 60px로 처리, 문단 태그는 2 rem이라 40px로 처리됩니다.

- 부모 크기를 매번 기억할 수는 없으니 rem을 쓰는 것이 더 효과적이겠죠?

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. 반응형 웹에서  rem을 사용하는 이유

- 반응형 웹은 데스크톱(PC), 태블릿, 모바일을 한 번에 코딩합니다. 

- html은 하나를 사용하지만 각각의 CSS를 넣어야 하는 거죠.

- 근데 모든 것을 매번 3파트로 나눠서 코딩하면 어떨까요? 코딩을 너무 많이 해야겠죠?

- 그래서 공통적인 것은 공통으로 작업하고, 정말 잘 안 맞는 파트만 미디어 쿼리에 코딩하는 것이 좋습니다.

- 마찬가지로 글자 크기를 px로 하면 PC에서 볼 때, 태블릿에서 볼때, 모바일에서 볼 때 조금씩 작아져야 하는데 한 요소 작성할 때마다 3번씩 써야 하는 불편함이 생깁니다.

- 그래서 rem단위를 이용하면 공통적으로 한 번만 작성해도 되고, 정 맞지 않는 파트만 수정하면 돼서 편리하다는 것이죠. 

 

 

 

 

 

 

1) 모바일 웹을 공통으로 코딩

- 일단 모바일 기기로만 비교해보겠습니다.

- [iphone plus] 계열들을 가로폭이 414px입니다. [iphone 6~x] 계열들은 가로 폭이 375px입니다. 

  [iphone5&se]는 가로폭이 320px입니다.

- 그럼 기기에 따라 보이는 것이 다릅니다. 아래 예시를 통해 보겠습니다.

 

 

## 코드 보기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>사이즈 단위</title>
        <style>
            h1{ font-size: 32px; background-color: aquamarine; }
            h3{ font-size: 20px; background-color: lightblue; }
            p{
                font-size: 16px;
                text-align: justify;
                background-color: pink;
            }
        </style>
    </head>
    <body>
        <h1>가장 큰 제목</h1>
        <h3>작은 제목</h3>
        <p>
            파란 자랑처럼 차 슬퍼하는 않은 봅니다. 부끄러운 시와 이름과, 가을 아무 않은 있습니다. 한 아스라히 그리고 있습니다. 내 무엇인지 청춘이 토끼, 지나가는 시인의 이런 된 별에도 봅니다.
        </p>
    </body>
</html>

- h1태그는 글자크기를 32px, h3태그는 20px, p태그는 16px로 절대적 단위를 사용해봤습니다.

 

 

 

## 결과 보기

- 화면 폭이 전부 다르기 때문에 여백이 다 다릅니다.

- 첫 번째로 h1태그의 가장 큰 제목을 보면 옆에 남는 여백들이 오른쪽으로 갈수록 점점 좁아지는 것이 보입니다.

- 그리고 p태그로 작성한 핑크색 부분을 보면 iphone plus들은 4줄에 마지막 줄이 반을 넘어가지 않습니다. iphone 6/7/8은 4줄이긴 하지만 마지막 줄이 반을 넘어갑니다. iphone 5 같은 경우는 5줄이나 되죠.

- 완전히 똑같은 위치에 놓을 수는 없더라도, 최소 줄 수라도 같게 해달라고 할 수도 있겠죠?

- 그래서 공통적으로 작업하게 되면 각각 줄 수가 없습니다.

 

 

 

 

 

 

 

2) 모바일 웹을 px단위로 각각 처리

- 그럼 이번에는 미디어 쿼리를 써서 글자크기를 px로 각각 맞춰보도록 하겠습니다.

 

 

## 코드 보기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>사이즈 단위</title>
        <style>
            /* 모든 기기 공통 CSS */
            h1{ background-color: aquamarine; }
            h3{ background-color: lightblue; }
            p{
                text-align: justify;
                background-color: pink;
            }

            /* iphone plus */
            @media screen and (max-width: 414px){
                h1{ font-size: 32px; }
                h3{ font-size: 20px; }
                p{ font-size: 16px; }
            }
            
            /* iphone 678 */
            @media screen and (max-width: 375px){
                h1{ font-size: 26px; }
                h3{ font-size: 16px; }
                p{ font-size: 14px; }
            }
            
            /* iphone 5 & se */
            @media screen and (max-width: 320px){
                h1{ font-size: 22px; }
                h3{ font-size: 14px; }
                p{ font-size: 12px; }
            }
        </style>
    </head>
    <body>
        <h1>가장 큰 제목</h1>
        <h3>작은 제목</h3>
        <p>
            파란 자랑처럼 차 슬퍼하는 않은 봅니다. 부끄러운 시와 이름과, 가을 아무 않은 있습니다. 한 아스라히 그리고 있습니다. 내 무엇인지 청춘이 토끼, 지나가는 시인의 이런 된 별에도 봅니다.
        </p>
    </body>
</html>

- px단위를 써서 각각 맞춰봤습니다.

- 고작 3개의 요소의 CSS 코드를 쓰는데도, 이렇게 많이 작성해야 하죠?

- 실제 홈페이지를 제작한다면 px단위를 쓰면 너무 많은 코드를 작성하게 되는 겁니다.

 

 

## 결과 보기

- 완벽한 길이까지 맞지 않아도, p태그를 보면 4줄에 마지막 줄이 전부 반을 넘지 않는 것을 확인할 수 있습니다.

- 그래서 같은 디자인처럼 보이게 하려면 기기별로 글자 크기가 다른 것이 좋은 거죠.

- 근데 px단위를 쓰면 코드가 너무 많아진다고 했죠? 그래서 rem단위를 써서 조율해보도록 하겠습니다.

 

 

 

 

 

 

 

3) 모바일 웹을 rem단위로 한 번에 처리

- 미디어 쿼리를 작성하지 않은 상단 CSS부분은 모든 기기 공통을 적는 것입니다.

- 기본 root만(전체 선택자) 미디어 쿼리에 기본 폰트를 잡아준 후 공통작업에서 rem단위를 써서 알아서 계산되서 들어가게 처리해주는 것입니다. 

- 그리고 rem으로 계산할 때 그나마 괜찮은 숫자가 나오는 것이 16px이라 iphone plus계열의 기본폰트를 16으로 잡겠습니다.

- 무슨 얘기냐면 20px로 크기를 맞추고 싶다면 [20/16]을 처리합니다.  그럼 [1.25]가 나오고 [1.25 rem]으로 적어주는 것입니다. 다른 숫자인 경우 소수점이 너무 심하게 처리되어 16px을 기본 폰트로 하는 것이 수학적 계산이 쉽니다. 

 

 

## 코드 보기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>사이즈 단위</title>
        <style>
            /* 모든 기기 공통 CSS */
            *{ font-size: 16px; } /* 기본폰트 */
            h1{ 
                font-size: 2rem; 
                background-color: aquamarine; 
            }
            h3{ 
                font-size: 1.25rem;
                background-color: lightblue; 
            }
            p{
                font-size: 1rem;
                text-align: justify;
                background-color: pink;
            }

            
            /* iphone 678 */
            @media screen and (max-width: 375px){
                *{ font-size: 14px; } /* 기본폰트 */
            }
            
            /* iphone 5 & se */
            @media screen and (max-width: 320px){
                *{ font-size: 12px; } /* 기본폰트 */
            }
        </style>
    </head>
    <body>
        <h1>가장 큰 제목</h1>
        <h3>작은 제목</h3>
        <p>
            파란 자랑처럼 차 슬퍼하는 않은 봅니다. 부끄러운 시와 이름과, 가을 아무 않은 있습니다. 한 아스라히 그리고 있습니다. 내 무엇인지 청춘이 토끼, 지나가는 시인의 이런 된 별에도 봅니다.
        </p>
    </body>
</html>

- 공통 CSS에는 기본 폰트를 16px로 해서 iphone plus들의 기본 크기를 적어줍니다. 

- 그리고 미디어 쿼리에 각각의 기본 폰트를 적어줍니다. iphone 6/7/8은 14px, iphone 5는 12px로 설정합니다.

- 그리고 공통 CSS에서 rem을 적으면 각각의 글자크기로 들어가는 겁니다.

- h1태그를 2 rem으로 했죠? 2배라고 준거잖아요? 그럼  iphone plus일 때는 32px, iphone 6/7/8은

 

 

## 결과 비교해서 보기

- 결과는 px과 크게 다르지 않습니다. 알아서 p태그가 4줄에 마지막 줄이 반이 넘지 않는 것을 확인할 수 있습니다.

- 대신 코드를 한 번씩 적었다는 것입니다. 기본 root값(전체 선택자)을 다르게 하고 rem을 쓰면 알아서 계산해서 처리해주는 거죠.

 

- 글자 크기가 phone plus일 때는 32px, iphone 6/7/8은

- rem단위를 사용하면 코드를 많이 줄일 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. 정말 상대적인 단위 - vw, vh

- 반응형 웹은 PC에서는 창 사이즈를 resize 해서 많이 봅니다.

- 그렇기 때문에 유동형 사이즈를 쓰는 것이 아닌 경우엔 일일이 줄일 수밖에 없는데, 그럼 너무 힘들겠죠?

- 미디어 쿼리를 사이즈마다 적어서 글자크기나 요소 크기를 줄인다는 것은 정말 힘든 일이겠죠?

- 그래서 창 사이즈(뷰포트)에 반응해서 크기가 상대적으로 바뀌는 단위도 나온 겁니다. 

- vw는 viewport width를 줄인 말로 창사이즈 중 가로폭의 1%를 크기로 갖습니다. 그러니까 1vw를 주면 폭이 1000px이면 10px로 처리되는 거죠.

- vh는 viewport height를 줄인 말로 창사이즈 중 높이의 1%를 크기로 갖습니다.

- 우린 vw로만 단위를 확인해보겠습니다.

 

 

## 코드 보기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <title>사이즈 단위</title>
        <style>
            .text01{ font-size: 30px; } /* 절대적 단위 */
            .text02{ font-size: 3vw; } /* 상대적 단위 - 창사이즈가 1000px일때 30px */
        </style>
    </head>
    <body>
        <h1 class="text01">제목태그 - px단위사용</h1>
        <h1 class="text02">제목태그 - vw단위사용</h1>
    </body>
</html>

 

 

## 결과 보기

- 위쪽 글자는 창 사이즈를 바꿔도 고정으로 절대 크기가 바뀌지 않습니다.

- 아래쪽 글자는 창 사이즈에 따라 상대적으로 변화되는 것 확인되시죠?

- vw는 꼭 글자크기로만 하지 않고, 요소 크기 및 마진, 패딩에도 잘 사용할 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형