플렉서블 레이아웃 자식 속성 및 데모 - by. UXKM

  • Publishing
  • CSS
  • CSS 고급
  • 플렉서블 레이아웃 자식 속성 및 데모
요약 설명

Flex(Flexbox)는 CSS3에서 도입된 레이아웃 방식으로, 요소의 크기가 불명확하거나 동적으로 변화할 때에도 유연한 레이아웃을 구현할 수 있습니다.
플렉스 컨테이너(부모 요소)와 플렉스 요소(자식 요소)로 구성되며, display: flex 또는 display: inline-flex로 설정한 요소가 플렉스 컨테이너가 됩니다.

복잡한 레이아웃도 적은 코드로 간단하게 표현할 수 있으며, 다양한 화면 크기와 기기에서 요소들이 자동으로 재정렬되어 반응형 웹을 구현하는 데 유용합니다.
과거에는 float이 주로 사용되었지만, 현재는 flex 또는 grid가 주로 사용됩니다.

자식 속성(Properties for the Parent - Flexbox Container)

flex container의 자식 요소입니다.
float, clear, vertical-align 속성은 flex item에 영향을 주지 않습니다.

[Flexbox Items]
Flexbox Container

flex-grow

flex-grow 속성은 플렉스 컨테이너 내에서 할당 가능한 공간이 있을 때, 플렉스 요소가 얼마나 확장될지를 지정하는 확대 인자(flex grow factor)입니다.
기본값은 0이며, 양수 값만 사용할 수 있습니다.

모든 형제 요소가 동일한 flex-grow 값을 가지면 동일한 공간을 할당받고, 서로 다른 값을 지정하면 그 비율에 따라 공간을 나누어 할당받습니다.
일반적으로 flex-growflex-shrink, flex-basis와 함께 flex 축약형 속성으로 사용합니다.

[flex-grow를 시각적으로 설명하는 다이어그램]
flex-grow를 시각적으로 설명하는 다이어그램
[모든 flex item이 동일한 flex-grow 속성값을 가지면 모든 flex item은 동일한 너비를 갖습니다.]
flex-grow를 시각적으로 설명하는 다이어그램
[두 번째 flex itemflex-grow 속성값을 3으로 지정하면 다른 flex item보다 더 넓은 너비를 갖습니다.]
flex-grow를 시각적으로 설명하는 다이어그램

flex-grow 예제

flex-shrink

flex item의 너비에 대한 축소 인자(flex shrink factor)를 지정합니다.
flex-item 요소의 크기가 flex-container 요소의 크기보다 클 때 사용하며, 설정된 숫자 값에 따라 flex-container 요소 내부에서 flex-item 요소의 크기가 축소됩니다.

기본값은 1, 적용 가능한 값은 양수입니다. 0을 지정하면 축소가 해제되어 원래의 너비를 유지합니다.
참고로 flex-basis 값이 설정되었다면 기존의 width 또는 height 속성 보다 우선 적용됩니다.

w3.org/TR/css-flexbox-1/#flex-shrink-property

[기본은 flex container의 너비에 마춰 축소 / 특정 flex item만 해제(flex-shrink: 0;)하면 원래 너비 유지]
기본은 flex container의 너비에 마춰 축소 / 특정 flex item만 해제(flex-shrink: 0;)하면 원래 너비 유지

감소 너비(flex-shrink)는 요소의 너비에 영향을 받기 때문에 계산이 까다롭습니다.
영향을 받는 요소의 너비는 width, height, flex-basis 등으로 너비가 지정된 경우를 의미합니다.
flex container의 너비가 줄어 flex Items의 너비에 영향을 미칠 경우, 영향을 미치기 시작한 지점부터 줄어든 거리 만큼 감소 너비 비율에 맞게 flex Item의 너비가 줄어듭니다.

예를 들어 flex container의 너비가 줄어 flex Item의 너비에 영향을 미치기 시작한 지점부터 실제 줄어든 거리가 90px일 때,
요소 너비가 같은 flex Item이 2개이고 flex-shrink가 각각 2와 1이라면,
감소 너비는 2:1 비율이며,
첫 번째 flex Item90px의 2/3인 60px 만큼 너비가 감소하고,
두 번째 flex Item90px의 1/3인 30px 만큼 너비가 감소합니다.

