flexbox는 행과 열 형태로 자식 요소를 배치하기 위한 레이아웃 속성이다.
테스트 페이지 바로가기
간단한 예제로 <ul>
안의 <li>
3개를 정렬해보는 예제이다.
우선 아래와 같이 마크업 한다.
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
구분을 위해 <li>
요소에 배경색 지정 후 화면을 확인해보면 아래와 같다.
정렬을 위해서 flex container에 display 속성 값을 지정한다.
ul {display:flex;}
처음엔 블록 요소의 특성상 단이 나뉘었지만 속성 값 추가 후 확인해보면 정렬된 것을 확인할 수 있다.
flex item의 흐름은 축에 따라 결정된다.
축의 방향은 flex container에 flex-direction 속성으로 설정한다.
주요 속성 값은 4가지가 있다.
속성 | 설명 |
---|---|
row | 기본값으로, 왼쪽으로 오른쪽 방향으로 정렬된다. |
row-reverse | 기본값과 동일하게 가로 정렬이지만 오른쪽에서 왼쪽으로 정렬된다. |
column | 위에서 아래 방향으로 정렬된다. |
column-reverse | 아래에서 위 방향으로 정렬된다. |
flex container에 높이와 배경색 추가 후 하나씩 확인해보면 다음과 같다.
ul {
display:flex;
height:300px;
background-color:#333;
}
1) row
2) row-reverse
3) column
4) column-reverse
우선 flex item의 flex 속성에 대한 이해가 필요하다.
아래 코드와 같이 <ul>
에는 ‘flex-wrap’, <li>
에는 ‘flex’ 속성을 추가한다.
ul {
display:flex;
height:300px;
background-color:#333;
flex-wrap:wrap;
}
li {flex:300px;}
flex 값으로 300px을 설정했다.
이는 {min-width:300px;}와 비슷하게 동작한다. (완벽하게 똑같지는 않다)
즉 가로로 최대 100% 너비를 가지지만 300px 미만으로는 감소하지 않는다.
때문에 브라우저 너비 900px 이상과 이하 사이즈에서 확인한 UI가 다르게 나타난다.
1) 브라우저 너비 900px
2) 브라우저 너비 899px
위 예제에 이어서 <li>
에 flex 속성 값을 1로 수정한다.
li {flex:1;}
이런 경우 <li>
에 각각 1이라는 값을 설정하게 되는데, 이는 마진과 패딩을 제외하고 동등한 영역을 가지게 된다.
너비가 900px인 경우 각각 300px의 너비를 가지게 된다.
<li>
가 3개이니까 1+1+1=3이고, 1/3씩 영역을 가지게 되는 것으로 이해하면 쉽다.
그렇다면 두 번째 <li>
에 flex 속성을 2로 설정하면 어떻게 될까?
li:nth-child(2) {
flex:2;
}
이 경우 1+2+1=4이고, 2/4 영역을 가지게 되므로 450px의 영역을 가지게 될 것이다.
1번과 3번은 1/4 영역을 가지게 된다.
상단의 css를 지워두고 아래와 같이 수정한다.
li {flex:1 300px;}
이 경우, 최소 너비 300px을 가지게 되고 1/3 영역을 가지게 된다.
만약 브라우저의 너비가 900px 미만이라면 어떻게 될까? 800px에서 확인해보면 아래와 같다.
같은 행(row)에서 비율을 계산하면 된다.
flex 값이 1이기 때문에 1+1=2이므로 1번과 2번은 1/2 영역을 가지게 되고 최소 300px의 너비를 갖는다.
3번은 다음 행으로 구분됐기 때문에 1/1, 즉 100% 영역을 가지게 되고 최소 300px의 너비를 갖는다.
flex item을 수평, 수직 정렬하기 위해서는 justify-content와 align-items 두 속성이 중요하다.
<ul>
<li>list 1</li>
<li>list 2</li>
<li>list 3</li>
</ul>
ul {
display:flex;
height:200px;
background-color:#333;
}
justify-content은 flex item이 기본축에서 어디에 위치할 것인지를 제어하며 flex container 요소에 추가하는 속성이다.
속성 | 설명 |
---|---|
flex-start | 기본값으로, 모든 항목이 기본축의 시작 위치에 놓인다. |
center | 모든 항목이 기본축의 중앙 위치에 놓인다. |
flex-end | 모든 항목이 기본축의 마지막 위치에 놓인다. |
이 외에도 space-around, space-between, space-evenly 가 있다.
각각 화면을 확인해보면 아래와 같다.
1) flex-start
2) center
3) flex-end
align-items는 flex item이 교차축에서 어디에 위치할 것인지를 제어하며 flex container 요소에 추가하는 속성이다.
속성 | 설명 |
---|---|
stretch | 기본값으로, flex item이 부모 요소의 높이를 모두 채우게 된다. |
flex-start | 모든 항목이 교차축의 시작 위치에 놓인다. |
center | 모든 항목이 교차축의 중앙 위치에 놓인다. |
flex-end | 모든 항목이 교차축의 마지막 위치에 놓인다. |
상단의 참고 이미지에서 list들이 모두 높이 100%를 가지고 있는데 stretch가 기본값이기 때문이다.
나머지 속성들을 하나하나 확인해보면 아래와 같다.
1) flex-start
2) center
3) flex-end
위 속성들을 활용하여 여러 형태의 레이아웃 구현이 가능하다.
테스트 페이지 바로가기