Flex
란?->
Flex
는 요소의 크기가 불분명하거나 동적인 경우에도, 각 요소를 정렬할 수 있는 효율적인 방법을 제공합니다.
우선 Flex는 2개의 개념으로 나뉘어진다.
첫 번째는 Container
두 번째는 Items
이다.
위에서 살펴본 바와 같이 Container
는 Items
를 감싸는 부모 요소이며, 각 Item
을 정렬하기 위해선 Container
가 필수적이다.
주의할 부분은 Container
와 Items
에 적용하는 속성이 구분되어 있다는 것이며,
Container
에는 display
, flex-flow
, justify-content
등의 속성을 사용할 수 있으며,
Items
에는 order,
flex
, align-self
등의 속성을 사용할 수 있다.
Flexbox
를 설명하는 가장 기본적인 개념은Flex-container(부모)
/ Flex-item(자식)
에서부터 시작한다.
Flexbox
의 중요한 특징은 아이템 각각에다가 명령을 하는 것이 아니라, 부모한테 명령하는 것이다. “아빠! 애들을 좀 떨어트려놔줘” 하고. flex-container(부모)
에게 display:flex
를 선언하게 되면 flex-items
은 즉각적으로 영향을 받고 실행된다.
하지만 여기서 유의해야할 건, flex-container
와 flex-items
가 직접적으로 종속관계에 있어야지 Flex
모드가 제대로 적용된다. 초보 단계에서 가장 많이 하는 실수중에 하나가 바로 이 부분.
예시를 보며 구체적으로 알아보자. 다음과 같이 박스 세개를 만들어봤다.
기본적으로는 블럭 형식으로 디스플레이가 되었다.
<div class="father">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
.box {
width: 50px;
height: 50px;
background-color: palevioletred;
border: 1px solid white;
}
여기서 부모태그에 display: flex를 선언해보면
.father {
display: flex;
}
위와 같이 display : flex;
속성이 적용되어 박스의 배열이 바뀌게 된다.
어떤 축을 기준으로 정렬할지 설정하느냐에 따라 정렬이 달라지게 되는데,
이를 flex-direction
의 값은 row(가로정렬)
와 column(세로정렬)
을 기준을 둔다. 방향을 설정하지 않으면 기본값으로 row
가 기준축, column
은 세로축으로 적용된다. 하지만 flex-direction
의 옵션을 column
으로 변경하면 main-axis
와 cross-axis
는 서로 바뀌게 되어 세로축이 기준축, 가로축이 교차축이 된다.
위의 예시는 축 방향을 설정하지 않았기 때문에 기본값 row(가로정렬)
가 기준축으로 적용되어 row(가로)
로 박스들이 정렬되었다.
복잡한 개념같지만 간단하게 생각하면 flex-direction
은 기본적으로 row
이다.
즉, flex-direction
따로 값을 설정하지 않으면 flex
속성은 기본적으로 가로로 정렬이 된다.
1)
flex-direction: row-reverse
기준축이 가로 정렬, 교차축이 세로정렬이되 아이템의 정렬순서가 뒤바뀐다.
flex-start와 flex-end의 방향도 반대로 돌려진다.
2)flex-direction: column-reverse
기준축이 세로 정렬, 교차축이 가로정렬이되 아이템의 정렬 순서가 뒤바뀐다.
마찬가지로 flex-start와 flex-end의 방향도 반대로 돌려진다.
.father {
display: flex;
flex-direction: row-reverse;
justify-content: flex-start;
}
위처럼, 아이템들의 정렬 순서가 바뀌었고 flex-start 역시 끝에서부터 정렬되는 형태가 된 것을 알 수 있다.
앞서 말한 축에 대한 개념을 기반으로 디테일한 정렬들을 이용할 수 있는데, 크게 justify-content
와 align-items
로 나뉜다.
기본값인 flex-direction: row (가로정렬)
를 기준으로 예시를 들면,
justify-content
: 기준축의 정렬을 관리한다.
(디폴트:아이템을 수평으로 정렬한다.)
align-items
: 교차축의 정렬을 관리한다.
(디폴트:아이템을 수직으로 정렬한다.)
space-between
: 아이템들을 일정한 간격을 두고 양 끝에 배치한다.
space-around
: 아이템들 사이에 일정한 간격을 형성해준다.
flex-start
: (기본값) 아이템을 앞에서부터 순서대로 정렬한다.
flex-end
: 아이템을 끝에서부터 순서대로 정렬한다.
Flexbox
에서 가장 많이 사용되는 정렬 중에 하나는 바로 요소들을 일정한 간격을 두고 양 끝에 배치하는 방식이다.
justify-content : space-between
을 이용하여 정렬하는데 결과는 다음과 같이 나온다.
flex-direction = column으
로 변경한 후 justify-content = space-between
을 적용하면 어떻게 될까?
아래사진을 보면 알 수 있겠지만, 축 방향은 변경되어 세로정렬 되었지만 양 끝으로 배치되지 않았다. 그 이유가 중요한데, 정렬이 될 만큼 충분한 사이즈의 세로값이 입력되어 있지 않기 때문이다.
flex
를 선언한 부모태그에 세로값 height= 50vh
을 적용하면 justify-content = space-between
정렬이 제대로 적용되었다. (세로 축의 크기가 늘어나서 정상적인 적용이 가능해짐.)
flexbox
는 기준축을 중심으로 아이템을 정렬하는 방식이다.기준축(row/column)
에 따라,justify-content
와align-items
의 정렬방식이 결정된다.- 정렬을 할 수 있는 충분한
가로값(width)
,세로값(height)
을flex-container(부모태그)
에 줘야만 정렬이 정상적으로 작동한다.