본문 바로가기

프론트엔드/HTML, CSS, JS기본

CSS 속성(8) - 플렉스(정렬) container & items

플렉스

플렉스(정렬) 1차원 레이아웃을 다룹니다.

1차원 레이아웃은 x축, y축만 존재하며, 수평, 수직으로 정렬하는 것을 의미합니다.

 

flex 속성 추가하지 않을 때
display: flex

부모 요소의 CSS 속성에서 display: flex 를 추가하면 수평정렬인 것을 확인할 수 있습니다.

display: flex를 추가된 요소는 Flex Container이라고 불리고,

수평정렬된 요소들은 Flex Items라고 불립니다.

 

display

display는 Flex Container의 화면 출력(보여짐) 특성을 제어하는 속성입니다.

flex(블록 요소와 같이 Flex Container 정의),

inline-flex(인라인 요소와 같이 Flex Container 정의) 값들이 있습니다.

 

flex-direction

flex-direction주 축을 설정하는 속성입니다.

row 기본값(행 축, 좌→우)이 들어 있으며,

row-reverse(행 축, 우→좌),

column(열 축, 위→아래),

column-reverse(열 축, 아래→위) 값들도 있습니다.

 

flex-direction: row;

row인 기본값을 적용한 후 보이다시피 좌측에서 우측으로 수평 정렬을 합니다.

flex-direction: row-reverse;

row-inverse 값을 적용한 후 우측에서 좌측으로 수평 정렬을 합니다.

flex-direction: column;

column 값을 적용한 후 위에서 아래로 수직 정렬을 합니다.

flex-direction: column-reverse;

column-inverse 값을 적용한 후 아래에서 위로 수직 정렬을 합니다.

 

flex-wrap

flex-wrap Flex Items 묶음(줄 바꿈) 여부를 결정하는 속성입니다.

nowrap 기본값(묶음 없음)이 들어 있으며,

wrap(여러 줄로 묶음),wrap-reverse(wrap의 반대 방향으로 묶음) 값들이 있습니다.

 

flex-wrap: nowrap ;

flex-wrap 속성의 기본값이 들어 갔을 때,

보시다시피, 자식 요소들 모두 정사각형으로 너비 속성 부여했더라도

찌그러지게 배치됩니다.

flex-wrap: wrap;

wrap값을 넣으니까 줄 바꿈이 되었습니다.

 

justify-content

justify-content

는 

주 축의 정렬 방법

을 결정하는 속성입니다.

flex-start 기본값(Flex Items를 시작점으로 정렬)이 들어 있으며,

flex-end(Flex Items를 끝점으로 정렬),

center(Flex Items를 가운데 정렬),

space-between(각 Flex Items 사이를 균등하게 정렬),

space-around(각 Flex Items의 외부 여백을 균등하게 정렬) 값들이 있습니다.

 

justify-content: flex-start;

flex-start인 기본값을 부여하면 시작점인 왼쪽으로 정렬됩니다.

justify-content: flex-end;

flex-end 값을 부여하면 끝점인 오른쪽으로 정렬됩니다.

justify-content: center;

center 값을 부여하면 가운데로 정렬됩니다.

 

align-content

align-content 교차 축의 여러 줄 정렬 방법을 결정하는 속성입니다.

stretch 기본값(Flex Items를 시작점으로 정렬)이 들어 있으며,

flex-start(Flex Items를 시작점으로 정렬),

flex-end(Flex Items를 끝점으로 정렬),

center(Flex Items를 가운데 정렬),

space-between(각 Flex Items 사이를 균등하게 정렬),

space-around(각 Flex Items의 외부 여백을 균등하게 정렬) 값들이 있습니다.

display: flex 와 flex-wrap: wrap 들어가 있으며, flex items의 height를 지정하지 않았습니다.

height가 auto인 상태에서 stretch 늘어나는 것을 보일 것입니다.

height를 100px로 지정하고 나서 두 열로 구성되 있으며 가운데에 비어 있습니다.

align-content: flex-start;

flex-start 값을 부여하면 시작점인 윗쪽에서 차곡차곡 정렬됩니다.

align-content: center;

center 값을 부여하면 가운데에서 정렬됩니다.

align-content: flex-end;

flex-end 값을 부여하면 끝점인 아래쪽으로 정렬됩니다.

 

align-items

align-items 교차 축의 한 줄 정렬 방법을 결정하는 속성입니다.

stretch 기본값(Flex Items를 교차 축으로 정렬)이 들어 있으며,

