5 minute read

CSS-단위

  1. px : 해상도에 대한 상대적인 단위
    • 화면에 절대적으로 크기를 고정하고자 할 때 사용
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 600px;
        }
        .parent{
            width: 300px;
        }
        .child{
            width: 150px;
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/FE/CSS/Basic/CSS%20%EB%8B%A8%EC%9C%84-%20px(pixel).PNG?raw=true

CSS 단위- px

  1. % : 부모 요소의 가로 사이즈의 영향을 받음

%는 CSS 스타일이 적용될 대상의 부모 요소를 기준으로 상대적으로 몇 %만큼 크기를 사용할 것인지 결정하게 한다!

예를 들어서

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 600px;
        }
        .parent{
            width: 50%;
        }
        .child{
            width: 50%;
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

위와 같이, 어떤 조상 요소격인 요소를 길이를 정해둔 후, 그에 대해서 %로 크기를 지정해주면, 맨 위에서 확인한 결과와 동일한 결과를 확인해볼 수 있다!

  1. em과 rem
  • em : 자기 자신의 폰트 사이즈 영향을 받음

대부분 브라우저에서는 기본 폰트 사이즈가 약 16px 정도 되는데, 이를 1 em으로 간주하여 width를 설정하면, 위의 결과와 별반 다를 바 없다![1 em = 16px ▶️ 기본! 따라서, 기존의 600px과 같은 효과를 내려면, 600/16=37.5em을 적용하면 위에서 연습한 결과와 유사한 결과를 확인해볼 수 있다!!]

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 37.5em;
            font-size:16px;
        }
        .parent{
            width: 50%;
        }
        .child{
            width: 50%;
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

🌟 그리고 부모요소에서 font-size를 설정해두었다면, 자식요소에서도 해당 속성에 대한 값이 전달되어 em의 기준이 설정된다!

즉, 아래와 같이 parent와 child 요소 각각에

-parent :( 10 em * 16 px =160 px)+ (2px *2) =164px 만큼의 너비

-child (: 5 em * 16 px = 80 px )+ (2px *2) = 164px 만큼의 너비

가 적용될 수 있다!

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 37.5em;
            font-size:16px;
        }
        .parent{
            width:10em;
        }
        .child{
            width:5em;
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

🌟 그런데!! 만약에, 자식 요소에서 폰트 크기를 em 단위를 이용해서 변경한다면 ⁉️

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 37.5em;
            font-size:16px;
        }
        .parent{
            /* width: 50%; */
            width:10em;/*자기 자신을 이용해서 기준을
            잡기 때문에 10 em * 32px + 2px * 2= 324px이 너비가 될 것*/
            font-size:2em;/*font-size=2*16px = 32px */
        }
        .child{
            /* width: 50%; */
            width:5em;
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

위의 경우, 자식 요소에서 폰트 크기를 2 em= 32 px로 설정해두었고, 이를 이용해서 width를 10em으로 잡았기 때문에, border 너비까지 고려하게 되면, 총 324px의 너비가 parent 요소에 지정된다

🌹폰트 사이즈 1 em의 기준은 부모 요소로부터 상속받아서 em으로 설정할 수 있다! (그래서 ⬆️에서처럼 사용 가능)

▶️ 아래에서 처럼 child 요소에서 2 em으로 폰트 크기를 설정해주면, parent 요소를 기준으로 폰트 크기가 결정되기 때문에 64px이 된다(1 em= 32 px(parent 요소 기준))

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body *{
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border:2px solid;
        }
        .container{
            width: 37.5em;
            font-size:16px;
        }
        .parent{
   
            width:10em;
            font-size:2em;/*font-size=2*16px = 32px */
        }
        .child{
            width:5em;
            font-size:2em;/*32px * 2= 64px*/
        }
    </style>
</head>
<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>
</html>

🌟 이러한 폰트 크기 상속, 기준 요소를 거점으로 비율적으로 크기를 변경하는 특성으로 인해서

부모 요소의 크기는 px로 고정하고 그 이후는 상대적인 수치로 일괄 변경을 하고자 할 때 em이 사용된다!

🌻 단점 : 영향을 받는 요소 간 관계가 복잡해지거나, from top to bottom 순서로 진행되다가 중간의 특정 요소에 대해서만 크기를 별도 지정할 필요가 있는 경우에는 적용이 번거로워질 수 있음(관리면에서) ▶️ rem 단위가 이를 해결해줄 수 있다!!

  • rem 단위 : 중간 단계는 다 건너뛰고, 최종 조상 요소를 기준으로 상대적인 크기 수치를 정할 수 있도록 하는 단위

-html에 지정된 폰트 사이즈의 영향만을 받음!

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        html {
            font-size: 10px;
        }

        body * {
            /*body 내부의 모든 요소들(=body의 후손들)에 대해서 적용*/
            border: 2px solid;
        }

        .container {
            width: 60rem;/*60 * 10 = 600px*/
            font-size: 5rem;/*5*10px=50px*/
        }

        .parent {
            width: 20rem;/*20 * 10 = 200px*/
            font-size: 2rem;/*2*10px=20px*/
        }

        .child {
            width: 10rem;/*10 * 10 = 100px*/
            font-size: 1rem;/*1*10px=10px*/
        }
    </style>
</head>

<body>
    <div class="container">
        Container
        <div class="parent">
            Parent
            <div class="child">Child1</div>
            <div class="child">Child2</div>
        </div>
    </div>
</body>

</html>

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/FE/CSS/Basic/CSS%20%EB%8B%A8%EC%9C%84-%20rem.PNG?raw=true

CSS 단위- rem

-위에서 처럼, html 내부에 대해서 font-size를 지정한 후, rem 단위를 적용하게 된다면

(1) container의 width=60 rem = 60 * 1rem(=10px) ←(1rem =10px) = 600px font-size = 5 rem = 5 * 10px =50px

(2) parent 요소 width = 20 rem = 20 * 10px = 200 px

font-size= 2 rem = 2 * 10px = 20px

(3) child 요소

width = 10 rem= 10 * 10px= 100px

font-size = 1 rem = 10px

로 적용될 수 있게 된다!

🌟 rem의 장점- 중간에 body 요소의 font 크기에는 영향을 주고 싶지 않다!

-그러면 위에서 font-size를 rem으로 해두었는데 이를 px이나 em 단위로 이용해보고

-다시 font-size 속성을 밑에 처럼 body 요소나, 특정 요소에서

body{
	font-size: 16px;
}

로 덮어써주면 rem에 영향을 주지 않고 폰트만 크기 지정, 사용이 가능하다

  1. vw와 vh
  • viewport의 너비, 높이를 기준으로 상대적인 너비, 높이를 지정
  • viewport : html, css, js를 이용해서 출력되는 페이지 전체 화면을 의미
  • 백분율을 이용해서 표현 가능! 따라서 , 절반을 이용하려면 50vw 처럼 사용 !!

범위는 [0,100] !!

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/FE/CSS/Basic/CSS%EB%8B%A8%EC%9C%84-vw,vh.PNG?raw=true

CSS 단위- vw, vh

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
        }
        .container{
            width: 50vw;
            height: 100vh;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="container"></div>
</body>
</html>

위와 같은 경우, container의 너비는 뷰포트의 절반, 높이는 100vh로 뷰포터 전체 높이만큼을 사용하게 된다!

🌟 뷰포터 크기가 변경되면 변경됨에 따라서 유동적으로 변경됨을 확인해볼 수 있다!

  1. vmin과 vmax
  • 뷰포트의 크기(뷰포트의 너비, 높이) 중 최소크기 혹은 최대크기를 기준으로 크기를 설정

먼저 vmax부터 접근해보자

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
        }
        .container{
            width: 50vmax;
            height: 300px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="container"></div>
</body>
</html>

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/FE/CSS/Basic/CSS%EB%8B%A8%EC%9C%84-vmax.gif?raw=true

CSS단위-vmax

위와 같이, width를 vmax를 이용하게 되면, 뷰포트 너비를 변화시키면서 확인해볼 경우, 1) 가로 > 세로 ➡️ vmax는 가로를 기준으로 비율로 계산됨

2) 가로 < 세로 ➡️ vmax는 세로를 기준으로 비율로 계산됨

을 확인해볼 수 있다!

그 다음은 vmin을 확인해보자!

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
        }
        .container{
            width: 50vmin;
            height: 300px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="container"></div>
</body>
</html>

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/FE/CSS/Basic/CSS%EB%8B%A8%EC%9C%84-vmin.gif?raw=true

CSS단위- vmin

위와 같이, width를 vmin을 이용하게 되면, 뷰포트 너비를 변화시키면서 확인해볼 경우, 1) 가로 > 세로 ➡️ vmin은 세로를 기준으로 비율로 계산됨

2) 가로 < 세로 ➡️ vmin은 가로를 기준으로 비율로 계산됨

을 확인해볼 수 있다!

Updated: