본문 바로가기

WEB/HTML&CSS

[HTML/CSS] #10.flexbox

flexbox는 CSS의 레이아웃 기술 중 하나이다. 앞서 grid로 레이아웃을 만들었는데, 차이점이 무엇일까??

둘의 차이는 Flex는 1차원으로 수평, 수직 영역중 하나의 방향으로만 레이아웃을 나눌 수 있는데 반면 Grid는 2차원으로 수평 수직 동시에 영역을 나눌 수 있다는 점이다.

 

그렇다면 flexbox는 어떻게 사용할까? 다음의 코드를 보자.

 

<!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 {
        margin: 20px;
        display: flex;
        justify-content: space-between;
        align-items: center;
      }

      div {
        display: inline-block;
        width: 300px;
        height: 300px;
        background-color: teal;
      }

      #second {
        background-color: wheat;
      }
    </style>
  </head>
  <body>
    <div></div>
    <div id="second"></div>
    <div></div>
  </body>
</html>

 

1. 우선 자식 엘리멘트에 해당하는 박스들을 우리가 원하는 곳에 배치하기 위해서 부모 엘리먼트를 flex container로 만들어준다. 여기서는 body태그를 flex container로 만들어주었다.

 

2. 그리고 스타일로 가서 display: flex를 써주었다.

 

3. display: flex 써주면 아래의 기능을 사용할 수 있다.

  - justify-content → 수평으로 작용(main axis)

  - align-items → 수직으로 작용(cross axis)

 

위의 코드에서는 수평방향으로 박스를 일정한 간격으로 나눠주었다. 그 결과

 

원래 이랬던 박스들이

 

이렇게 분산되었음을 볼 수 있다. 그런데 이상한 점이 하나 있다. align-items: center; 로 수평축 뿐만 아니라 수직축을 기준으로 가운데 정렬을 명령했는데도 박스들이 그대로다. 왜 이런 것일까? 개발자 도구로 확인해보자.

 

확인을 해보니 이 3개의 박스 자체가 body태그의 엘리먼트이다. 그렇기 때문에 이미 수직축을 기준으로 가운데정렬이 되있는 상태라 볼 수 있는것이다. 그래서 저 명령을 주고 싶다면 높이(height)를 주면 된다.

style로 가서 다음과 같이 높이를 추가해주자.

 

body {
        height: 100vh;
        margin: 20px;
        display: flex;
        justify-content: space-between;
        align-items: center;
      }

 

여기서 vh라는 단위가 사용되었는데 이는 화면의 비율로 크기표현을 하는 단위이다. 예를 들어 height: 100vh 라면 화면 높이의 100%를 사용하겠다는 의미이다. 디바이스별로 화면의 크기가 모두 다르기 때문에 이 vh라는 단위를 써주면 편리하다. 이제 결과를 확인해보자.

 

 

그럼 다음과 같이 수직축을 기준으로 가운데 정렬이 되었음을 확인할 수 있다. (구분을 위해 배경색을 임시로 입혀주었다!)