flex-start(Flex Items를 각 줄의 시작점으로 정렬),

flex-end(Flex Items를 각 줄의 끝점으로 정렬),

center(Flex Items를 각 줄의 가운데 정렬),

baseline(Flex Items를 각 줄의 문자 기준선에 정렬) 값들이 있습니다.

align-items: flex-start;

flex-start 값을 부여하면 시작점인 윗쪽으로 정렬됩니다.

align-items: center;

center 값을 부여하면 가운데에서 정렬됩니다.

align-items: flex-end;

flex-end 값을 부여하면 끝점인 아래쪽으로 정렬됩니다.

 

여기까지 모두 Flex Container에 부여하는 여러 속성을 다뤄봤는데

아래부터 Flex Item에 부여하는 속성을 다뤄 보겠습니다.

 

order

order Flex Item의 순서

를 결정하는 속성입니다.

0 기본값(순서 없음)이 들어 있으며,

숫자가 작을 수록 먼저입니다.

 

order: 0;

기본값을 부여하면 요소 작성 순서 정렬됩니다.

order: 숫자;

예시처럼 order속성에 숫자를 부여했습니다.

-1인 C요소는 가장 작아서 맨 왼쪽에 배치되었습니다.

A와 D요소는 부여된 숫자가 없어서 0인 기본값을 가지며 제자리에 있습니다.

B요소는 17인 가장 큰 숫자를 부여해서 맨 끝에 배치되며,

E요소는 2인 가운데 숫자를 부여해서 B보다 작아서 B의 앞에 배치되었습니다.

 

flex-grow

flex-grow Flex Item의 증가 너비 비율을 결정하는 속성입니다.

0 기본값(증가 비율 없음)이 들어 있으며,

숫자는 증가 비율을 의미합니다.

flex-grow: 0;

기본값을 부여하면 기준 크기 나타납니다.

A요소에만 flex-grow: 1; 부여

 A요소에 flex-grow: 1를 부여하고, B,C요소는 부여하지 않았습니다.

B,C요소 크기는 그대로며, A요소는 원래 부모 요소의 나머지 공간을 100% 차지게 됩니다.

B, C요소에 각각 flex-grow 숫자 부여

A요소에는 부여된 값이 없어서 자기만에 차지한 공간을 그대로 유지됩니다.

B, C요소는 각각 2, 1를 부여했습니다.

즉, 나머지 공간은 B : C = 2 : 1 비율로 차지게 됩니다.

 

flex-shrink

flex-shrink Flex Item의 감소 너비 비율을 결정하는 속성입니다.

1 기본값(Flex Container 너비에 따라 감소 비율 적용)이 들어 있으며,

숫자는 감소 비율을 의미합니다.

왼쪽은 부모요소가 자식요소 너비보다 크며 오른 쪽은 그 반대지만 각 자식요소 1:1:1비율로 나타납니다

왼쪽 예시에서는 부모요소가 자식요소 너비보다 커서 자식요소들 나란히 잘 나옵니다.

오른쪽 예시에서는 부모요소가 자식요소 너비보다 작습니다.

자식요소의 너비가 각각 100px로 지정함에도 불구하고 찌그러지면서 부모요소에 맞춰줍니다.

flex-shrink: 0;

flex-shrink에 0으로 부여해서 너비 감소 비율을 0으로 하자는 뜻으로 ABC 요소 너비는 그대로 유지됩니다.

 

flex-basis

flex-basis Flex Item의 공간 배분 전 기본 너비를 결정하는 속성입니다.

auto 기본값(요소의 Content 너비)이 들어 있으며,

px, em, rem등 단위로 지정할 수 있습니다.

위 예시처럼, flex-basis는 auto값이 들어 갔으며, 즉, 문자 content 너비를 확보했습니다.

그 후 content옆에, 요소에 남은 공간인 flex-grow를 1:1:2 비율로 공간을 분배해줍니다.

잘 보시면 3개의 요소가 정확한 1:1:2로 공간 차지지 않았습니다.

이게 요소들 중에 content가 있어서 그렇습니다.

방금 content니 뭐니 고려해서 복잡하게 계산한 거보다

단순히 요소의 전체 너비를 비율대로 배분하고 싶으면,

flex-basis에 0값을 부여하면 됩니다.

더 나아가 flex-basis에 비율대신 다른 단위로 지정하면

조금 더 복잡하게 진행됩니다.

실무에서 거의 사용 안 합니다.