마크업을 2년 동안 했지만 학원에서 배울 땐 Float을 사용했었고 입사했는데도 float을 자주 볼 수 있었다. 레이아웃에 최적화된 flex와 grid가 있건만 그것을 제대로 배우지도, 알지도 못해서 떳떳하지 못했다. 공부 기간이 조금 늘어난 덕에 이전에 구매해놓은 노마드코더 CSS Layout 마스터클래스
를 들어보게 되었다! flex 부분은 완강했고 정리를 해볼까한다.
Flexible Box Moudule은 flexbox 인터페이스 내의 아이템 간 공간 배분과 정렬 기능을 제공하기 위한 1차원 레이아웃 모델로 설계되었다.
중요한 점! 🌟
Flexbox를 1차원이라 칭하는 것은, 레이아웃을 다룰 때 한 번에 하나의 차원(행이나 열)만을 다룬다는 것. 행과 열을 함께 조절하는 Grid layout의 2차원 모델이랑 대조된다.
display
property의 값 중 inline-block
은 요소들을 나란히 배치 시키는 inline
의 주요 특성과, width
, height
를 가질 수 있는 block
의 주요 특성을 동시에 지닌다.
그런데 inline-block
의 문제점은 의도치않게 요소들 사이에 공백이 있다는 점, 특정 기기의 사이즈에 맞게 디자인을 유연하게 맞출 수 없다는 점이 있다.
이 점을 보완한 display
의 값은 flex
(display: flex;
).
배치를 원하는 요소들(children)의 parent 요소를 flexbox로 지정해야 한다!
flex container에서 부모가 자식의 위치를 변경한다는 것이 핵심이다.
<body>
<div class="father">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
</div>
</body>
.father {
display: flex;
width: 100%;
}
.child {
flex-basis: 300px;
}
flexbox를 다루려면 main-axis 주축과 cross-axis 교차축이라는 두 개의 축에 대한 정의를 알아야함! 그리고 그것을 이해하려면 또 두 가지를 알아야한다.
horizontal
vertical
justify-content
flex-direction
에 의해 정의되며 4개의 값을 가질 수 있다.
row
row-reverse
column
column-reverse
row
혹은 row-reverse
를 선택하면 주축은 인라인 방향으로 행을 따른다.
column
혹은 column-reverse
를 선택하면 주축은 페이지 상단에서 하단으로 블록 방향을 따른다.
flex-container의 flex-direction
기본 값은 row
이다.
이때 해당 row
에 있는 item의 위치를 변경시키기 위해선 justify-content
를 사용하는데, 이는 main-axis방향으로 flex child의 위치를 변경한다.
align-items
교차축은 주축에 수직된다. flex-direction
(주축)으로 설정된 것에 수직됨.
flex container가 row
을 가질 때 cross-axis는 단어 그대로 가로지르기 때문에 수직(vertical).
cross-axis에서 item을 움직이기 위해서는 align-items
를 사용한다.
수직, 세로로 움직이는 것이다.
주의
align-items: center;
를 사용할 때 반드시 flex container(부모)의 높이가 어느 정도 되는지 반드시 확인하자. 이미 item과 높이가 동일하여 위치를 변환시킬 수 없는 경우가 많기 때문이다.
flex-direction
justify-content
사용하여 item 정렬)align-items
사용하여 item 정렬)justify-content
사용하여 item 정렬)align-items
사용하여 item 정렬)flex-wrap
wrap
, nowrap
, wrap-reverse
flex-wrap: wrap;
(child의 사이즈를 유지하고 flex box너비에 따라 다음 line으로 item이 맞춰짐.)flex-wrap: nowrap;
(child를 모두 같은 줄에 정렬함, 이때 각 item width가 줄어들 수 있음.)flex-wrap: wrap-reverse;
(그림 참고. wrap과 같이 칸이 나누어지나, reverse된 상태)이때!🙋🏻♀️
wrap으로 정렬 시 (여러 줄으로, 각 item의 width를 유지하면서)
각 줄(기본: row) 간의 간격이 생기는데, 이것을 align-content
라는 property로 조절 가능
flex-flow
정말 간단히 말하면 flex-direction
& flex-wrap
동시에 쓸 수 있는 속성.
첫 번째 값은 flex-direction
이고 두 번째 값은 flex-wrap
이다.
align-content
justify-content
와 비슷하지만 cross-axis 방향의 정렬을 조정
각 block이 여러 행에 걸쳐 나올 때, 행간 공백을 얼마나 둘 건지?
여러 줄의 Flex 항목들이 컨테이너에 있는 경우에만 작동, 즉, Flex 항목들이 한 줄에 모두 배치될 수 있는 상황에서는 align-content
가 적용되지 않음
align-content: flex-start;
-- align-content: space-around;
flexbox의 children 요소에 추가할 수 있는 property
align-self
& order
부모가 아닌 자식 아이템의 위치(position)를 직접 변경하고 싶을 때는 align-self
와 order
를 사용한다. 이때 유의할 점은 부모의 높이(heigth)가 설정되어 있어야 한다.
align-self
는 align-item
과 같이 동작한다.order
의 경우 단어 그대로 순서를 바꾼다. flex~
속성flex-grow
, flex-shrink
, flex-basis
위의 세 가지 속성을 변경한다는 것은 flex 항목에게 사용가능한 공간을 분배하는 방식을 변경하는 것.
사용가능한 공간 개념은 flex 항목을 정렬할 때 특히 중요하다.
flex-basis
flex-basis
는 flex-shrink
와 flex-grow
를 위한 기본 세팅이다.flex-basis
는 main axis(주축) 쪽 크기를 정해준다. flex-direction
이 row(default)
일 때는 width
와 같이 작용, column
일 때는 height
와 같이 작용한다.flex-shrink
flex-wrap: nowrap;
일때, 화면이 작아지면 width가 설정되어있어도 줄어든다.flex-shrink: 1;
➡️ 동일해짐flex-shrink: n(정수);
flex-grow
flex-basis
값 이상으로 늘어날 수 있게 된다.flex-grow: 1;
➡️ 값을 1로 지정하면 사용가능한 공간은 각 항목에게 동일하게 분배flex-grow
property가 0인 상태거나, 따로 정의되지 않았다면, 화면이 커져도 각 element 크기가 커지지 않음 (여백만 늘어나게 됨)참고
flex-grow
와 flex-shrink
의 값은 비율임을 유의.
flex
flex-grow
, flex-shrink
, flex-basis
값을 각각 사용하지 않고 이 세 속성을 한번에 지정하는 flex 축약형을 많이 사용한다.flex-grow
, flex-shrink
, flex-basis
순서로 지정