다른 예시로 flex container의 너비가 줄어 flex Item의 너비에 영향을 미치기 시작한 지점부터 실제 줄어든 거리가 90px일 때,
요소 너비가 다른 flex Item이 2개이고 요소 너비는 각각 200px100px이고,
flex-shrink가 각각 2와 1이라면,
200 x 2 = 400과 100 x 1 = 100 즉 감소 너비는 4:1 비율이며,
첫 번째 flex Item90px의 4/5인 72px 만큼 너비가 감소하고,
두 번째 flex Item90px의 1/5인 18px 만큼 너비가 감소합니다.

[ flex-shrink ]
flex-shrink flex-shrink

flex-shrink 예제

flex-basis

flex-basis 속성은 플렉스 아이템의 초기 크기를 지정합니다. box-sizing을 따로 지정하지 않는다면 콘텐츠 박스의 크기를 변경합니다.
auto 값을 가지지 않은 flex-basiswidth(flex-direction: column인 경우 height) 값을 동시에 적용한 경우 flex-basis가 우선합니다.
flex item의 너비 기본값을 px, % 등의 단위로 지정하며, 기본값은 auto입니다.
flex-basis 속성값은 content 키워드를 사용하거나, <width>를 나타내는 단위를 사용합니다.

w3.org/TR/css-flexbox-1/#flex-shrink-property

  1. <width>

    <length>, 플렉스 컨테이너의 크기에 상대적인 <percentage>, auto 키워드 중 하나. 음수 값은 유효하지 않습니다.

  2. content

    플렉스 아이템의 콘텐츠 크기에 따라 자동으로 크기가 변합니다.

    content 키워드는 Flexible Box Layout의 첫 배포에 포함되지 않아, 일부 오래 된 브라우져는 지원하지 않을 수 있습니다.

    flex-basis와 주 크기(width, height) 속성을 동시에 auto로 설정하면 동일한 효과를 볼 수 있습니다.

    원래 flex-basis: auto의 뜻은 자신의 width 또는 height 속성의 값을 사용하라는 것이었습니다.

    그 후 flex-basis: auto는 자동 크기 조절로 바뀌고, 기존의 auto는 main-size로 바뀌었습니다. bug 1032922에서 구현 기록을 볼 수 있습니다.

    그러나 위의 변경점은 bug 1093316에서 되돌려져 auto 가 다시 width / height 속성을 가리키게 됐고, 대신 새로운 content 키워드가 자동 크기 조절을 맡게 됐습니다. (bug 1105111에서 볼 수 있습니다.)

[flex-basis를 적용한 flex item의 너비]
flex-basis를 적용한 flex item의 너비
flex-basis를 적용한 flex item의 너비 flex-basis를 적용한 flex item의 너비

flex

flex 속성은 flex-grow, flex-shrink, flex-basis를 한 번에 설정하는 축약형 속성입니다.
플렉스 요소가 컨테이너의 공간에 맞춰 확장되거나 축소되는 방식을 제어합니다.

주의: flex-basis의 개별 기본값은 auto이지만, flex 축약형에서 값을 생략하면 flex-basis0이 적용됩니다.
예를 들어, flex: 1; 또는 flex: 1 1;flex: 1 1 0;과 같으며, flex: 1 1 auto;와는 다릅니다.

W3C에서는 개별 속성을 사용하는 것을 권장합니다.

  1. initial

    아이템 크기가 각각의 widthheight 속성에 따라 정해집니다.

    플렉스 컨테이너의 크기를 넘지 않기 위해 최소 크기로 줄어들 수는 있지만, 남은 공간을 채우려 늘어나지는 않습니다.

    flex: 0 1 auto;와 동일합니다.

  2. auto

    아이템 크기가 각각의 widthheight 속성에 따라 정해집니다.

    플렉스 컨테이너의 크기를 넘지 않기 위해 최소 크기로 줄어들 수 있으며, 남은 공간을 채우기 위해 늘어날 수도 있습니다.

    flex: 1 1 auto;와 동일합니다.

  3. none

    아이템 크기가 각각의 widthheightcode> 속성에 따라 정해지며, 컨테이너의 크기에 관계 없이 변하지 않습니다.

    flex: 0 0 auto;와 동일합니다.

  4. <flex-grow>

    플렉스 아이템의 flex-grow를 지정합니다. 음수 값은 유효하지 않습니다.

    생략 시 기본값은 0입니다.

  5. <flex-shrink>

    플렉스 아이템의 flex-shrink를 지정합니다. 음수 값은 유효하지 않습니다.

    생략 시 기본값은 1입니다.

  6. <flex-basis>

    플렉스 아이템의 flex-basis를 지정합니다.

    0을 지정하려면 <flex-grow> 또는 <flex-shrink>로 읽히지 않도록 단위를 붙여야 합니다.

    생략 시 기본값은 auto입니다.

