[TIL 6][CSS] Flex - Flex Container

15734 단어 TILCSSCSS

0. 개요

CSS에 flex가 탄생하기전에는 요소를 정렬할 때 margin을 사용해서 정렬을 하곤했다. 하지만 margin을 이용해서 하나하나 정렬을 하려면 뭔가 변경된 사항이 생길때마다 해당 요소에 대한 margin을 하나하나 바꾼다는것은 여간 귀찮은일이 아닐수 없다.
그러한 귀찮은 작업을 간편하게 해주는것이 flex이다.

<div class="father">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
</div>

기존엔 박스 하나 하나에 비율(%)을 정해줘서 정렬을 하곤 했는데, 만약에 상자가 하나 더 추가되거나 제거되면 비율을 또 다시 맞춰야하는 번거로움이 생긴다. 하지만 flex를 사용하면 그러한 번거로움을 해소할 수 있다.

1. flex 사용

flex를 사용하기 위해서는 정렬될 대상에게 flex 속성을 주는것이 아닌 대상의 부모 요소에게 display:flex 속성을 주어야한다.

속성을 주어주면 자식들은 flex-item이 되고 부모와 함께 flex-container를 형성한다.

위의 그림 같은 경우는 아래와 같이 .father에게 flex 속성을 주고 수평 정렬을 설정하는(flex-direction이 row일 경우) justify-content 속성에게 space-between을 주어주면 위 처럼 정렬이 된다.

<div class="father">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
</div>
.father{
    display: flex;
    justify-content: space-between;
}

.box {
    width: 300px;
    height: 300px;
    background-color: blue;
}

2. Axis


flexAxis 즉, 축에 따라 정렬하는 방법이 결정된다.
뒤에서 후술할 flex-direction에 따라 축이 변하는데, 기본값으로 flex-directionrow 즉 수평으로 설정되어 있다. 수평일 때 수평 정렬을 담당하는 설정값으로 justify-content가 있고, 수직을 담당하는 align-items가 있다.
그런데 flex-directioncolumn 즉 수직으로 변경한다면, Main-Axis 축의 변경으로 인하여justify-content는 수직 정렬, align-items는 수평 정렬을 담당하게 된다.

flex-directionjustify-contentalign-items
row수평수직
column수직수평

3. flex-direction

위에서 언급한것처럼 flex-direction이라는 속성이 있다.

row


row는 좌에서 우로 수평 배치되고, flex-direction의 기본값이다.

row-reverse


row-reverserow와 반대로 우에서 좌로 수평 배치된다.

column


column은 위에서 아래로 수직 배치된다.

column-reverse


column-reverse는 아래에서 위로 수직 배치된다.

4. flex-wrap

flex-wrapflex-container의 width보다 flex item들의 width의 합계가 더 큰 경우 그것을 한줄로 나타낼것인지 혹은 여러줄로 나타낼것인지 지정하는 속성이다.
flex-wrap의 기본값은 nowrap인데, 이것을 한 행에 flex item들을 배치하는 속성이다.
이 때, flex item들은 flex container에 들어갈 수 있는 크기로 축소된다.

<div class="father">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
  <div class="box">5</div>
</div>
.father {
    display: flex;
    width: 500px;
    flex-direction: row;
    flex-wrap: nowrap;
    background-color: red;
}

.box {
    width: 100px;
    height: 50px;
    background-color: rgba(0, 0, 255, 0.3);
    text-align: center;
    font-size: 30px;
}


위처럼 flex container의 폭이 500px이고 flex item 각각의 폭이 100px인 경우에 하나의 flex item을 추가하면 어떻게 될까?

nowrap


nowrap의 경우엔 하나의 행을 추가하지 않고 flex container 내에서 해결하기 위해 flex item의 폭을 100px에서 83.33px로 크기로 줄이고 행의 숫자를 유지한다.

wrap


wrap은 width의 합계가 flex container의 width보다 큰 경우, 행을 하나 추가하여 그곳에 flex item을 배치한다.

5. justify-content

justify-content는 main-axis를 기준으로 flex item수평 정렬한다.

flex-start


flex container의 좌측을 기준으로 정렬하고, justify-content의 기본값이다.

flex-end


flex container의 우측을 기준으로 정렬한다.

center


flex container의 중앙에 정렬한다.

space-between


첫번째와 마지막 flex item은 좌우 끝에 정렬되고 나머지와 균등한 간격으로 정렬된다.

space-around


모든 flex item이 동일한 규격으로 정렬된다

6.align-items

flex itemflex container의 수직 방향으로 정렬한다

stretch


align-items의 기본값이며 cross start에서 end까지 꽉찬 높이를 갖는다

flex-start


cross start의 기준으로 정렬된다

flex-end


cross end의 기준으로 정렬된다

center


flex container의 cross axis의 중앙에 정렬된다

baseline


flex container의 baseline을 기준으로 정렬된다


출처 : https://www.w3.org/TR/css-flexbox/

좋은 웹페이지 즐겨찾기