Flexbox가 나오기 전까지는 position, float , inline-block 등을 사용해 블록을 정렬했다. 하지만 데스크탑 시대를 벗어나 모바일 시대로 접어들면서 보다 유연한 형태의 레이아웃 매커니즘이 필요해졌다.
그에 따른 차세대 레이아웃에는 Flexbox, Grid 등이 있으며, 이 포스팅에서는 그 중 Flexbox에 대해 다뤄보겠다.
이 Flexbox 레이아웃을 형성하는 가장 기본적인 요소는 컨테이너(container)와 항목(items) 이다. 이 플렉스 항목의 가장 기본적인 기능은 컨테이너 내에서 크기를 유연하게 조절하는 능력이다.
즉, 공간에 따라서 가로 또는 세로의 길이를 조절할 수 있고, 공간에 대한 비율을 기반으로 크기를 조절할 수 있다. 또, 순서와 방향도 쉽게 정할 수 있다.
우선 Flexbox를 사용 방법을 보기 위해 다음과 같이 HTML 코드를 작성한다.
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Flexbox</title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div class="container"> <div class="item item1">1</div> <div class="item item2">2</div> <div class="item item3">3</div> <div class="item item4">4</div> <div class="item item5">5</div> <div class="item item6">6</div> <div class="item item7">7</div> <div class="item item8">8</div> <div class="item item9">9</div> <div class="item item10">10</div> </div> </body> </html>
컨테이너에 속성값 부여
Flexbox 레이아웃을 사용하기 위한 첫 번째 단계는 컨테이너에 display: flex;
를 주는 것이다. 컨테이너에 flex 속성 값을 주는 순간, 안에 있는 item들이 가로로 정렬되는 것을 볼 수 있다.
flex-direction: row;
가 기본적값이고 생략해도 상관 없다.
순서를 거꾸로 출력하려면 컨테이너에 flex-direction: row-reverse;
로 세팅하면 된다.
내부 박스들을 가로가 아닌 세로로 정렬하고 싶을 때는 flex-direction: column;
을 사용한다. 역시 거꾸로 출력하려면 column-reverse;
를 사용하면 된다.
또 컨테이너 내부에 박스가 많아질 경우 어떻게 처리할건지를 나타낼 수 있는 속성값이 있다.
/* 한줄에 아무리 박스가 많아져도 한줄에 정렬됨(nowrap) */ flex-wrap: nowrap; /* 한줄에 박스가 꽉차면 다음 라인으로 넘어감(wrap)*/ flex-wrap: wrap;
border값을 지정하는 것처럼 한번에 flex-direction과 flex-wrap에 값을 줄 수도 있다. flex-flow: column nowrap;
다음은 내부 박스를 어떻게 배치할건지를 나타내는 속성 값이다.
/* 아이템을 어떻게 배치할건지(왼쪽 정렬 혹은 오른쪽 정렬 혹은 가운데 정렬)를 결정함 */ /*기본값: flex-start(왼쪽에서부터 정렬) */ justify-content: flex-start; /* 박스 오른쪽으로 정렬 */ justify-content: flex-end; /* 박스 가운데 정렬 */ justify-content: center;
다음은 가로로 박스를 어떻게 정렬할건지를 나타내는 속성값이다.
/* 박스 사이에 일정한 간격을 준다.(대신 처음과 끝 박스의 간격이 조금 다름, 박스가 마진을 가지는거라고 생각) */ justify-content: space-around; /* 처음과 끝 박스의 간격도 똑같이 부여 */ justify-content: space-evenly; /* 처음과 끝 박스는 부모에 붙이고, 남은 박스들에 간격을 주는것 */ justify-content: space-between; /* main axis */
이번엔 세로로 박스를 어떻게 정렬할건지를 나타내는 속성 값이다.
/* 수직으로 가운데 정렬을 하고싶을때 사용*/ align-items: center; /* 아이템에 padding 값이 있어서 텍스트 위치가 박스하나의 위치가 바뀌었을때 베이스라인에 맞출수있다. */ align-items: baseline; /* justify와 반대되는 개념. 수직으로 간격을 줌 , justify에 사용되는 모든 값 동일하게 사용 가능*/ align-content: space-between; }
아이템에 속성값 부여
- 박스의 순서를 바꿀때 사용하는 속성값
.item1 { background: #ef5350; /* 박스의 순서를 바꿀수 있다. */ order: 2 ; (두번째로 감) }
- 스크린이 커지거나 작아질때 박스가 커지는 비율 및 작아지는 비율 설정 속성값
.item2 { background: #ec407a; /* 컨테이너가 커져도 박스는 원래 크기를 유지한다(디폴트) 만약 커졌을때 박스의 크기를 키우고싶으면 flew-grow 사용 */ flex-grow: 1; /* 컨테이너가 작아질때 어떻게 작아져야하는지 flex-shrink 사용*/ flex-shrink: 1; /* 박스의 flew-grow를 2로 주면 컨테이너가 커질때 다른 박스에 비해 2배로 커짐.*/ flex-grow: 2; /* 컨테이너가 작아질때 2배로 빨리줄어듬*/ flex-shrink: 2; }
- 박스가 항상 컨테이너에 내에서 일정 비율을 차지하게끔 만들어주는 속성값
.item5 { background: #29b6f6; /* 컨테이너의 width의 몇프로를 항상 차지하게 만들수있는 것 (절대값으로 지정) */ flex-basis: 40% : 항상 40%차지 }
- 하나하나의 박스도 따로 정렬이 가능하다.
.item8 { background: #ffee58; /* 박스 위치를 따로 배정가능하다 (수직으로) */ align-self: center; }
이 속성값들 역시 border 에 속성 값을 주는 것처럼, 한 번에 사용 가능하다.
flex: 2 2 auto; /* grow, shrink, basis */
퍼가욧!! 6666