flex 속성은 한 개에서 세 개의 값을 사용해 지정할 수 있습니다.
한 개 또는 두 개의 단위 없는 숫자 값을 사용할 때, <flex-basis>의 값은 auto가 아니라 0이 됩니다.

  1. 값이 한 개일 때

  2. 값이 두 개일때, 첫 번째 값은 <number>여야 하며 <flex-grow>가 됩니다.

  3. 값이 세 개일 때

flex 예제

align-self

align-self는 부모 속성인 align-items보다 우선적으로 개별 flex item을 정렬합니다.
기본값은 auto입니다.

align-items : flex container속성으로 flex itemflex container의 수직 방향(cross axis)으로 정렬

w3.org/TR/css-flexbox-1/#propdef-align-self

[align-self를 시각적으로 설명하는 다이어그램]
align-self를 시각적으로 설명하는 다이어그램

align-self 예제

order

order 속성은 플렉스 요소의 배치 순서를 지정합니다.
HTML 코드를 변경하지 않고도 order 속성값을 지정하여 플렉스 요소를 재배치할 수 있습니다.
기본값은 0이며, 기본 배치 순서는 플렉스 컨테이너에 추가된 순서입니다.

주의: order 속성은 실제 DOM 순서와 화면에 표시되는 순서를 다르게 만들 수 있습니다.
스크린 리더 등 보조 기술은 DOM 순서를 따르기 때문에, 접근성에 문제가 발생하지 않는 경우에만 사용해야 합니다.

w3.org/TR/css-flexbox-1/#order-property

[order를 적용하여 flex item의 배치 순서를 지정]
flex item의 배치 순서를 지정

order 예제

grow, shrink 숫자가 증가, 감소에 따라 계산방법

flex-basis는 플렉스 요소의 초기 크기를, flex-grow는 확장 비율을, flex-shrink는 축소 비율을 지정합니다.
주축이 row일 때는 너비(width), column일 때는 높이(height)를 기준으로 계산합니다.

flex-grow 계산 방법

flex-grow는 컨테이너에 남은 공간이 있을 때, 각 요소가 얼마나 확장될지를 결정합니다.

위 코드에서 flex: 1 0 50pxflex-grow: 1, flex-shrink: 0, flex-basis: 50px를 의미합니다.
shrink: 0이므로 최소 50px보다 축소되지 않으며, grow: 1이므로 50px 이상 확장될 수 있습니다.

예를 들어, 아이템이 7개이고 각각 flex-basis: 50px인 경우, 기본 너비 합은 350px입니다.
컨테이너 너비가 500px이면 남은 공간은 150px이며, 모든 아이템의 grow 값이 1이므로 균등하게 나눕니다.
각 아이템은 50px + (150px ÷ 7) = 71.43px로 확장됩니다.

3번째 아이템만 flex-grow: 2로 설정하면, 남은 공간을 비율로 나눕니다.
비율은 1 : 1 : 2 : 1 : 1 : 1 : 1이며, 총 비율 합은 8입니다.
남은 공간이 150px이면, 3번째 아이템은 150px × (2/8) = 37.5px를 추가로 받아 20px + 37.5px = 57.5px가 되고,
다른 아이템들은 각각 150px × (1/8) = 18.75px를 추가로 받아 50px + 18.75px = 68.75px가 됩니다.

flex-shrink 계산 방법

flex-shrink는 컨테이너 너비가 아이템들의 기본 너비 합보다 작을 때, 각 요소가 얼마나 축소될지를 결정합니다.
축소해야 할 공간 = 컨테이너 너비 - 아이템 기본 너비 합이며, shrink 값의 비율에 따라 분배됩니다.

예를 들어, 아이템 7개의 기본 너비 합이 500px이고 컨테이너 너비가 400px이면, 100px을 축소해야 합니다.
모든 아이템의 shrink 값이 1이면 균등하게 축소되며, shrink: 2인 아이템은 다른 아이템보다 2배 더 많이 축소됩니다.

Flexbox Demo

flex의 속성을 이용한 다양한 예제 입니다.
예제의 코드 확인 후 결과 화면을 '브라우저 전체 화면' 또는 '모니터 전체 화면'으로 확인하면 결과물에 대한 이해가 조금 더 용이해집니다.

수직 및 수평 가운데 정렬(Vertical and Horizontal Centering)

flex-direction, justify-content, align-items Demo

Multi-Column Layout

네이비게션