WEB/웹개발 기초 강좌

[웹개발] 6. CSS 요소 배치 - position

션 쿠 2021. 9. 13. 21:32

저번 포스트에서는 CSS의 기본적인 문법과 CSS 파일을 HTML에 적용하는 방법을 배웠다.

이번 포스트에서는 CSS를 통해 HTML의 요소를 배치하고 정렬하는 방법을 배울 것이다.

 

HTML의 요소(태그)들을 배치하는 속성에는 3가지가 있으며, 보통 이들을 조합/혼합하여 사용한다.

  • position - 원하는 위치에 배치하는 방식
  • float - 특정 요소가 다른 요소의 좌/우에 배치할 수 있게 하는 방식
  • display - 요소들을 디스플레이 하는 방식

3가지 속성을 혼합하여 사용할 때, 몇몇 속성들은 서로 영향을 줄 수 있다.

이번 포스트에서는 position 속성에 대해서 배운다.

 

position

position 속성은 4가지의 값을 가질 수 있는데, 다음과 같다.

  • static (정적) - 요소를 좌->우, 상->하 순서로 배치한다.
  • relative (상대적) - 요소를 원래 배치(static)를 기준으로 배치한다.
  • absolute (절대적) - 상위 요소 중 가장 가까운 요소를 기준으로 배치한다.
  • fixed (고정된) - 웹 브라우저 화면 전체 (최상위 요소 X)를 기준으로 배치한다.

 

1. position: static;

position 속성의 기본값은 static이다.

즉, position 속성을 따로 지정하지 않으면 position: static; 을 부여한 것과 같은 효과를 가진다.

다시말해 대부분의 요소들은 기본적으로 static한 position 속성을 가지고 있다.

 

static 요소들은 여러 개가 쌓일 때 기본적으로 왼쪽에서 오른쪽으로, 한 줄이 다차면 위에서 아래로 채워진다.

<!DOCTYPE html>
<html>
    <head>
        <title>HTML과 CSS</title>
        <meta charset="utf-8">
        
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
        <span>span태그</span>
    </body>
</html>
/* index.css */

span {
    margin: 5px;
    background-color: aqua;
    font-size: 32px;
}

위의 코드는 각각 index.html과 index.css의 내용을 나타낸다.

이를 페이지로 열면 다음과 같은 결과가 나온다.

제일 일반적인 배치 방식인 static

2. position: relative;

요소에 position 속성 값을 relative로 부여하면, 그 요소가 static한 상태일 때 배치되어야 할 위치를 기준으로 배치할 수 있다.

말로만 설명하면 어려울 수 있으니 예시로 설명하겠다.

<!DOCTYPE html>
<html>
    <head>
        <title>HTML과 CSS</title>
        <meta charset="utf-8">
        
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <img src="https://ww.namu.la/s/0826fcb62ab5ffd031695083aa629d99351834b91417a1c9fee4a2a1a4b64bd8287e88163820b02176526fe7006fb51438fbb6f42cb2438497e298e722eac77cde9da7d51d8fa4d36800670013fb43b70d35328129d1f9aec0f9a5ee05ae7fe4">
        <div>고양이 귀여워</div>
    </body>
</html>
/* index.css */

img {
    width: 400px;
}

div {
    font-size: 25px;
    font-weight: bold;
    color: rgb(20, 255, 20);
}

이제 div에 대한 CSS 코드에 다음을 추가해보자.

    position: relative;
    top: -50px;
    left: 200px;

왼쪽이 추가하기 전, 오른쪽이 추가한 이후다.

top 프로퍼티에 -50px를 부여했기 때문에 원래 위치보다 반대 방향인 위로 50px 이동되었고,

left 프로퍼티에 200px를 부여했기 때문에 원래 위치보다 오른쪽으로 200px 이동되었다.

 

수학에서의 평행이동 비슷한 것이라고 생각하면 편하다.

항상 position: relative;는 원래 위치로부터 상대 좌표만큼 이동된다.

 

 

3. position: absolute;

absolute 값은 relative와 상당히 유사하다. 다만 기준으로 하는 부모 요소가 다르다는 점만 다르다.

<!DOCTYPE html>
<html>
    <head>
        <title>HTML과 CSS</title>
        <meta charset="utf-8">
        
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <div class="A">
            클래스A
            <div class="B">클래스B</div>
            <div class="C">클래스C</div>
            <div class="D">
                클래스D
                <div class="E">클래스E</div>
            </div>
        </div>
    </body>
</html>
/* index.css */

div {
    padding: 30px;
}

.A {
    position: absolute;
    background-color: red;
}

.B {
    background-color: orange;
}

.C {
    background-color: yellow;
}

.D {
    position: relative;
    background-color: green;
}

.E {
    background-color: cyan;
}

위의 예시에서는 HTML에서 class라는 속성이 사용되었는데, CSS 코드에서 div 중에서도 해당 클래스를 가진 div에게만 속성을 따로 부여할 수 있게 해준다.

 

추후 포스트에서 자세히 설명할테니 일단은 저런게 있구나 하고 넘어가자. (색깔은 div를 구분하기 위해 넣었다.)

 

클래스 A div에 absolute 속성을 부여하였고, 클래스 D div에 relative 속성을 부여하였다.

 

