본문 바로가기

WEB/HTML&CSS

[HTML/CSS] #12. position: fixed, relative, absolute

웹사이트를 제작하다 스크롤을 내려도 특정 박스를 고정시켜야 할 일이 있다. 이때 사용하는 것이 fixed이다.

fixed는 element가 처음 생성된 자리에 고정시킨다. 다음의 코드를 보자.

 

<!DOCTYPE html>
<html lang="en">
  <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 {
        height: 1000vh;
        margin: 20px;
      }
      div {
        width: 300px;
        height: 300px;
        background-color: teal;
      }

      #different {
        width: 350px;
        background-color: wheat;
        position: fixed;
      }
    </style>
  </head>
  <body>
    <div></div>
    <div id="different"></div>
  </body>
</html>

보다시피 아래 박스에 fixed를 적용하였다. 그리고 결과를 확인해보면

 

정말 스크롤을 내려보아도 아래 박스는 제자리에 고정되어 움직이지 않는다.

 

이번엔 아래 박스에 top: 100px를 추가해보자.

 

      #different {
        width: 350px;
        top: 100px;
        background-color: wheat;
        position: fixed;
      }

 

그리고 결과를 확인해보면

 

 

보다시피 노란색 박스가 초록색 박스 위로 올라가 있다. 즉 완전히 다른 레이어가 된 것이다.

fixed로 고정을 시킨 상태에서 top, left, right, bottom 중 하나라도 사용하게 된다면 완전히 다른 레이어가 된다는 사실을 확인할 수 있다.

 


 

엘리먼트가 처음 위치한 곳을 기준으로 위치수정을 해야 할 일이 있을 수 있다. 이 때 사용하는 것이 relative이다.

초기 상태 엘리먼트가 다음과 같다고 하자.

 

그리고 다음의 코드와 같이 relative를 준 뒤 위치값을 설정해주자.

<!DOCTYPE html>
<html lang="en">
  <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 {
        height: 1000vh;
        margin: 50px;
      }
      div {
        width: 300px;
        height: 300px;
        background-color: wheat;
      }
      .green {
        background-color: teal;
        height: 100px;
        width: 100px;
        position: relative;
        top: -10px;
        left: -30px;
      }
    </style>
  </head>
  <body>
    <div>
      <div class="green"></div>
    </div>
  </body>
</html>

그럼 엘리먼트는 다음과 같이 위치가 바뀐다.

 

방금 본 엘리먼트의 위치변화와 같이 relative를 이용하면 처음 위치한 곳을 기준으로 위치수정을 할 수 있다!

 


 

처음 위치한 곳이 아닌 특정한 위치를 기준으로 위치수정을 해야할 일이 있을 수 있다. 이 때 쓰는 것이 바로 absolute이다. 다음의 코드를 보자.

 

<!DOCTYPE html>
<html lang="en">
  <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 {
        height: 1000vh;
        margin: 50px;
      }
      div {
        width: 300px;
        height: 300px;
        background-color: wheat;
      }
      .green {
        background-color: teal;
        height: 100px;
        width: 100px;
        position: absolute;
        right: 0px;
      }
    </style>
  </head>
  <body>
    <div>
      <div class="green"></div>
    </div>
  </body>
</html>

 

그리고 결과를 보면 다음과 같다.

 

absloute를 사용해보니 body의 맨 오른쪽으로 간다. 부모 박스 기준이아니다. 왜그럴까?

이는 absolute의 특성 때문이다. absolute는 가장 가까운 relative 부모를 기준으로 위치이동을 시켜준다.

이 때 relative가 설정이 안되있으면 그냥 body가 relative가 된다. 따라서 위 상황에서도 body를 기준으로 위치이동이 된 것이다.

그렇다면 body가 기준이 아니라 저 노란박스를 기준으로 위치이동을 시켜주고 싶다면 어떻게 할까?

바로 저 노란박스에 해당하는 div를 relative로 만들어주면 된다. 다음의 코드처럼 position을 추가해보자.

 

      div {
        width: 300px;
        height: 300px;
        background-color: wheat;
        position: relative;
      }

 

그리고 나서 결과를 확인해보면 다음과 같다.

 

노란색 박스를 기준으로 오른쪽에 초록색 박스가 붙어있음을 확인할 수 있다!

 

 

'WEB > HTML&CSS' 카테고리의 다른 글

[HTML/CSS] #14.Combinators  (0) 2022.01.02
[HTML/CSS] #13.Pseudo Selector  (0) 2021.12.27
[HTML/CSS] #11.Media Query (반응형 웹디자인)  (0) 2021.12.10
[HTML/CSS] #10.flexbox  (0) 2021.12.10
[HTML/CSS] #9.그리드  (0) 2021.12.09