클래스 E div를 기준으로 설명할텐데, 클래스 E div에 absolute 속성을 부여했을 때, relative 속성을 부여했을 때 위치 기준을 잡는 요소가 무엇일까?

 

좌측이 relative일 경우, 우측이 absolute일 경우이다.

클래스 E div가 relative일 때

자기 자신이 position: static;일 경우에 대해 자기 자신을 기준 요소로 잡는다.

 

클래스 E div가 absolute일 때

부모 요소가 static이 아니라면 그 부모 요소를 기준 요소로 잡는다.

부모 요소가 static이라면 그 부모 요소의 부모 요소가 static이 아닌지 보고 아니라면 계속 타고 올라가며 static이 아닌 요소를 찾는다.

그래도 없다면, 최상위 요소인 <html>요소(태그)가 기준 요소가 된다.

*여기서 부모 요소란, 해당 요소를 포함하고 있는 요소(감싸고 있는 태그)를 나타낸다.

조상은 부모 요소부터 부모의 부모 요소 ... 최상단 요소까지의 요소를 나타낸다.

 

위의 예시에서는 바로 위의 부모 요소인 클래스 D div가 static이 아닌 position이므로 기준 요소가 된다.

클래스 E div의 css에 다음을 추가해보자.

    position: absolute;
    top: 120px;
    left: 50px;

기준 요소인 클래스 D를 기준으로 이동된 모습

top과 left는 각각 기준 요소의 최상단 부분과 좌측 부분을 기준으로 하며,

bottom과 right는 각각 기준 요소의 최하단 부분과 우측 부분을 기준으로 한다.

 

position: relative;와 position: absolute;는 실제로 많이 사용하는 속성이지만 필요할 때만 사용하도록 한다.

남용하면 요소들의 배치가 매우 더러워질 수도 있다.

 

 

 

4. position: fixed;

position이 fixed인 요소는 absolute와 매우 비슷하다.

우선 똑같이 기준 요소를 부모 중에 찾으며 (찾는 방식이 동일), 그 기준 요소에 대해 배치하는 방식도 같다.

다른 점이 있다면, absolute 요소그 자리에 머물러 있지만 fixed 요소는 그 페이지를 스크롤해도 같은 위치에 머물러있다는 점이다.

 

다음 예시에서 차이를 보자.

<!DOCTYPE html>
<html>
    <head>
        <title>HTML과 CSS</title>
        <meta charset="utf-8">
        
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <div class="A">
            클래스A
            <div class="B">클래스 B</div>
            <div class="C">클래스 C</div>
            <div class="D">
                클래스 D
                <div class="E">클래스 E</div>
            </div>
        </div>
    </body>
</html>
/* index.css */

div {
    padding: 30px;
}

.A {
    background-color: orange;
    height: 2000px;
}

.B {
    background-color: yellow;
}

.C {
    background-color: green;
}

.D {
    background-color: cyan;
}

.E {
    position: fixed;
    background-color: rgb(250, 0, 250);
}

일부러 상위 요소인 A 클래스 div를 세로로 길게 만들어 스크롤 가능하게 만들었다.

위의 결과 페이지에서 스크롤을 하면 E 클래스 div가 어떻게 배치되는지 알 수 있는데, absolute와의 차이를 알고 싶다면 E 클래스 div의 position을 absolute로 바꾸어 해보면 어떤 차이가 있는지 알 수 있을 것이다.

position: fixed; 요소는 페이지 기준으로 고정되어있다.

 

5. position: sticky;

position이 sticky인 요소는 fixed와 absolute를 합친 느낌과 비슷하다.

 

다만 기준 요소를 정하는 방식이 fixed/absolute와는 조금 다르다.

 

fixed/absolute가 기준 요소를 고를 때 static이 아닌 가장 가까운 조상을 고르는 것이었다면,

sticky 요소는 조상 요소 중 '스크롤이 가능한 요소'를 기준으로 잡는다.

 

또한 기준 요소가 스크롤될 때 sticky 요소는 페이지에 계속 보이려고 안간힘을 쓰는 듯한 배치를 보여주는데,

다음 예시를 보고 이해해보자.

 

<!DOCTYPE html>
<html>
    <head>
        <title>HTML과 CSS</title>
        <meta charset="utf-8">
        
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <div class="A">
            클래스A
            <div class="B">
                클래스 B
                <div class="C">클래스 C</div>
            </div>
        </div>
    </body>
</html>
/* index.css */

div {
    padding: 30px;
}

.A {
    background-color: orange;
    height: 300px;
    overflow-y: scroll;
}

.B {
    background-color: yellow;
    height: 1200px;
}

.C {
    position: sticky;
    top: 20px;
    background-color: green;
}

강제로 스크롤 영역을 만들어야 했기에, A 클래스 div의 높이를 300 픽셀로 고정시켜놓고, 그 안에 있는 B 클래스 div의 높이를 1200 픽셀로 높게 설정하여 A 클래스 div를 스크롤 가능하게 만들었다.

 

이 때 C 클래스 div가 sticky이면 기준 요소가 A이므로, B 클래스 div의 스크롤을 내리면 C 클래스 div가 위에 붙어서 내려오는 것을 볼 수 있다.

sticky 요소는 필요할 때마다 적절히 사용하자.

경험상 많이 사용하진 않는다.