CSS 플렉서블 박스 레이아웃 모듈 레벨 1

W3C 후보 권고안 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/CRD-css-flexbox-1-20251014/
최신 공개 버전:
https://www.w3.org/TR/css-flexbox-1/
에디터스 드래프트:
https://drafts.csswg.org/css-flexbox/
히스토리:
https://www.w3.org/standards/history/css-flexbox-1/
구현 보고서:
https://wpt.fyi/results/css/css-flexbox
피드백:
CSSWG 이슈 저장소
명세 내 인라인
에디터:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (Apple)
(Microsoft)
이전 에디터:
(Microsoft Corporation)
L. David Baron (Mozilla)
(Mozilla Corporation)
(이전 Opera Software 소속)
(이전 Netscape Corporation 소속)
명세 수정 제안:
GitHub 에디터
이슈 목록:
https://drafts.csswg.org/css-flexbox-1/issues
테스트 스위트:
https://wpt.fyi/results/css/css-flexbox/

요약

이 명세서는 사용자 인터페이스 디자인에 최적화된 CSS 박스 모델을 설명합니다. 플렉스 레이아웃 모델에서는 플렉스 컨테이너의 자식들이 어떤 방향으로든 배치될 수 있고, 크기를 “플렉스”하여 남은 공간을 채우거나 부모가 넘치지 않도록 줄어들 수 있습니다. 자식 요소의 수평 및 수직 정렬을 쉽게 조작할 수 있습니다. 이러한 박스의 중첩(수평 안에 수직, 또는 수직 안에 수평)을 통해 2차원 레이아웃을 구성할 수 있습니다.

CSS는 구조화된 문서(예: HTML, XML)의 렌더링을 화면, 인쇄물 등에서 기술하는 언어입니다.

이 문서의 상태

이 섹션은 본 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에서 후보 권고안 초안으로 권고안 트랙을 사용하여 발행되었습니다. 후보 권고안으로 발행되었다고 해서 W3C 및 회원의 승인임을 의미하지는 않습니다. 후보 권고안 초안은 작업 그룹이 이후 후보 권고안 스냅샷에 포함하고자 하는 이전 후보 권고안의 변경사항을 통합합니다.

이 문서는 초안이며 언제든지 업데이트, 교체 또는 다른 문서로 대체될 수 있습니다. 진행 중인 작업이 아닌 용도로 본 문서를 인용하는 것은 부적절합니다.

피드백은 GitHub에서 이슈 등록(권장)으로 보내주시고, 제목에 명세 코드 “css-flexbox”를 포함하여 다음과 같이 작성해 주세요: “[css-flexbox] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브됩니다. 또는 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 피드백을 보낼 수도 있습니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 공개된 특허 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 개인이 특정 특허가 필수 클레임을 포함한다고 실제로 알고 있는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다.

CSS 2.1은 네 가지 레이아웃 모드를 정의했습니다 — 박스의 형제 및 조상 박스와의 관계에 따라 박스의 크기와 위치를 결정하는 알고리즘입니다:

이 모듈은 새로운 레이아웃 모드인 플렉스 레이아웃을 도입합니다. 이는 보다 복잡한 애플리케이션과 웹페이지 레이아웃을 위해 설계되었습니다.

1.1. 개요

이 섹션은 규범적이지 않습니다.

플렉스 레이아웃은 표면적으로 블록 레이아웃과 비슷합니다. 플렉스 레이아웃에서는 floatcolumn과 같이 블록 레이아웃에서 사용되는 복잡한 텍스트 중심 또는 문서 중심 속성이 많이 없습니다. 대신에 플렉스는 공간 분배와 콘텐츠 정렬을 위한 간단하고 강력한 도구를 제공하여 웹 앱과 복잡한 웹페이지에서 자주 필요한 기능을 제공합니다. 플렉스 컨테이너의 내용은 다음과 같습니다:

다음은 각 항목에 제목, 사진, 설명, 구매 버튼이 있는 카탈로그의 예시입니다. 디자이너의 의도는 각 항목이 동일한 전체 크기를 갖고, 사진은 텍스트 위에 위치하며, 구매 버튼은 항목 설명의 길이에 상관없이 하단에 정렬되는 것입니다. 플렉스 레이아웃은 이러한 디자인을 쉽게 만듭니다:
#deals {
  display: flex;        /* 플렉스 레이아웃으로 항목들이 동일한 높이를 가짐  */
  flex-flow: row wrap;  /* 여러 줄로 래핑 허용 */
}
.sale-item {
  display: flex;        /* 각 항목을 플렉스 레이아웃으로 배치 */
  flex-flow: column;    /* 항목 내부를 수직으로 배치  */
}
.sale-item > img {
  order: -1;            /* 이미지의 시각적 순서를 앞쪽으로 이동 */
  align-self: center;   /* 이미지를 크로스 방향(수평) 중앙에 배치         */
}
.sale-item > button {
  margin-top: auto;     /* auto 상단 마진으로 버튼을 하단으로 밀어줌 */
}
<section id="deals">
  <section class="sale-item">
    <h1>컴퓨터 스타터 키트</h1>
    <p>이것은 예산이 많지 않은 사람에게 최고의 컴퓨터입니다.
    <ul>
      <li>컴퓨터
      <li>모니터
      <li>키보드
      <li>마우스
    </ul>
    <img src="images/computer.jpg"
         alt="구성품: 흰색 컴퓨터와 일치하는 주변기기.">
    <button>지금 구매</button>
  </section>
  <section class="sale-item"></section></section>
구성품: 흰색 컴퓨터와 키보드, 모니터.

컴퓨터 스타터 키트

이것은 예산이 많지 않을 때 최고의 컴퓨터입니다.

  • 컴퓨터
  • 모니터
  • 키보드
  • 마우스
구성품: 아름다운 ASCII 아트.

프린터

ASCII 아트만 인쇄 가능.

  • 종이와 잉크는 포함되지 않음.
위 코드의 렌더링 예시입니다.

1.2. 모듈 상호작용

이 모듈은 display 속성의 정의를 확장합니다 [CSS2], 새로운 블록 수준 및 인라인 수준 display 타입을 추가하고, 새로운 형식화 컨텍스트와 그 레이아웃을 제어하는 속성을 정의합니다. 이 모듈에서 정의된 속성은 ::first-line 또는 ::first-letter 의사 요소에는 적용되지 않습니다.

CSS 박스 정렬 모듈은 여기서 소개된 정렬 속성의 정의를 확장 및 대체합니다 (justify-content, align-items, align-self, align-content) 등입니다.

테스트

1.3. 값 정의

이 명세는 CSS 속성 정의 규약[CSS2]에서 따르며, 값 정의 문법[CSS-VALUES-3]에서 사용합니다. 이 명세에 정의되지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과의 결합으로 이러한 값 타입의 정의가 확장될 수 있습니다.

각 속성 정의에 나열된 속성별 값 외에도, 이 명세에서 정의된 모든 속성은 CSS-wide 키워드도 속성 값으로 허용합니다. 가독성을 위해 별도로 반복하지 않았습니다.

2. 플렉스 레이아웃 박스 모델과 용어

플렉스 컨테이너는 요소가 displayflex 또는 inline-flex로 계산된 경우 생성되는 박스입니다. 플렉스 컨테이너의 플로우 내 자식은 플렉스 아이템이라 하며 플렉스 레이아웃 모델로 배치됩니다.

블록과 인라인 레이아웃은 블록 및 인라인 플로우 방향에 편향되어 레이아웃 계산이 이루어지지만, 플렉스 레이아웃은 플렉스 방향에 편향되어 있습니다. 플렉스 레이아웃을 설명하기 쉽게, 이 섹션에서는 플렉스 플로우 기준 용어를 정의합니다. flex-flow 값과 writing mode가 이러한 용어들이 물리적 방향(상/우/하/좌), 축(수직/수평), 크기(너비/높이)에 어떻게 매핑되는지를 결정합니다.

row 플렉스 컨테이너에 적용된 다양한 방향과 크기 용어의 예시입니다.
main axis
main dimension
플렉스 컨테이너의 메인 축플렉스 아이템이 배치되는 주 축입니다. 메인 차원을 따라 확장됩니다.
main-start
main-end
플렉스 아이템은 컨테이너 내에서 main-start 측에서 시작하여 main-end 측을 향해 배치됩니다.
main size
main size property
플렉스 컨테이너 또는 플렉스 아이템메인 크기너비 또는 높이메인 차원에 해당하는 값을 의미합니다. 메인 크기 속성width 또는 height 속성 중 메인 차원의 속성입니다. 최소최대 메인 크기 속성도 각각 min-width/max-width 또는 min-height/max-height 속성 중 메인 차원에 해당하는 속성이며, 최소/최대 메인 크기를 결정합니다.

플렉스 레이아웃에서는 메인 크기flex 속성에 의해 제어되며 메인 크기 속성에 의해 직접 제어되지 않습니다.

참고: 이는 플렉스 아이템의 메인 차원에서 사용 크기를 참조할 때 (width, height, inline size, block size)는 플렉싱 이후의 메인 크기를 의미합니다.

cross axis
cross dimension
메인 축과 수직인 축을 크로스 축이라 합니다. 크로스 차원을 따라 확장됩니다.
cross-start
cross-end
플렉스 줄은 아이템으로 채워져 컨테이너에 배치되며 플렉스 컨테이너의 cross-start 측에서 시작하여 cross-end 측을 향해 배치됩니다.
cross size
cross size property
플렉스 컨테이너 또는 플렉스 아이템크로스 크기너비 또는 높이크로스 차원에 해당하는 값을 의미합니다. 크로스 크기 속성width 또는 height 속성 중 크로스 차원에 해당하는 속성입니다. 최소최대 크로스 크기 속성도 각각 min-width/max-width 또는 min-height/max-height 속성 중 크로스 차원에 해당하는 속성이며, 최소/최대 크로스 크기를 결정합니다.

이 명세에서 사용하는 추가적인 크기 용어는 CSS 고유 및 외적 크기에서 정의됩니다. [CSS-SIZING-3]

테스트

3. 플렉스 컨테이너: flexinline-flex display

이름: display
새 값: flex | inline-flex
테스트
flex
이 값은 요소가 플렉스 컨테이너 박스를 생성하게 하며, 플로우 레이아웃에 배치될 때 블록 레벨이 됩니다.
테스트
inline-flex
이 값은 요소가 플렉스 컨테이너 박스를 생성하게 하며, 플로우 레이아웃에 배치될 때 인라인 레벨이 됩니다.
테스트

플렉스 컨테이너는 그 내용에 대해 새로운 플렉스 포매팅 컨텍스트를 생성합니다. 이는 블록 포매팅 컨텍스트를 생성하는 것과 동일하지만, 블록 레이아웃 대신 플렉스 레이아웃이 사용됩니다. 예를 들어, 플롯(float)이 플렉스 컨테이너 안으로 침범하지 않으며, 플렉스 컨테이너의 마진이 자식의 마진과 병합되지 않습니다. 플렉스 컨테이너블록 컨테이너와 정확히 동일하게 자식에 대한 포함 블록을 형성합니다. [CSS2] overflow 속성은 플렉스 컨테이너에 적용됩니다.

테스트

플렉스 컨테이너는 블록 컨테이너가 아니므로, 블록 레이아웃을 전제로 설계된 일부 속성들은 플렉스 레이아웃에서는 적용되지 않습니다. 특히:

테스트

요소의 지정된 displayinline-flex인 경우, display 속성은 특정 상황에서 flex로 계산됩니다: CSS 2.1 섹션 9.7의 표에는 "Specified Value" 열에 inline-flex, "Computed Value" 열에 flex가 추가된 행이 포함됩니다.

4. 플렉스 아이템

대략적으로, 플렉스 아이템플렉스 컨테이너의 플로우 내 컨텐츠를 나타내는 박스입니다.

플렉스 컨테이너의 플로우 내 자식 각각은 플렉스 아이템이 되며, 자식 텍스트 시퀀스익명 블록 컨테이너 플렉스 아이템으로 감싸집니다. 하지만 전체 텍스트 시퀀스문서 공백 문자만 포함한다면(즉, white-space 속성에 의해 영향을 받을 수 있는 문자), 해당 텍스트는 렌더링되지 않으며(텍스트 노드display:none인 것과 동일하게 처리됨)입니다.

테스트

플렉스 아이템 예시:

<div style="display:flex">

    <!-- 플렉스 아이템: 블록 자식 -->
    <div id="item1">block</div>

    <!-- 플렉스 아이템: float된 요소; float는 무시됨 -->
    <div id="item2" style="float: left;">float</div>

    <!-- 플렉스 아이템: 인라인 컨텐츠를 감싸는 익명 블록 박스 -->
    anonymous item 3

    <!-- 플렉스 아이템: 인라인 자식 -->
    <span>
        item 4
        <!-- 플렉스 아이템은 블록 기준으로 분할되지 않음 -->
        <q style="display: block" id=not-an-item>item 4</q>
        item 4
    </span>
</div>
위 코드 블록에서 결정된 플렉스 아이템
  1. block을 포함하는 플렉스 아이템.
  2. float를 포함하는 플렉스 아이템.
  3. (익명, 스타일 불가) anonymous item 3을 포함하는 플렉스 아이템.
  4. 세 개의 블록이 연속된 플렉스 아이템:
    • item 4를 포함하는 익명 블록.
    • <q> 요소 블록이 item 4를 포함.
    • item 4를 포함하는 익명 블록.

요소 사이의 공백은 사라집니다: 자체적으로 플렉스 아이템이 되지 않으며, 요소 사이의 텍스트가 익명 플렉스 아이템으로 감싸지더라도 마찬가지입니다.

또한 익명 아이템의 박스는 스타일을 지정할 수 없습니다. 해당 박스에 스타일 규칙을 지정할 요소가 없기 때문입니다. 하지만 그 내용은 플렉스 컨테이너로부터(예: 폰트 설정 등) 스타일을 상속받습니다.

플렉스 아이템은 그 내용에 대해 독립적인 포매팅 컨텍스트를 생성합니다. 하지만, 플렉스 아이템 자체는 플렉스 레벨 박스이며, 블록 레벨 박스가 아닙니다: 이들은 컨테이너의 플렉스 포매팅 컨텍스트에 참여하며, 블록 포매팅 컨텍스트에는 참여하지 않습니다.


참고: 이 명세를 읽는 저자는 아래 박스 생성 및 정적 위치 세부사항 부분을 건너뛰고 싶을 수 있습니다.

계산된 display 값이 요소의 가장 가까운 조상 요소( display:contents 조상은 건너뜀 )의 값이 flex 또는 inline-flex인 경우, 해당 요소의 display 값은 블록화(blockified)됩니다. (CSS2.1§9.7 [CSS2]CSS Display 3 § 2.7 자동 박스 타입 변환 참조) 이 display 값 변환에 대한 자세한 내용은 참고하세요.

참고: 플렉스 또는 flex 또는 inline-flex 요소가 실제로 플렉스 컨테이너 박스를 생성하지 않을 경우에도 블록화는 여전히 발생합니다. 예: 대체 요소이거나 display: none 서브트리에 포함될 때 등.

참고: display의 일부 값은 원래 박스를 익명 박스로 감싸도록 트리거합니다. 이러한 박스가 플렉스 아이템이라면, 먼저 블록화되므로 익명 박스 생성이 일어나지 않습니다. 예를 들어, 플렉스 아이템display: table-cell이면 두 개의 연속된 요소가 각각 display: block 플렉스 아이템이 되고, 하나의 익명 테이블로 감싸지지 않습니다.

display: table인 플렉스 아이템의 경우, 테이블 래퍼 박스가 플렉스 아이템이 되므로 align-self 속성이 적용됩니다. 캡션 박스의 내용은 테이블 래퍼 박스의 min-content와 max-content 크기 계산에 포함됩니다. 하지만 widthheight처럼, flex 롱핸드 속성도 테이블 박스에 다음과 같이 적용됩니다: 플렉스 아이템의 최종 크기는 테이블 래퍼 박스의 엣지와 테이블 박스의 컨텐츠 엣지 사이 거리가 모두 테이블 박스의 border+padding 영역으로 간주되고, 테이블 박스가 플렉스 아이템인 것처럼 레이아웃을 수행하여 계산됩니다.

테스트

4.1. 절대 위치 플렉스 자식

플로우 외에 있기 때문에, 플렉스 컨테이너의 절대 위치 자식은 플렉스 레이아웃에 참여하지 않습니다.

플렉스 컨테이너의 절대 위치 자식의 교차 축에서의 static-position 사각형의 엣지는 컨테이너의 컨텐츠 엣지가 됩니다. static-position 사각형메인 축 엣지는 해당 자식이 플렉스 컨테이너의 유일한 플렉스 아이템이라고 가정할 때 자식의 마진 엣지가 위치할 곳입니다. 이때 자식과 플렉스 컨테이너 모두 사용된 크기의 박스라고 가정합니다. (이 목적을 위해 자식의 auto 마진은 0으로 간주합니다.)

테스트
이 효과로 인해 예를 들어 align-self: center;플렉스 컨테이너의 절대 위치 자식에 설정하면, 해당 자식의 auto 오프셋이 플렉스 컨테이너교차 축에서 중앙에 배치됩니다.

4.2. 플렉스 아이템의 마진 및 패딩

인접한 플렉스 아이템의 마진은 병합되지 않습니다.

플렉스 아이템의 백분율 마진 및 패딩은, 블록 박스와 마찬가지로, 그 포함 블록의 인라인 크기를 기준으로 계산됩니다. 예를 들어, 좌/우/상/하 백분율 모두가 포함 블록너비를 기준으로 수평 쓰기 모드에서 계산됩니다.

auto 마진은 해당 차원의 여분의 공간을 흡수하도록 확장됩니다. 정렬에 사용할 수 있으며, 인접한 플렉스 아이템을 서로 밀어낼 수도 있습니다. auto 마진으로 정렬하기를 참고하세요.

테스트

4.3. 플렉스 아이템 Z-정렬

플렉스 아이템은 인라인 블록과 완전히 동일하게 페인팅됩니다 [CSS2], 단 order로 변경된 문서 순서가 원본 문서 순서 대신 사용되며, z-index 값이 auto가 아닌 경우, positionstatic이더라도 스태킹 컨텍스트를 생성합니다 (마치 positionrelative인 것처럼 동작합니다).

참고: 플렉스 아이템 바깥에 위치된 후손도 플렉스 아이템이 생성한 스태킹 컨텍스트에 계속 참여합니다.

테스트

4.4. 축소된 아이템

visibility:collapse를 플렉스 아이템에 지정하면, 해당 아이템은 축소된 플렉스 아이템이 되어, visibility:collapse가 테이블 행이나 테이블 열에 적용될 때와 유사한 효과를 냅니다: 축소된 플렉스 아이템은 렌더링에서 완전히 제거되지만, 플렉스 라인의 교차 크기를 안정적으로 유지하는 "스트럿"을 남깁니다. 따라서 플렉스 컨테이너에 플렉스 라인이 하나만 있을 경우, 아이템을 동적으로 축소하거나 축소 해제하면 플렉스 컨테이너메인 크기가 변경될 수 있지만, 교차 크기에는 영향을 주지 않으며 페이지 레이아웃이 "흔들리는" 현상이 발생하지 않습니다. 플렉스 라인 래핑은 축소 후에 다시 수행되므로, 여러 라인을 가진 플렉스 컨테이너의 교차 크기는 변할 수도 있고 변하지 않을 수도 있습니다.

축소된 플렉스 아이템은 렌더링되지 않더라도, 포매팅 구조에는 나타납니다. 따라서 display:none 아이템과 달리 [CSS2], 박스가 포매팅 구조에 나타나야 동작하는 효과(카운터 증가, 애니메이션 및 트랜지션 실행 등)는 축소된 아이템에도 계속 적용됩니다.

테스트
아래 예시에서는, 사이드바가 내용에 맞게 크기가 조정됩니다. visibility: collapse를 사용하여 네비게이션 사이드바의 일부를 동적으로 숨기면서도, 가장 넓은 항목("Architecture")이 숨겨진 섹션에 있더라도 너비에 영향을 주지 않습니다.
아래 예제 코드의 라이브 렌더링 샘플
왼쪽 메뉴에 마우스를 올려보세요: 각 섹션이 확장되어 하위 항목을 보여줍니다. 사이드바 너비(그리고 이 메인 영역의 너비)를 안정적으로 유지하기 위해 visibility: collapsedisplay: none 대신 사용합니다. 이로 인해 "건축"이라는 단어가 항상 들어갈 만큼의 너비를 가진 사이드바가 유지됩니다, 비록 해당 항목이 항상 보이지는 않아도 말이죠.
@media (min-width: 60em) {
  /* 충분한 공간이 있을 때만 두 열 레이아웃 (기본 텍스트 크기 기준) */
  div { display: flex; }
  #main {
    flex: 1;         /* Main은 남은 공간을 모두 차지함 */
    order: 1;        /* 네비게이션 오른쪽에 배치 */
    min-width: 12em; /* 메인 콘텐츠 영역 크기 최적화 */
  }
}
/* 메뉴 아이템에 flex 레이아웃 적용하여 visibility:collapse가 동작하도록 함 */
nav > ul > li {
  display: flex;
  flex-flow: column;
}
/* 타겟되지 않은 서브메뉴를 동적으로 축소 */
nav > ul > li:not(:target):not(:hover) > ul {
  visibility: collapse;
}
<div>
  <article id="main">
    읽을거리
  </article>
  <nav>
    <ul>
      <li id="nav-about"><a href="#nav-about">소개</a><li id="nav-projects"><a href="#nav-projects">프로젝트</a>
        <ul>
          <li><a href="…">예술</a>
          <li><a href="…">건축</a>
          <li><a href="…">음악</a>
        </ul>
      <li id="nav-interact"><a href="#nav-interact">소통</a></ul>
  </nav>
</div>
<footer>

스트럿의 크기를 계산하기 위해, 모든 아이템이 축소되지 않은 상태로 먼저 플렉스 레이아웃을 수행한 후, 각 축소된 플렉스 아이템을 해당 아이템의 원래 라인 교차 크기를 유지하는 스트럿으로 교체하여 다시 수행합니다. visibility:collapse가 플렉스 레이아웃과 어떻게 상호작용하는지에 대한 규범적 정의는 플렉스 레이아웃 알고리즘을 참고하세요.

참고: 플렉스 아이템에 visibility:collapse를 사용하면, 플렉스 레이아웃 알고리즘이 중간에 반복되어 가장 비용이 큰 단계가 다시 실행됩니다. 동적으로 아이템을 축소/복원하지 않을 경우에는 display:none을 사용하는 것이 레이아웃 엔진에 더 효율적이므로 권장합니다. (visibility가 변경될 때 일부 단계만 반복되므로, 동적 상황에서는 'visibility: collapse'를 사용하는 것이 여전히 권장됩니다.)

4.5. 플렉스 아이템의 자동 최소 크기

참고: auto 키워드, 자동 최소 크기를 나타내며, min-widthmin-height 속성의 새로운 초기값입니다. 이 키워드는 이전에는 이 명세에서 정의되었으나, 이제 CSS Sizing 모듈에서 정의됩니다.

보다 합리적인 기본 최소 크기플렉스 아이템에 제공하기 위해, 메인 축자동 최소 크기의 사용 값은 플렉스 아이템계산된 overflow 값이 스크롤 불가일 때 콘텐츠 기반 최소 크기가 됩니다; 스크롤 컨테이너의 경우 자동 최소 크기는 평소처럼 0입니다.

콘텐츠 기반 최소 크기플렉스 아이템대체 요소인지 아닌지에 따라 다릅니다:

대체 요소의 경우

콘텐츠 크기 제안이동된 크기 제안 중 더 작은 값을 사용하고(존재하는 경우), 지정된 크기 제안(존재하는 경우)로 상한을 둡니다.

비대체 요소의 경우

콘텐츠 크기 제안이동된 크기 제안(존재하는 경우) 중 더 큰 값을 사용하고, 지정된 크기 제안(존재하는 경우)로 상한을 둡니다.

두 경우 모두, 크기는 최대 메인 크기명확하다면 그 값으로 제한(clamp)됩니다.

테스트

이 계산에 사용되는 콘텐츠 크기 제안, 지정된 크기 제안, 이동된 크기 제안은 관련된 min/max/선호 크기 속성을 고려하여 콘텐츠 기반 최소 크기가 작성자가 제공한 제약조건을 침범하지 않도록 하며, 아래와 같이 정의됩니다:

지정된 크기 제안
아이템의 선호 메인 크기명확하고 자동이 아니라면, 지정된 크기 제안은 그 크기가 됩니다. 그렇지 않으면 정의되지 않습니다.
이동된 크기 제안
아이템에 선호하는 종횡비가 있고 선호 교차 크기명확하다면, 이동된 크기 제안은 그 크기( 최소최대 교차 크기명확하다면 그 값으로 제한됨 )을 종횡비로 변환한 값입니다. 그렇지 않으면 정의되지 않습니다.
콘텐츠 크기 제안
콘텐츠 크기 제안min-content 크기메인 축에서의 값이며, 선호하는 종횡비가 있다면 명확최소최대 교차 크기로 변환하여 제한됩니다.
테스트

참고: 콘텐츠 기반 최소 크기내재적 크기 기여의 한 종류이므로, CSS Sizing 3 § 5.2 내재적 기여의 순환 백분율 규정이 적용됩니다.

박스의 내재적 크기를 계산할 때(예: 박스의 min-content 크기), 콘텐츠 기반 최소 크기는 해당 축에서 박스 크기를 불확정(indefinite)하게 만듭니다 (예를 들어 width 속성이 확정된 크기를 지정하더라도). 즉, 이 크기를 기준으로 계산되는 백분율은 auto로 동작하게 됩니다.

내재적 크기 계산 이외의 목적에서는, 콘텐츠 기반 최소 크기는(명시적 min-content/등의 최소 크기와 달리) 박스의 크기를 불확정으로 만들지 않습니다. 다만, 이 최소 크기가 적용되기 이전 박스 크기를 기준으로 계산된 백분율이 있다면, 반드시 최소 크기 적용 후의 새로운 크기에 맞게 다시 계산되어야 합니다.

콘텐츠 기반 최소 크기가 적합한 경우가 많고, 컨테이너 밖으로 내용이 겹치거나 넘치는 것을 방지하는 데 도움이 되지만, 때때로 적합하지 않은 경우도 있다는 점에 주의하세요:

특히, 문서의 주요 콘텐츠 영역에 플렉스 크기를 사용하는 경우, min-width: 12em처럼 명시적인 폰트 상대 최소 너비를 지정하는 것이 더 좋습니다. 콘텐츠 기반 최소 너비는 큰 표나 이미지를 전체 콘텐츠 영역이 넘치도록 늘려, 텍스트 줄이 불필요하게 길어지고 읽기 어려워질 수 있습니다.

또한, 콘텐츠 기반 크기를 많은 콘텐츠가 있는 아이템에 사용하면, 레이아웃 엔진이 최소 크기를 찾기 전 모든 콘텐츠를 탐색해야 하지만, 작성자가 명시적으로 최소값을 지정하면 이 과정이 불필요합니다. (콘텐츠가 적은 아이템의 경우에는 이 탐색이 사소하므로 성능상 문제가 되지 않습니다.)

테스트

5. 정렬 및 방향

플렉스 컨테이너의 내용은 어떤 방향으로든, 어떤 순서로든 배치될 수 있습니다. 이를 통해 저자는 이전에는 복잡하거나 불안정한 방법이 필요했던 효과를 손쉽게 구현할 수 있습니다. 예를 들어 floatclear 속성을 사용하는 해킹 방식 등이 있습니다. 이러한 기능은 flex-direction, flex-wrap, 그리고 order 속성을 통해 제공됩니다.

참고: 플렉스 레이아웃의 순서 변경 기능은 오직 시각적 렌더링에만 의도적으로 적용되며, 음성 순서와 소스 순서를 기반으로 한 내비게이션에는 영향을 주지 않습니다. 저자는 시각적 표현을 조정하면서도, CSS를 지원하지 않는 UA나 음성 및 순차 탐색 같은 선형 모델을 위해 소스 순서를 그대로 유지할 수 있습니다. 접근성을 개선하기 위해 이러한 이분법을 활용하는 예시는 CSS Display 3 § 3.1 순서 변경과 접근성플렉스 레이아웃 개요에서 확인할 수 있습니다.

저자는 절대 order 또는 *-reverse 값의 flex-flow/flex-direction을 올바른 소스 순서의 대체로 사용해서는 안 됩니다. 이는 문서의 접근성을 저해할 수 있습니다.

5.1. 플렉스 흐름 방향: flex-direction 속성

이름: flex-direction
값: row | row-reverse | column | column-reverse
초기값: row
적용 대상: flex containers
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속

flex-direction 속성은 flex items가 플렉스 컨테이너에 어떻게 배치될지, 즉 플렉스 컨테이너의 main axis의 방향을 설정합니다. 이를 통해 플렉스 아이템이 배치되는 방향이 결정됩니다.

row
플렉스 컨테이너의 main axis는 현재 inline axis와 동일한 방향을 가집니다. main-startmain-end 방향은 각각 현재 inline-startinline-end 방향과 동일합니다. 이 모든 것은 현재 writing mode 기준입니다.
테스트
row-reverse
row와 동일하지만, main-startmain-end 방향이 서로 뒤바뀝니다.
테스트
column
플렉스 컨테이너의 main axis는 현재 block axis와 동일한 방향을 가집니다. main-startmain-end 방향은 각각 현재 block-startblock-end 방향과 동일합니다. 이 모든 것은 현재 writing mode 기준입니다.
테스트
column-reverse
column과 동일하지만, main-startmain-end 방향이 서로 뒤바뀝니다.
테스트

참고: reverse 값은 박스의 순서를 뒤집지 않습니다. writing-modedirection [CSS3-WRITING-MODES]와 같이, 흐름의 방향만 변경됩니다. 페인팅 순서, 음성 순서, 그리고 순차 탐색 순서는 영향을 받지 않습니다.

참고: justify-content의 값에 따라, flex-direction의 reverse 값이 flex containers이자 scroll containers의 초기 스크롤 위치에 영향을 줄 수 있습니다. 자세한 내용은 CSS Box Alignment 3 § 5.3 Alignment Overflow and Scroll Containers를 참고하세요.

테스트

5.2. 플렉스 줄 감싸기: flex-wrap 속성

이름: flex-wrap
값: nowrap | wrap | wrap-reverse
초기값: nowrap
적용 대상: flex containers
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속

flex-wrap 속성은 플렉스 컨테이너가 단일 줄인지, 다중 줄인지와 새로운 줄이 쌓이는 교차 축의 방향을 제어합니다.

nowrap
플렉스 컨테이너는 단일 줄입니다.
wrap
플렉스 컨테이너는 다중 줄입니다.
wrap-reverse
wrap과 동일합니다.

wrap-reverse가 아닌 값에서는, cross-start 방향은 현재 inline-start 또는 block-start 방향과 동일합니다 (둘 중 교차 축에 해당하는 방향), 그리고 cross-end 방향은 cross-start의 반대 방향입니다. flex-wrapwrap-reverse일 때는 cross-startcross-end 방향이 서로 뒤바뀝니다.

참고: align-content의 값에 따라, wrap-reverse 값의 flex-wrapflex containers이자 scroll containers의 초기 스크롤 위치에 영향을 줄 수 있습니다. 자세한 내용은 CSS Box Alignment 3 § 5.3 Alignment Overflow and Scroll Containers를 참고하세요.

테스트

5.3. 플렉스 방향 및 감싸기: flex-flow 단축 속성

이름: flex-flow
값: <'flex-direction'> || <'flex-wrap'>
초기값: 각 개별 속성 참고
적용 대상: 각 개별 속성 참고
상속 여부: 각 개별 속성 참고
백분율: 각 개별 속성 참고
계산된 값: 각 개별 속성 참고
애니메이션 타입: 각 개별 속성 참고
정규 순서: 문법에 따름
테스트

flex-flow 속성은 flex-directionflex-wrap 속성을 한 번에 설정하는 단축 속성으로, 이 두 속성은 플렉스 컨테이너의 메인 축과 교차 축을 함께 정의합니다.

영어(좌→우, 수평 쓰기 모드) 문서에서 유효한 플로우 예시:
div { flex-flow: row; }
/* 초기값. 메인 축이 인라인 방향, 줄 바꿈 없음.
   (아이템은 줄어들거나 넘칠 수 있음) */
div { flex-flow: column wrap; }
/* 메인 축이 블록 방향(위에서 아래로)
   줄은 인라인 방향(오른쪽)으로 감쌈. */
div { flex-flow: row-reverse wrap-reverse; }
/* 메인 축이 인라인 방향의 반대(오른쪽에서 왼쪽).
   새 줄은 위쪽으로 감쌈. */
참고: flex-flow 방향은 writing mode에 따라 달라집니다. 예를 들어, 일본어 세로쓰기에서는 row 플렉스 컨테이너가 위에서 아래로 내용을 배치합니다. 아래 예시를 참고하세요:
영어 일본어
flex-flow: row wrap;        
writing-mode: horizontal-tb;
flex-flow: row wrap;        
writing-mode: vertical-rl;

5.4. 순서 변경 및 접근성: order 속성

플렉스 아이템은 기본적으로 소스 문서에 나타난 순서대로 표시되고 배치되며, 이는 논리적 순서를 나타냅니다. 이 순서는 비시각적 미디어(예: 음성), 순차 탐색 모드의 기본 순서(예: 링크 순환, tabindex [HTML] 참고), 그리고 CSS를 지원하지 않는 UA에서 컨텐츠가 표현될 때도 그대로 사용됩니다.

order 속성을 사용하면 플렉스 아이템의 순서를 변경할 수 있습니다. 이를 통해 수정된 문서 순서대로 배치하게 할 수 있으며, 2D 시각적 캔버스에서의 공간 배치가 음성이나 순차 탐색 등 선형 표현에서의 논리적 순서와 다르게 할 수 있습니다. 자세한 내용은 CSS Display 3 § 3 Display Order: the order property[CSS-DISPLAY-3]를 참고하세요.

참고: 시각적 인식은 2차원 비선형이기 때문에, 원하는 박스 순서가 비시각적 미디어나 CSS를 지원하지 않는 UA에서 사용되는 논리적 순서와 항상 일치하지는 않습니다.

저자는 반드시 order를 논리적 순서가 아니라 시각적 순서 변경에만 사용해야 합니다. order를 논리적 순서 변경에 사용하는 스타일 시트는 비준수입니다.

많은 웹 페이지는 마크업 구조가 비슷하며, 상단에 헤더, 하단에 푸터, 중앙에 콘텐츠 영역과 하나 또는 두 개의 추가 컬럼이 있습니다. 일반적으로 콘텐츠가 페이지 소스 코드에서 추가 컬럼보다 먼저 오는 것이 바람직합니다. 하지만 이러한 구조는, 예를 들어 추가 컬럼을 왼쪽에, 콘텐츠 영역을 오른쪽에 두고 싶은 경우, 구현이 어려울 수 있습니다. 이런 문제는 오랜 기간 다양한 방식으로 해결되어 왔으며, 두 개의 추가 컬럼이 있을 때 "Holy Grail Layout"이라는 이름으로 불리곤 했습니다. order를 사용하면 아주 간단하게 해결할 수 있습니다. 아래는 페이지 코드와 원하는 레이아웃의 예시입니다:
<!DOCTYPE html>
<header>...</header>
<main>
   <article>...</article>
   <nav>...</nav>
   <aside>...</aside>
</main>
<footer>...</footer>
이 페이지에서 헤더는 상단, 푸터는 하단에 위치하지만, 아티클은 중앙에 있고 nav는 오른쪽, aside는 왼쪽에 배치됩니다.

이 레이아웃은 플렉스 레이아웃으로 손쉽게 구현할 수 있습니다:

main { display: flex; }
main > article { order: 2; min-width: 12em; flex:1; }
main > nav     { order: 1; width: 200px; }
main > aside   { order: 3; width: 200px; }

추가로, 컬럼들은 기본적으로 동일 높이로 맞춰지며, 메인 콘텐츠는 화면을 채우는 만큼의 너비를 가지게 됩니다. 또한, 미디어 쿼리를 활용해 화면이 좁을 때 전체를 세로 레이아웃으로 바꿀 수도 있습니다:

@media all and (max-width: 600px) {
  /* 세 컬럼을 지원하기엔 너무 좁음 */
  main { flex-flow: column; }
  main > article, main > nav, main > aside {
    /* 문서 순서로 복귀 */
    order: 0; width: auto;
  }
}

(다중 줄 플렉스 컨테이너를 더 활용해 보다 지능적인 감싸기를 구현하는 것은 독자에게 남깁니다.)

6. 플렉스 줄(Flex Lines)

플렉스 아이템플렉스 컨테이너 내에서 플렉스 줄에 따라 배치되고 정렬됩니다. 이는 레이아웃 알고리즘에서 그룹화와 정렬을 위해 사용하는 가상의 컨테이너입니다. 플렉스 컨테이너는 단일 줄이거나 다중 줄일 수 있으며, 이는 flex-wrap 속성에 따라 결정됩니다:

이 예시는 네 개의 버튼이 수평으로 한 줄에 다 들어가지 않아, 여러 줄로 자동 감싸지는 모습을 보여줍니다.
#flex {
  display: flex;
  flex-flow: row wrap;
  width: 300px;
}
.item {
  width: 80px;
}
<div id="flex">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
</div>

컨테이너의 너비가 300px이므로, 아이템 세 개만 한 줄에 들어갑니다. 세 아이템이 240px을 차지하고, 60px의 공간이 남습니다. flex-flow 속성에 다중 줄 플렉스 컨테이너를 지정했으므로 (wrap 키워드 사용), 플렉스 컨테이너는 마지막 아이템을 담을 추가 줄을 생성합니다.

다중 줄 플렉스 컨테이너의 렌더링 예시.

내용이 줄로 나누어지면, 각 줄은 독립적으로 레이아웃됩니다. 유연한 길이와 justify-content, align-self 속성은 한 번에 한 줄의 아이템만 고려합니다.

다중 줄 플렉스 컨테이너(줄이 하나뿐이어도)는 각 줄의 교차 크기가 해당 줄의 플렉스 아이템을 담기에 필요한 최소 크기가 됩니다 (align-self에 의해 정렬된 후). 줄들은 align-content 속성으로 플렉스 컨테이너 내에서 정렬됩니다. 단일 줄 플렉스 컨테이너에서는 줄의 교차 크기가 플렉스 컨테이너의 교차 크기와 같고, align-content는 영향을 주지 않습니다. 줄의 메인 크기는 항상 플렉스 컨테이너의 콘텐츠 박스 메인 크기와 동일합니다.

테스트
이전과 동일한 예시지만, 플렉스 아이템에 모두 flex: auto가 적용되었습니다. 첫 번째 줄에는 60px의 남는 공간이 있고, 모든 아이템이 동일한 유연성을 가지므로 한 줄에 있는 세 아이템 각각이 20px씩 추가 너비를 받아 각 아이템의 최종 너비가 100px이 됩니다. 남은 아이템 하나는 자신만의 줄에 위치하며 해당 줄의 전체 너비, 즉 300px로 늘어납니다.
위와 동일한 렌더링이지만, 아이템 모두에 flex: auto가 적용되었습니다.

7. 유연성(Flexibility)

플렉스 레이아웃의 핵심은 플렉스 아이템을 "flex"하게 만들어, main dimension에서 사용 가능한 공간을 채우도록 너비/높이를 조정하는 기능입니다. 이는 flex 속성으로 구현됩니다. 플렉스 컨테이너는 남는 공간을 아이템에 분배할 때(각 아이템의 flex grow factor에 비례) 컨테이너를 채우고, 또는 넘침을 방지하기 위해(각 아이템의 flex shrink factor에 비례) 아이템 크기를 줄입니다.

플렉스 아이템완전히 유연하지 않음 상태일 때, flex-growflex-shrink 값이 모두 0이면 그렇고, 그렇지 않으면 유연함입니다.

테스트

7.1. flex 단축 속성

이름: flex
값: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
초기값: 0 1 auto
적용 대상: flex items
상속 여부: no
백분율: 각 개별 속성 참고
계산된 값: 각 개별 속성 참고
애니메이션 타입: 계산된 값 타입에 따라 다름
정규 순서: 문법에 따름
테스트

flex 속성은 유연한 크기를 구성하는 요소들을 지정합니다: flex 계수 (성장축소) 그리고 flex 기준값입니다. 박스가 플렉스 아이템일 때, flex메인 크기 속성 대신 박스의 메인 크기를 결정하는 데 사용됩니다. 박스가 플렉스 아이템이 아니면 flex는 아무런 영향을 주지 않습니다.

참고: flex 롱핸드의 초기값은 flex: 0 1 auto와 동일합니다. 이는 flex 단축 속성에서 생략했을 때의 기본값(실질적으로 1 1 0px)과 다르며, flex 단축 속성이 가장 일반적인 경우를 더 잘 처리할 수 있도록 설계된 것입니다.

<'flex-grow'>
<number [0,∞]> 요소는 flex-grow 롱핸드를 설정하며, flex 성장 계수를 지정합니다. 이는 플렉스 아이템이 flex 컨테이너 내에서 다른 플렉스 아이템에 비해 양의 여유 공간이 분배될 때 얼마나 성장할지 결정합니다. 생략 시 1로 설정됩니다.
테스트
0과 1 사이의 flex 값은 다소 특별한 동작을 합니다: 한 줄의 flex 값 합이 1 미만이면, 남는 공간의 100%보다 적은 공간만 차지하게 됩니다.

아이템의 flex-grow 값은 실질적으로 남는 공간의 비율을 요청하는 것이며, 1은 "남는 공간의 100%"를 의미합니다; 한 줄의 아이템들이 총합 100% 이상을 요청하면, 요청값의 비율은 유지하되 정확히 100%만 사용하도록 재조정됩니다. 그러나 아이템들이 전체 공간보다 적게 요청하는 경우 (예: 세 아이템 각각 flex-grow: .25), 각 아이템은 요청한 대로(각각 남는 공간의 25%)만 차지하고, 나머지 25%는 비어 있게 됩니다. 남는 공간이 어떻게 분배되는지에 대한 자세한 내용은 § 9.7 유연한 길이 해결을 참고하세요.

이 패턴은 flex-grow 값이 0에 가까워질 때(즉, 아이템이 남는 공간을 전혀 원하지 않는 경우) 연속적인 동작을 위해 필요합니다. 만약 이 동작이 없다면, flex-grow: 1 아이템도 모든 남는 공간을 차지하고, flex-grow: 0.1 아이템도, flex-grow: 0.01 아이템도 마찬가지로 남는 공간을 모두 차지하다가, 값이 충분히 작아져서 0이 되면 갑자기 남는 공간을 전혀 차지하지 않게 됩니다. 이러한 동작에서는 flex-grow 값이 1 이하로 줄어들수록 아이템이 남는 공간을 점점 덜 차지하며, 값이 0일 때는 매끄럽게 남는 공간을 아예 차지하지 않게 됩니다.

이러한 "부분 채움" 동작이 특별히 필요한 경우가 아니라면, 저자는 값 ≥ 1을 사용하는 것이 좋습니다; 예를 들어 12를 사용하는 것이 .33.67을 사용하는 것보다 아이템이 추가, 삭제되거나 줄 바꿈이 발생할 때 의도대로 동작할 가능성이 높습니다.

<'flex-shrink'>
<number [0,∞]> 요소는 flex-shrink 롱핸드를 설정하며, flex 축소 계수를 지정합니다. 이는 플렉스 아이템이 flex 컨테이너 내에서 다른 플렉스 아이템에 비해 음의 여유 공간이 분배될 때 얼마나 축소될지 결정합니다. 생략 시 1로 설정됩니다.
테스트

참고: flex shrink factor는 음수 공간을 분배할 때 flex base size와 곱해집니다. 이는 각 아이템이 얼마나 줄어들 수 있는지에 비례하여 음수 공간을 분배하므로, 예를 들어 작은 아이템이 큰 아이템이 눈에 띄게 줄어들기 전에 0이 되지 않도록 합니다.

테스트
<'flex-basis'>
이 구성 요소는 flex-basis 롱핸드를 설정하며, flex 기준값을 지정합니다: 메인 크기의 초기값을 플렉스 아이템에 대해 지정하며, flex 계수에 따라 남는 공간이 분배되기 전의 크기입니다.
테스트

<'flex-basis'>widthheight 속성과 동일한 값을 허용합니다 (auto는 다르게 처리됨) 그리고 content 키워드도 허용됩니다:

auto
플렉스 아이템에 지정되면, auto 키워드는 메인 크기 속성의 값을 실제 flex-basis로 가져옵니다. 그 값 자체가 auto라면, 실제 값은 content가 됩니다.
content
컨텐츠 기반 자동 크기를 의미하며, 플렉스 아이템의 컨텐츠를 기준으로 합니다. (일반적으로 max-content 크기와 동일하지만, 선호 비율, 고유 크기 제약, 교차 흐름 등을 보정합니다; 자세한 내용§ 9 Flex Layout Algorithm을 참고하세요.)

참고: 이 값은 Flexible Box Layout 초판에는 없었으며, 때문에 일부 오래된 구현에서는 지원되지 않을 수 있습니다. 같은 효과는 auto와 메인 크기(width 또는 height)를 auto로 지정하면 얻을 수 있습니다.

<'width'>
그 외 값들은 flex-basiswidthheight와 동일하게 해석됩니다.

flex 단축 속성에서 생략된 경우, 지정값은 0입니다.

none
none 키워드는 0 0 auto로 확장됩니다.
"절대" flex(기준값이 0에서 시작)와 "상대" flex(아이템의 컨텐츠 크기에서 시작)의 차이를 보여주는 다이어그램입니다. 세 아이템의 flex 계수는 각각 1, 1, 2입니다: flex 계수가 2인 아이템이 다른 것보다 두 배 더 빨리 커지는 것을 볼 수 있습니다.

단위 없는 0이 앞에 flex 계수 두 개가 오지 않았을 때는 flex 계수로 해석해야 합니다. 잘못 해석하거나 잘못된 선언을 방지하려면, 저자는 <'flex-basis'> 구성 요소의 0 값을 단위와 함께 지정하거나, 앞에 flex 계수 두 개를 명시해야 합니다.

7.1.1. flex의 기본 값

이 절은 참고용입니다.

아래 목록은 가장 일반적으로 원하는 효과를 나타내는 네 가지 flex 값의 동작을 요약합니다:

flex: initial
flex: 0 1 auto와 동일합니다. (초기값) width/height 속성을 기준으로 아이템 크기를 지정합니다. (아이템의 메인 크기 속성auto로 계산되면, 컨텐츠 기반으로 크기가 결정됩니다.) 양의 남는 공간이 있을 때는 아이템을 유연하지 않게 하고, 공간이 부족할 때는 최소 크기까지 줄어들 수 있습니다. 정렬 기능이나 auto 마진을 활용해 메인 축에서 flex 아이템을 정렬할 수 있습니다.
flex: auto
flex: 1 1 auto와 동일합니다. width/height 속성을 기반으로 크기를 지정하지만, 완전히 유연하게 만들어 메인 축에서 남는 공간을 모두 흡수하게 합니다. 모든 아이템이 flex: auto, flex: initial, flex: none 중 하나라면, 아이템 크기 지정 후 남는 공간은 flex: auto가 적용된 아이템에 균등하게 분배됩니다.
flex: none
flex: 0 0 auto와 동일합니다. width/height 속성에 따라 아이템 크기가 결정되며, flex 아이템을 완전히 유연하지 않게 만듭니다. initial과 유사하지만, flex 아이템은 공간이 넘쳐도 축소가 허용되지 않습니다.
flex: <number [1,∞]>
flex: <number [1,∞]> 1 0과 동일합니다. flex 아이템을 유연하게 만들고 flex 기준값을 0으로 설정하여, flex 컨테이너의 남는 공간을 지정한 비율만큼 받게 만듭니다. 컨테이너 내의 모든 아이템이 이 패턴을 사용하면, 크기가 지정된 flex 계수에 비례하게 됩니다.
테스트

기본적으로 플렉스 아이템은 최소 컨텐츠 크기(가장 긴 단어 또는 고정 크기 요소의 길이)보다 작아지지 않습니다. 이를 변경하려면 min-width 또는 min-height 속성을 설정하세요. (§ 4.5 플렉스 아이템의 자동 최소 크기 참고)

7.2. 유연성의 구성 요소

유연성의 개별 구성 요소는 독립적인 롱핸드 속성으로 제어할 수 있습니다.

저자는 flex 단축 속성을 사용하여 유연성을 제어하는 것을 권장합니다. 단축 속성은 지정되지 않은 구성 요소를 올바르게 초기화해 일반적인 사용 사례에 적합하게 동작하기 때문입니다.

7.2.1. flex-grow 속성

이름: flex-grow
값: <number [0,∞]>
초기값: 0
적용 대상: flex items
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 숫자
정규 순서: 문법에 따름
애니메이션 타입: 계산된 값 타입에 따름
테스트

저자는 flex 단축 속성을 사용해 유연성을 제어하는 것이 권장됩니다. flex-grow 속성을 직접 사용하는 것보다, 단축 속성이 지정되지 않은 구성 요소를 올바르게 초기화하여 일반적인 사용 사례에 적합하게 동작하기 때문입니다.

flex-grow 속성은 flex 성장 계수를 제공된 <number> 값으로 설정합니다. 음수 값은 허용되지 않습니다.

7.2.2. flex-shrink 속성

이름: flex-shrink
값: <number [0,∞]>
초기값: 1
적용 대상: flex items
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 값
정규 순서: 문법에 따름
애니메이션 타입: number
테스트

저자는 flex 단축 속성을 사용하여 유연성을 제어하는 것이 권장되며, flex-shrink 속성을 직접 사용하는 것보다, 단축 속성이 지정되지 않은 구성 요소를 올바르게 초기화해 일반적인 사용 사례에 적합하게 동작하기 때문입니다.

flex-shrink 속성은 flex 축소 계수<number> 값으로 설정합니다. 음수 값은 허용되지 않습니다.

7.2.3. flex-basis 속성

이름: flex-basis
값: content | <'width'>
초기값: auto
적용 대상: flex items
상속 여부: no
백분율: flex container의 내부 main size 기준
계산된 값: 지정된 키워드 또는 계산된 <length-percentage>
정규 순서: 문법에 따름
애니메이션 타입: 계산된 값 타입에 따름
테스트

저자는 flex 단축 속성을 사용해 유연성을 제어하는 것을 권장합니다. flex-basis 속성을 직접 사용하기보다는, 단축 속성이 지정되지 않은 구성 요소를 올바르게 초기화해 일반적인 사용 사례에 적합하게 동작하기 때문입니다.

flex-basis 속성은 flex 기준값을 설정합니다. 이 속성은 widthheight 속성과 동일한 값, 그리고 content도 허용합니다.

autocontent를 제외한 모든 값에 대해(위에서 정의됨), flex-basis는 수평 쓰기 모드에서 width와 동일하게 해석됩니다 [CSS2]. 단, 해당 값이 width에서 auto로 계산되는 경우, flex-basis에서는 content로 계산됩니다. 예를 들어, flex-basis의 백분율 값은 플렉스 아이템의 포함 블록(즉, flex container)을 기준으로 계산됩니다; 만약 그 포함 블록의 크기가 명확하지 않은 경우, flex-basis에 사용되는 값은 content입니다. 또 다른 예로, flex-basis는 별도로 지정되지 않는 한 컨텐츠 박스의 크기를 결정합니다. 예외는 box-sizing처럼 따로 지정한 경우입니다 [CSS3UI].

8. 정렬(Alignment)

플렉스 컨테이너의 내용이 flex 동작을 모두 마치고 플렉스 아이템의 크기가 확정된 후, 그 아이템들은 플렉스 컨테이너 내에서 정렬할 수 있습니다.

margin 속성을 사용해 블록 레이아웃에서 마진이 할 수 있는 것보다 더 강력하고 다양한 방식으로 아이템을 정렬할 수 있습니다. 플렉스 아이템은 또한 CSS Box Alignment의 정렬 속성도 지원합니다. 이를 통해 메인 축교차 축 모두에서 키워드 기반으로 쉽게 정렬할 수 있습니다. 이러한 속성들은 수평 및 수직 중앙 정렬처럼 CSS 2.1에서 매우 어려웠던 정렬도 쉽게 구현할 수 있습니다.

참고: 정렬 속성들은 CSS Box Alignment [CSS-ALIGN-3]에서 정의되어 있지만, Flexible Box Layout에서는 관련 정의를 다시 한번 명시하여 명세의 진척을 늦추는 규범적 의존성을 만들지 않기 위함입니다. 이러한 속성들은 CSS Box Alignment Level 3가 완성될 때까지 플렉스 레이아웃에만 적용됩니다. Box Alignment 모듈에서 새로 정의된 값은 Flexible Box Layout에도 적용되며, 즉, Box Alignment 모듈이 완성되면 이곳의 정의를 대체하게 됩니다.

테스트

8.1. auto 마진으로 정렬하기

이 절은 규범적이지 않습니다. 마진이 플렉스 아이템에 어떻게 영향을 주는지에 대한 규범적 정의는 Flex Layout Algorithm 절에 있습니다.

플렉스 아이템의 auto 마진은 블록 플로우에서의 auto 마진과 매우 유사한 효과를 냅니다:

테스트

참고: 남는 공간이 auto 마진에 분배되면, 정렬 속성은 해당 방향에서 효과가 없습니다. 왜냐하면 마진이 flexing 후 남은 모든 공간을 가져가기 때문입니다.

메인 축에서 auto 마진의 한 가지 용도는 플렉스 아이템을 서로 다른 "그룹"으로 분리하는 것입니다. 아래 예시는 흔히 볼 수 있는 UI 패턴을 재현하는 방법을 보여줍니다 - 한 줄의 액션 버튼 일부는 왼쪽 정렬, 나머지는 오른쪽 정렬되는 경우입니다.
아래 코드의 렌더링 예시.
nav > ul {
  display: flex;
}
nav > ul > #login {
  margin-left: auto;
}
<nav>
  <ul>
    <li><a href=/about>소개</a>
    <li><a href=/projects>프로젝트</a>
    <li><a href=/interact>상호작용</a>
    <li id="login"><a href=/login>로그인</a>
  </ul>
</nav>
아래 그림은 오버플로우 상황에서 auto 마진정렬 속성을 사용할 때 교차 축 정렬의 차이를 보여줍니다.
소개
권위주의
블로그
소개
권위주의
블로그
왼쪽 그림의 아이템은 마진으로 중앙 정렬되고, 오른쪽 그림의 아이템은 align-self로 중앙 정렬되었습니다. 이 column 플렉스 컨테이너가 페이지 왼쪽 끝에 배치된다면, 마진 동작이 더 바람직할 수 있습니다. 긴 아이템이 완전히 읽을 수 있기 때문입니다. 다른 상황에서는 진짜 중앙 정렬 동작이 더 나을 수 있습니다.

8.2. 축 정렬: justify-content 속성

이름: justify-content
값: flex-start | flex-end | center | space-between | space-around
초기값: flex-start
적용 대상: flex containers
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속
테스트

justify-content 속성은 플렉스 컨테이너의 현재 줄에서 플렉스 아이템메인 축을 따라 정렬합니다. 이 동작은 모든 유연한 길이와 auto 마진이 해결된 이후에 수행됩니다. 일반적으로 한 줄의 모든 플렉스 아이템이 유연하지 않거나, 유연하지만 최대 크기에 도달한 경우 남는 여분의 공간을 분배하는 데 도움이 됩니다. 또한, 줄이 오버플로우될 때 아이템 정렬에 어느 정도 제어력을 제공합니다.

flex-start
플렉스 아이템들이 줄의 시작 부분에 몰립니다. 줄의 첫 번째 플렉스 아이템main-start 마진 엣지가 줄의 main-start 엣지와 맞닿도록 배치되며, 이후 아이템들은 앞선 아이템과 맞닿도록 순서대로 배치됩니다.
테스트
flex-end
플렉스 아이템들이 줄의 끝 부분에 몰립니다. 줄의 마지막 플렉스 아이템main-end 마진 엣지가 줄의 main-end 엣지와 맞닿도록 배치되며, 이전 아이템들은 그 다음 아이템과 맞닿도록 순서대로 배치됩니다.
테스트
center
플렉스 아이템들이 줄의 중앙에 몰립니다. 줄의 플렉스 아이템들은 서로 맞닿아 배치되고, 줄의 중앙에 맞춰 정렬됩니다. 줄의 main-start 엣지와 첫 아이템 사이, 줄의 main-end 엣지와 마지막 아이템 사이의 공간이 동일합니다. (만약 남은 공간이 음수라면, 플렉스 아이템들은 양쪽으로 동일하게 넘쳐 배치됩니다.)
테스트
space-between
플렉스 아이템들이 줄 전체에 고르게 분배됩니다. 남는 공간이 음수이거나, 줄에 플렉스 아이템이 하나뿐인 경우, 이 값은 safe flex-start로 대체됩니다. 그 외에는, 줄의 첫 번째 플렉스 아이템main-start 마진 엣지가 줄의 main-start 엣지와 맞닿고, 줄의 마지막 플렉스 아이템main-end 마진 엣지가 줄의 main-end 엣지와 맞닿으며, 나머지 플렉스 아이템들은 서로 인접한 아이템 사이의 간격이 모두 동일하도록 배치됩니다.
테스트
space-around
플렉스 아이템들이 줄 전체에 고르게 분배되며, 양 끝에는 절반 크기의 공간이 들어갑니다. 남는 공간이 음수이거나, 줄에 플렉스 아이템이 하나뿐인 경우, 이 값은 safe center로 대체됩니다. 그 외에는, 줄의 플렉스 아이템들이 인접한 플렉스 아이템 사이의 간격이 모두 동일하도록 분배되고, 첫/마지막 플렉스 아이템플렉스 컨테이너의 엣지 사이의 간격은 아이템 사이 간격의 절반 크기입니다.
테스트

세 가지 색상 아이템으로 구성된 플렉스 컨테이너에서 justify-content의 다섯 키워드와 그 효과를 보여주는 그림입니다.

8.3. 교차 축 정렬: align-items, align-self 속성

이름: align-items
값: flex-start | flex-end | center | baseline | stretch
초기값: stretch
적용 대상: flex containers
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속
테스트
이름: align-self
값: auto | flex-start | flex-end | center | baseline | stretch
초기값: auto
적용 대상: flex items
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속
테스트

플렉스 아이템은 플렉스 컨테이너의 현재 줄에서 교차 축을 따라 정렬될 수 있으며, 이는 justify-content와 비슷하지만 수직(직각) 방향입니다. align-items는 해당 플렉스 컨테이너의 모든 아이템의 기본 정렬을 지정하며, 익명 플렉스 아이템도 포함합니다. align-self는 개별 플렉스 아이템의 정렬을 덮어써서 변경할 수 있습니다. (익명 플렉스 아이템의 경우 align-self 값이 항상 해당 컨테이너의 align-items 값을 따릅니다.)

만약 플렉스 아이템의 교차 축 마진 둘 중 하나라도 auto이면, align-self는 효과가 없습니다.

값의 의미는 다음과 같습니다:

auto
교차 축 정렬 제어를 부모 박스의 align-items 값에 위임합니다. (이 값이 align-self의 초기값입니다.)
테스트
flex-start
플렉스 아이템cross-start 마진 엣지가 줄의 cross-start 엣지와 맞닿게 배치됩니다.
테스트
flex-end
플렉스 아이템cross-end 마진 엣지가 줄의 cross-end 엣지와 맞닿게 배치됩니다.
테스트
center
플렉스 아이템의 마진 박스가 줄의 교차 축 중앙에 배치됩니다. (만약 플렉스 줄의 교차 크기플렉스 아이템보다 작으면, 양쪽으로 똑같이 넘쳐 배치됩니다.)
테스트
baseline
플렉스 아이템베이스라인 정렬에 참여합니다: 줄에 참여하는 모든 플렉스 아이템의 베이스라인이 맞춰 정렬되고, 베이스라인과 cross-start 마진 엣지 사이 거리가 가장 큰 아이템이 줄의 cross-start 엣지와 맞닿게 배치됩니다. 만약 아이템이 필요한 축에 베이스라인이 없으면, 테두리 박스에서 베이스라인을 생성합니다.
테스트
stretch
플렉스 아이템교차 크기 속성auto로 계산되고, 교차 축 마진 둘 다 auto가 아니면, 플렉스 아이템늘어남 상태가 됩니다. 이때 사용되는 값은 아이템의 마진 박스 교차 크기가 줄 크기와 최대한 가까워지도록 하는 길이이며, min-height/min-width/max-height/max-width의 제약도 모두 적용됩니다.

참고: 플렉스 컨테이너의 높이가 제한된 경우 이 값 때문에 플렉스 아이템의 내용이 넘칠 수 있습니다.

플렉스 아이템cross-start 마진 엣지가 줄의 cross-start 엣지와 맞닿게 배치됩니다.

테스트

네 가지 색상 아이템이 있는 플렉스 컨테이너에서 align-items의 다섯 키워드와 효과를 보여주는 그림입니다.

8.4. 플렉스 줄 패킹: align-content 속성

이름: align-content
값: flex-start | flex-end | center | space-between | space-around | stretch
초기값: stretch
적용 대상: multi-line flex containers
상속 여부: no
백분율: 해당 없음
계산된 값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속

align-content 속성은 플렉스 컨테이너에 남는 교차 축 공간이 있을 때 플렉스 컨테이너 내의 줄들을 정렬합니다. 이는 justify-content가 메인 축에서 개별 아이템을 정렬하는 것과 유사합니다. 참고: 이 속성은 단일 줄 플렉스 컨테이너에서는 효과가 없습니다. 각 값의 의미는 다음과 같습니다:

flex-start
줄들이 플렉스 컨테이너의 시작 부분에 몰립니다. 플렉스 컨테이너에서 첫 번째 줄의 cross-start 엣지가 플렉스 컨테이너의 cross-start 엣지와 맞닿게 배치되고, 이후 줄들은 앞선 줄과 맞닿게 배치됩니다.
flex-end
줄들이 플렉스 컨테이너의 끝 부분에 몰립니다. 마지막 줄의 cross-end 엣지가 플렉스 컨테이너의 cross-end 엣지와 맞닿게 배치되고, 이전 줄들은 그 다음 줄과 맞닿게 배치됩니다.
center
줄들이 플렉스 컨테이너의 중앙에 몰립니다. 플렉스 컨테이너 내의 줄들은 서로 맞닿아 배치되고 중앙에 정렬되며, 플렉스 컨테이너의 cross-start 내용 엣지와 첫 번째 줄 사이, cross-end 내용 엣지와 마지막 줄 사이의 공간이 동일합니다. (남는 공간이 음수면, 줄들이 양쪽으로 똑같이 넘쳐 배치됩니다.)
space-between
줄들이 플렉스 컨테이너 내에 고르게 분배됩니다. 남는 공간이 음수이거나 플렉스 컨테이너에 플렉스 줄이 하나뿐이면, 이 값은 safe flex-start로 대체됩니다. 그 외에는, 첫 번째 줄의 cross-start 엣지가 플렉스 컨테이너의 cross-start 내용 엣지와 맞닿고, 마지막 줄의 cross-end 엣지가 플렉스 컨테이너의 cross-end 내용 엣지와 맞닿으며, 나머지 줄들은 인접한 줄 사이의 간격이 모두 동일하도록 분배됩니다.
space-around
줄들이 플렉스 컨테이너 내에 고르게 분배되며, 양 끝에는 절반 크기의 공간이 들어갑니다. 남는 공간이 음수면 safe center로 대체됩니다. 그 외에는, 플렉스 컨테이너 내의 줄들이 인접한 줄 사이의 간격이 모두 동일하도록 분배되고, 첫/마지막 줄과 플렉스 컨테이너 엣지 사이의 간격은 플렉스 줄 사이 간격의 절반입니다.
stretch
줄들이 남은 공간을 모두 채우도록 늘어납니다. 남는 공간이 음수면, 이 값은 flex-start로 대체됩니다. 그 외에는, 남는 공간이 모든 줄에 균등하게 분배되어 줄의 교차 크기가 증가합니다.

참고: 다중 줄 플렉스 컨테이너만이 줄이 교차 축에서 정렬될 수 있는 남는 공간을 갖습니다. 단일 줄 플렉스 컨테이너에서는 유일한 줄이 공간을 자동으로 모두 채우기 때문에 교차 축 정렬이 필요하지 않습니다.

align-content 키워드와 다중 줄 플렉스 컨테이너에서의 효과를 보여주는 그림입니다.

테스트

8.5. 플렉스 컨테이너 기준선(Baselines)

플렉스 컨테이너기준선 정렬에 참여하려면(예: 플렉스 컨테이너 자체가 바깥 플렉스 컨테이너플렉스 아이템일 때), 그 컨테이너의 내용을 가장 잘 나타내는 기준선 위치를 제출해야 합니다. 이를 위해 플렉스 컨테이너의 기준선은 다음과 같이 결정됩니다 (order로 재정렬한 후, flex-direction도 고려함):

first/last 메인 축 기준선 집합
인라인 축플렉스 컨테이너메인 축과 일치할 때, 기준선은 다음과 같이 결정됩니다:
  1. 플렉스 컨테이너의 플렉스 아이템가장 시작/가장 끝 플렉스 줄에서 기준선 정렬에 참여하는 아이템이 있다면, 플렉스 컨테이너의 first/last 메인 축 기준선 집합은 해당 플렉스 아이템들의 공유 기준선에서 생성됩니다.

  2. 그렇지 않고 플렉스 컨테이너에 하나 이상의 플렉스 아이템이 있다면, first/last 메인 축 기준선 집합가장 시작/가장 끝 플렉스 아이템기준선에서 생성됩니다. (그 아이템이 플렉스 컨테이너의 메인 축과 평행한 기준선이 없으면, 테두리 엣지에서 생성됩니다.)

  3. 그 외에는 플렉스 컨테이너는 first/last 메인 축 기준선 집합이 없으며, 필요하다면 정렬 컨텍스트의 규칙에 따라 생성됩니다.

first/last 교차 축 기준선 집합
인라인 축플렉스 컨테이너교차 축과 일치할 때, 기준선은 다음과 같이 결정됩니다:
  1. 플렉스 컨테이너에 하나 이상의 플렉스 아이템이 있다면, first/last 교차 축 기준선 집합가장 시작/가장 끝 플렉스 아이템기준선에서 생성됩니다. (그 아이템이 플렉스 컨테이너의 교차 축과 평행한 기준선이 없으면, 테두리 엣지에서 생성됩니다.)

  2. 그 외에는 플렉스 컨테이너는 first/last 교차 축 기준선 집합이 없으며, 필요하다면 정렬 컨텍스트의 규칙에 따라 생성됩니다.

위 규칙에 따라 기준선을 계산할 때, 기준선을 제공하는 박스의 overflow 값이 스크롤을 허용한다면, 기준선을 결정하는 목적에서는 박스가 초기 스크롤 위치에 있는 것으로 간주해야 합니다.

테이블 셀의 기준선을 결정할 때, 플렉스 컨테이너는 줄 박스나 테이블-row처럼 기준선을 제공합니다. [CSS2]

기준선에 대한 더 자세한 정보는 CSS Writing Modes 3 § 4.1 기준선 소개CSS Box Alignment 3 § 9 기준선 정렬 세부사항를 참고하세요.

테스트

9. 플렉스 레이아웃 알고리즘

이 섹션에는 플렉스 컨테이너와 그 내용의 정확한 레이아웃 동작을 상세히 설명하는 규범적 알고리즘이 포함되어 있습니다. 여기의 알고리즘은 가독성과 이론적 단순성을 최적화하기 위해 작성되었으며, 반드시 가장 효율적인 방법일 필요는 없습니다. 구현체는 원하는 실제 알고리즘을 사용할 수 있지만, 여기서 설명하는 알고리즘과 동일한 결과를 내야 합니다.

참고: 이 섹션은 주로 구현자를 위한 것입니다. 웹 페이지를 작성하는 저자는 개별 속성 설명만 봐도 충분하며, CSS 레이아웃의 심오한 세부사항을 깊이 이해하려는 특별한 욕구가 없다면 이 섹션을 읽을 필요는 없습니다.

다음 섹션에서는 플렉스 컨테이너와 그 내용의 레이아웃 알고리즘을 정의합니다.

참고: 플렉스 레이아웃은 플렉스 아이템순서가 수정된 문서 순서로 처리하며, 원래 문서 순서로 처리하지 않습니다.

테스트

9.1. 초기 설정

  1. 익명 플렉스 아이템 생성 (§ 4 플렉스 아이템 참고)

9.2. 줄 길이 결정

  1. 플렉스 아이템을 위한 메인 및 교차 공간 결정 각 차원에 대해, 해당 차원의 플렉스 컨테이너 콘텐츠 박스가 확정된 크기면 그 값을 사용; 해당 차원의 플렉스 컨테이너최소 또는 최대 컨텐츠 제약 하에서 크기가 결정되고 있다면, 그 제약이 해당 차원의 사용 가능 공간이 됨; 그 외에는 플렉스 컨테이너의 마진, 테두리, 패딩을 플렉스 컨테이너에 주어진 공간에서 빼고 그 값을 사용. 이 값이 무한대가 될 수도 있습니다.

    예를 들어, 사용 가능 공간float된 auto 크기의 플렉스 컨테이너에서 플렉스 아이템에 대해 다음과 같습니다:

    • 플렉스 컨테이너의 포함 블록 너비에서 플렉스 컨테이너의 마진, 테두리, 패딩(수평 방향)을 뺀 값
    • 수직 방향은 무한대
  2. 각 아이템의 플렉스 기준 크기가상 메인 크기 결정:
    테스트
    1. 아이템에 확정된 flex basis 사용 값이 있으면, 그것이 flex base size입니다.
    2. 플렉스 아이템이 ... 이 경우 flex base size는 해당 아이템의 used cross sizeflex item의 비율로 계산됩니다.
    3. 사용된 flex basiscontent이거나 사용 가능 공간에 따라 결정된다면, 그리고 플렉스 컨테이너가 min-content 또는 max-content 제약 하에서 크기가 결정되고 있다면 (예: 자동 테이블 레이아웃 [CSS2] 수행 시), 해당 제약 하에서 아이템 크기를 결정합니다. flex base size는 아이템의 결과 main size가 됩니다.
    4. 그렇지 않고, 사용된 flex basiscontent이거나 사용 가능 공간에 따라 결정되는 경우, 사용 가능한 메인 크기가 무한대이고, 플렉스 아이템의 인라인 축이 메인 축과 평행이면, 직교 흐름의 박스에 대한 규칙 [CSS3-WRITING-MODES]을 사용해 아이템을 레이아웃합니다. flex base size는 아이템의 max-content main size입니다.

      참고: 이 경우는 예를 들어, 영어 문서(수평 writing mode)에 column 플렉스 컨테이너가 있고, 그 컨테이너 안에 일본어 세로쓰기(세로 writing mode) flex item이 포함된 경우 발생합니다.

    5. 그 외에는, 사용된 flex basis사용 가능 공간에 맞춰 main size 대신 사용해 아이템 크기를 결정합니다. 이때 content 값은 max-content로 처리합니다. main size를 결정하기 위해 cross size가 필요한 경우(예: flex itemmain size가 블록 축에 있거나, 또는 선호 비율을 가진 경우) 그리고 flex item의 교차 크기가 auto이고 확정된 값이 아니라면, 이 계산에서는 fit-contentflex itemcross size로 사용하세요. flex base size는 아이템의 결과 main size가 됩니다.
      테스트

    flex base size를 결정할 때, 아이템의 min 및 max main sizes는 무시됩니다 (클램핑이 적용되지 않습니다). 또한 box-sizing 적용 시 컨텐츠 박스 크기를 0으로 내리는 크기 계산도 무시됩니다. (예를 들어, 크기를 0으로 지정하고, 양수 패딩을 가지며 box-sizing: border-box인 아이템은 외부 flex base size가 0이 되고, 따라서 내부 flex base size는 음수가 될 수 있습니다.)

    hypothetical main size는 아이템의 flex base sizeused min 및 max main sizes(그리고 컨텐츠 박스 크기를 0으로 내리는 것)를 적용해 클램핑한 값입니다.

    테스트
  3. 플렉스 컨테이너의 메인 크기를 해당 포맷팅 컨텍스트의 규칙에 따라 결정합니다.
    자동 블록 크기블록 레벨 플렉스 컨테이너max-content 크기입니다.

    Block Layout 명세가 이러한 동등성을 정의해야 하지만, 아직 존재하지 않습니다.

9.3. 메인 크기 결정

  1. 플렉스 아이템을 flex 라인으로 모읍니다:
    • 플렉스 컨테이너가 단일 줄 플렉스 컨테이너라면, 모든 플렉스 아이템을 하나의 flex 라인에 모읍니다.
    • 그렇지 않으면, 첫 번째 미수집 아이템부터 시작해, 연속된 아이템을 하나씩 모으다가 다음에 모으려는 아이템이 플렉스 컨테이너의 내부 메인 크기 (혹은 강제 줄바꿈이 발생할 때, § 10 플렉스 레이아웃 분할 참고) 에 맞지 않을 순간까지 수집합니다. 만약 첫 번째 미수집 아이템이 맞지 않는다면, 그 아이템만 라인에 수집합니다.

      이 단계에서, 플렉스 아이템의 크기는 외부 가상 메인 크기입니다. (참고: 이 값은 음수일 수도 있습니다.)

      모든 플렉스 아이템이 flex 라인에 수집될 때까지 반복합니다.

      "최대한 많이 수집" 규칙은 크기가 0인 플렉스 아이템을 이전 라인의 끝에 추가하게 만듭니다. 마지막 0이 아닌 아이템이 라인을 정확히 "채우는" 경우에도 마찬가지입니다.

  2. 모든 플렉스 아이템의 유연한 길이를 해결하여 사용된 메인 크기를 찾습니다. § 9.7 유연한 길이 해결 참고.
테스트

9.4. 교차 축 크기 결정

  1. 각 아이템의 가상 교차 크기 결정 아이템을 사용된 in-flow block-level box로, 사용된 main size와 주어진 사용 가능 공간을 사용해 레이아웃을 수행하여 계산합니다. autofit-content로 처리합니다.
    테스트
  2. 각 flex 라인의 교차 크기 계산

    플렉스 컨테이너가 단일 줄이고 확정된 교차 크기가 있는 경우, flex 라인교차 크기플렉스 컨테이너의 내부 교차 크기입니다.

    그 외의 경우, 각 flex 라인에 대해:

    1. 인라인 축이 메인 축과 평행인 아이템 중 align-selfbaseline이고, 교차 축 마진이 모두 auto가 아닌 아이템을 모읍니다. 각 아이템의 베이스라인과 가상 외부 cross-start 엣지 사이의 거리 중 최대값, 그리고 베이스라인과 가상 외부 cross-end 엣지 사이의 거리 중 최대값을 찾아 두 값을 더합니다.
    2. 이전 단계에서 수집되지 않은 모든 아이템 중 외부 가상 교차 크기가 가장 큰 값을 찾습니다.
    3. flex 라인의 사용된 교차 크기는 위 두 단계에서 찾은 값들과 0 중에서 가장 큰 값입니다.

      플렉스 컨테이너가 단일 줄인 경우, 라인의 교차 크기를 컨테이너의 계산된 min 및 max 교차 크기 내로 클램핑합니다. 참고: CSS 2.1의 min/max-width/height 정의가 더 일반적으로 적용된다면, 이 동작은 자동으로 따라오게 됩니다.

    테스트
  3. 'align-content: stretch' 처리 플렉스 컨테이너에 확정된 교차 크기가 있고, align-contentstretch이며, flex 라인들의 교차 크기 합이 플렉스 컨테이너의 내부 교차 크기보다 작으면, 각 flex 라인의 교차 크기를 동일하게 늘려 라인들의 교차 크기 합이 플렉스 컨테이너의 내부 교차 크기와 같아지도록 합니다.
  4. visibility:collapse 아이템 처리 flex 아이템 중 visibility: collapse가 있다면, 해당 아이템이 속한 라인의 교차 크기를 아이템의 strut size로 기록하고 레이아웃을 처음부터 다시 시작합니다.

    두 번째 레이아웃 라운드에서는, 아이템을 라인에 모을 때 collapse된 아이템을 메인 크기 0으로 취급합니다. 이후 알고리즘 단계에서는 collapse된 아이템을 완전히 무시합니다 (마치 display:none인 것처럼) 단, 라인의 교차 크기 계산 이후 라인의 교차 크기가 해당 라인에 collapse된 아이템 중 가장 큰 strut size보다 작으면, 라인의 교차 크기를 그 strut size로 설정합니다.

    이 단계는 두 번째 레이아웃 라운드에서는 건너뜁니다.

    테스트
  5. 각 flex 아이템의 사용된 교차 크기 결정 flex 아이템에 align-self: stretch가 있고, 계산된 교차 크기 속성이 auto이며, 교차 축 마진이 둘 다 auto가 아니면, 사용된 외부 교차 크기는 해당 flex 라인의 사용된 교차 크기이며, 아이템의 사용된 min 및 max 교차 크기에 따라 클램핑합니다. 그 외의 경우, 사용된 교차 크기는 아이템의 가상 교차 크기입니다.

    flex 아이템에 align-self: stretch가 있다면, 해당 크기를 확정된 교차 크기로 취급하여 내용을 다시 레이아웃해 퍼센트 크기 자식 요소를 결정할 수 있게 합니다.

    테스트

    이 단계는 flex 아이템의 main size에는 영향을 주지 않습니다. 선호 비율이 있어도 마찬가지입니다.

테스트

9.5. 메인 축 정렬

  1. 남은 여유 공간 분배 각 flex 라인에 대해:
    1. 남은 여유 공간이 양수이고, 해당 라인에 메인 축 마진 중 하나 이상이 auto라면, 여유 공간을 해당 마진들에 동일하게 분배합니다. 그 외에는 모든 auto 마진을 0으로 설정합니다.
    2. justify-content에 따라 아이템을 메인 축 방향으로 정렬합니다.

9.6. 교차 축 정렬

  1. 교차 축 auto 마진 처리 flex 아이템에 auto 교차 축 마진이 있을 때:
    • 외부 교차 크기(해당 auto 마진을 0으로 처리)가 flex 라인의 교차 크기보다 작으면, 두 크기의 차이를 auto 마진에 동일하게 분배합니다.
    • 그 외에는 block-start 또는 inline-start 마진(교차 축에 있는 것)이 auto라면, 0으로 설정합니다. 반대쪽 마진은 아이템의 외부 교차 크기가 flex 라인의 교차 크기와 같아지도록 설정합니다.
  2. 모든 flex 아이템을 교차 축 방향으로 정렬 아이템의 교차 축 마진이 모두 auto가 아니면, align-self에 따라 정렬합니다.
  3. 플렉스 컨테이너의 사용된 교차 크기 결정 해당 포맷팅 컨텍스트의 규칙을 따라 결정합니다. 컨텐츠 기반 교차 크기가 필요하다면, flex 라인교차 크기 합을 사용합니다.
  4. 모든 flex 라인 정렬 align-content에 따라 정렬합니다.

9.7. 유연한 길이 해결

flex 라인 내 아이템의 유연한 길이를 해결하려면:

  1. 사용된 flex 계수 결정 라인 내 모든 아이템의 외부 가상 메인 크기를 합산합니다. 합이 플렉스 컨테이너의 내부 main size보다 작으면, 이 알고리즘의 나머지 단계에서 flex grow 계수를 사용하고; 그렇지 않으면 flex shrink 계수를 사용합니다.
  2. flex 라인 내 각 아이템은 목표 메인 크기를 가지며, 처음에는 flex base size로 설정됩니다. 각 아이템은 처음에는 unfrozen이며 이후 frozen이 될 수 있습니다.

    참고: 아이템의 목표 메인 크기는 freezing 이후에는 변경되지 않습니다.

  3. 유연하지 않은 아이템 크기 결정 freeze 처리하며, 목표 메인 크기가상 메인 크기로 설정합니다…
  4. 초기 여유 공간 계산 라인 내 모든 아이템의 외부 크기를 합산하고, 이를 플렉스 컨테이너의 내부 main size에서 뺍니다. freeze된 아이템에는 외부 목표 메인 크기를 사용하고, 그 외 아이템에는 외부 flex base size를 사용합니다.
  5. 반복:
    1. 유연한 아이템 존재 여부 확인 라인 내 모든 flex 아이템이 freeze되었으면 반복 종료.
    2. 남은 여유 공간 계산초기 여유 공간과 동일하게 계산합니다. freeze되지 않은 flex 아이템의 flex 계수 합이 1 미만이면, 초기 여유 공간에 이 합을 곱합니다. 이 값의 절대값이 남은 여유 공간의 절대값보다 작으면, 이 값을 남은 여유 공간으로 사용합니다.
    3. 남은 여유 공간이 0이 아니면 flex 계수에 비례해 분배합니다:
      flex grow 계수 사용 시
      라인 내 freeze되지 않은 모든 아이템에 대해, 아이템의 flex grow 계수를 라인 내 freeze되지 않은 모든 아이템의 flex grow 계수 합으로 나눈 비율을 구합니다. 아이템의 목표 메인 크기flex base size남은 여유 공간의 해당 비율만큼을 더한 값으로 설정합니다.
      flex shrink 계수 사용 시
      라인 내 freeze되지 않은 모든 아이템에 대해, flex shrink 계수에 내부 flex base size를 곱해서 확장 flex shrink 계수로 기록합니다. 아이템의 확장 flex shrink 계수를 라인 내 freeze되지 않은 모든 아이템의 확장 계수 합으로 나눈 비율을 구합니다. 아이템의 목표 메인 크기flex base size에서 남은 여유 공간 절대값의 해당 비율만큼을 뺀 값으로 설정합니다. 참고: 이 경우 내부 main size가 음수가 될 수 있음. 다음 단계에서 수정됩니다.
    4. min/max 제한 위반 수정 freeze되지 않은 각 아이템의 목표 메인 크기사용된 min 및 max main size에 따라 클램핑하고, 컨텐츠 박스 크기를 0으로 내립니다. 아이템의 목표 메인 크기가 이로 인해 더 작아지면 max 위반, 더 커지면 min 위반입니다.
    5. 과도하게 늘어난 아이템 freeze 전체 위반량은 이전 단계에서의 조정값 합 ∑(clamped size - unclamped size)입니다. 전체 위반량이
      0
      모든 아이템 freeze
      양수
      min 위반된 아이템 모두 freeze
      음수
      max 위반된 아이템 모두 freeze

      참고: 최소한 하나의 아이템을 freeze하므로, 반복이 항상 진행되고 결국 종료됩니다.

    6. 반복의 처음으로 돌아갑니다.
  6. 각 아이템의 사용된 main size목표 메인 크기로 설정합니다.
테스트

9.8. 확정 크기와 비확정 크기

CSS Sizing [CSS-SIZING-3]에서는 확정비확정 길이를 정의하지만, Flexbox에서는 어떤 길이가 확정으로 간주될 수 있는 추가적인 경우가 있습니다:

  1. 플렉스 컨테이너확정된 메인 크기가 있으면, 플렉싱 이후 메인 크기플렉스 아이템에 대해 확정으로 처리됩니다.

  2. 플렉스 아이템flex basis확정이면, 플렉싱 이후 메인 크기확정으로 처리됩니다.

  3. 단일 줄 플렉스 컨테이너에 확정된 교차 크기가 있으면, 자동 선호 외부 교차 크기늘어진 플렉스 아이템에 대해 플렉스 컨테이너의 내부 교차 크기(플렉스 아이템의 min/max 교차 크기로 클램핑됨) 로 간주되며 확정으로 처리됩니다.

  4. 플렉스 라인의 교차 크기가 결정된 후에는, 자동 크기 플렉스 컨테이너의 아이템 교차 크기도 레이아웃 목적상 확정된 것으로 간주됩니다; 11단계 참고.

테스트

참고: 이것은 flex layout 내에서 "확정" 크기를 얻으려면 실제 레이아웃 계산을 수행해야 함을 의미합니다. 이는 flex item 내부의 백분율 값이 저자가 기대하는 위치에서 해석될 수 있도록 하기 위해 도입되었습니다.

9.9. 내재적 크기

내재적 크기 결정flex container에서 컨텐츠 기반 자동 크기 산출에 사용됩니다. 예를 들어 컨텐츠에 맞춰 줄어드는 논리적 너비(fit-content 공식을 사용)와, 컨텐츠 기반 논리적 높이(max-content 크기 공식을 사용) 등이 이에 해당합니다. 이 계산에서는 flex 아이템의 auto 마진을 0으로 취급합니다.

이 절의 용어 정의는 [CSS-SIZING-3]를 참고하세요.

테스트

9.9.1. 플렉스 컨테이너의 내재적 메인 크기

max-content 메인 크기플렉스 컨테이너는 이론적으로, 플렉스 컨테이너가 flex 레이아웃을 해당 컨테이너 크기로 실행할 때, 각 플렉스 아이템이 최소한 자신의 max-content contribution 크기만큼을 갖도록, (아이템의 유연성이 허락하는 한에서) 컨테이너가 가질 수 있는 최소 크기입니다.

min-content 메인 크기플렉스 컨테이너는 이론적으로, 플렉스 컨테이너가 아이템이 넘치지 않고, 아이템의 컨텐츠도 아이템을 넘치지 않는(박스 레이아웃이 정의상 오버플로우되는 경우를 제외하고, 예를 들어 음수 마진이나 100%를 초과하는 백분율 크기 등) 최소 크기입니다.

테스트
9.9.1.1. 이상적인 알고리즘

참고: 아래 알고리즘은 플렉스 컨테이너의 이상적인 내재적 메인 크기를 계산합니다. 하지만, 처음에 올바르게 구현되지 않았고, 기존 콘텐츠가 (안타깝게도 일관적인) 잘못 구현된 동작에 의존하게 되었기 때문에, 웹 호환성이 없습니다. 구현자와 CSS 워킹그룹은 웹 브라우저 구현체가 이 동작에 얼마나 안전하게 접근할 수 있을지 조사 중이며, 추가 실험도 환영합니다.

오직 collapsed가 아닌 플렉스 아이템만 고려합니다;

  1. 플렉스 아이템에 대해, 외부 flex base sizemax-content contribution 크기에서 뺍니다. 그 결과가 양수면, 아이템의 flex grow factor가 1 이상이면 나누고, flex grow factor가 1 미만이면 곱합니다; 결과가 음수면, 아이템의 scaled flex shrink factor로 나눕니다(0으로 나누면 음의 무한대로 처리). 이것이 아이템의 desired flex fraction입니다.
  2. 모든 플렉스 아이템을 무한 길이의 라인에 배치합니다. 각 라인에서, 모든 플렉스 아이템 중 가장 큰(가장 양수인) desired flex fraction을 찾습니다. 이것이 라인의 chosen flex fraction입니다.
  3. chosen flex fraction이 양수이고, 라인의 flex grow factors 합이 1 미만이면, chosen flex fraction을 그 합으로 나눕니다.

    chosen flex fraction이 음수이고, 라인의 flex shrink factors 합이 1 미만이면, chosen flex fraction에 그 합을 곱합니다.

  4. 각 아이템의 flex base size에, flex grow factor(축소 시에는 scaled flex shrink factor)와 chosen flex fraction의 곱을 더한 뒤, 그 결과를 max main size에서 min main size로 내립니다.
  5. 플렉스 컨테이너max-content 크기는 모든 라인 중에서, 한 라인 내 모든 아이템의 위에서 계산한 크기 합 중 가장 큰 값입니다.

min-content 메인 크기단일 줄 플렉스 컨테이너는 max-content 메인 크기와 동일하게 계산하지만, 플렉스 아이템min-content contributionmax-content contribution 대신 사용합니다.

flex 합이 1 미만일 때 위 알고리즘의 영향

위 알고리즘은 특히 두 가지 경우에 올바른 동작을 제공하도록 설계되었으며, 두 경우를 전환할 때 플렉스 컨테이너 크기가 연속적이도록 합니다:

  1. 모든 아이템이 유연하지 않으면, 플렉스 컨테이너 크기는 아이템들의 flex base size 합이 됩니다. (유연하지 않은 flex base size는 본질적으로 width/height를 대체하며, 이것이 지정된 경우 Block Layout에서 max-content contribution의 기준이 됩니다.)

  2. 모든 아이템이 flex 계수 ≥ 1로 유연하면, 플렉스 컨테이너 크기는 아이템들의 max-content contribution 합(또는 아이템 각각이 최소한 자신의 max-content contribution 이상이고, 유연성에 따라 다른 아이템과 크기 비율이 올바르도록 하는 약간 더 큰 값)에 맞춰집니다.

예를 들어, 플렉스 컨테이너플렉스 아이템이 하나 있고, 해당 아이템의 flex-basis: 100px;이지만 max-content 크기가 200px인 경우, 아이템이 flex-grow: 0일 때 플렉스 컨테이너(및 플렉스 아이템)의 너비는 100px이고, 아이템이 flex-grow: 1 이상일 때는 플렉스 컨테이너(및 플렉스 아이템)의 너비가 200px이 됩니다.

이 두 경우 사이에서 전체 동작을 연속적으로 만드는 방법에는 여러 가지가 있지만, 각 방법마다 단점이 있습니다. 우리는 가장 문제가 적은 방법을 선택했으나, 불행히도 flex factor가 1보다 작은 경우에는 유연성이 "이중 적용"되는 현상이 있습니다. 위 예시에서 아이템이 flex-grow: .5이면, 플렉스 컨테이너의 너비는 150px이 되고, 아이템은 해당 가용 공간에 맞춰 크기가 결정되어 125px 너비가 됩니다.

선택한 특정 동작에 대한 더 복잡한 참고 사항

원칙:

  1. 크기가 0에 가까워질 때, 아무 크기든(늘리거나 줄이거나) 폭발적이지 않아야 한다.

  2. 모든 flex 계수가 1 이상이면, 모든 아이템이 max-content 크기 이상이 되기 위한 최소 크기를 반환해야 한다.

  3. flex 계수가 0인 아이템은 전체 크기에 영향을 주지 않아야 한다.

  4. flex 계수와 아이템 크기 변화에 대해 연속성을 유지해야 한다.

  5. 입력 변수(크기, flex 계수)의 선형 변화에 대해 크기 변화도 가능한 한 선형적이어야 한다.

  6. flex 계수 합이 1 이상이면, 모든 아이템이 max-content 크기 이상이 되기 위한 최소 크기를 반환해야 한다.

이 모든 동작을 함께 제대로 작동시키기 위해서는, flex factor나 한 줄의 flex factor 합이 1보다 작을 때 보정(correction)을 적용해야 합니다.

축소(shrink)의 경우 동작이 더 쉽습니다; shrink 값이 0인 폭발적 상황에서는 원하는 분수(desired fraction)가 음의 무한대로 치솟지만, 우리는 항상 가장 큰 값을 선택하므로 그런 값은 선택하지 않게 됩니다. 따라서 줄(line) 단위에서만 보정을 적용하면 되고, 합이 1보다 작을 때만 두 번 보정(double-application)이 발생합니다.

성장(positives)의 경우 더 복잡합니다. grow 값이 0이면 순진하게는 *양의* 무한대로 폭발하는데, 그런 값은 우리가 선택할 수도 있으므로, 각 아이템(item) 단위에서 보정을 적용해야 합니다. factor가 1보다 작으면 공간(space)에 factor를 곱해 보정을 합니다. 이것만 적용하면 factor가 1보다 작은 아이템이 있지만 합이 1 이상인 경우에는 두 번 보정되고, 합이 1보다 작으면 *세 번* 보정되는 결과가 나옵니다. 이런 지나친 현상을 막기 위해, 합이 1인 경우에는 *역방향(reverse)* 보정으로 합으로 나누는 방식(dividing by the sum)을 적용합니다. 이렇게 하면 factor가 1보다 작은 아이템의 모든 경우에 두 번 보정이 남게 됩니다.

두 번 보정(double-application) 현상을 완전히 없앨 수는 없습니다. 그렇게 하면 더 중요한 원칙(특히 원칙 3—​flex-grow: .5인 아이템이 두 개 있을 때 두 번 보정하지 않도록 하면서, flex-grow: 0인 아이템이 flex-grow: 1인 형제에 아무 영향도 주지 않도록 하는 원칙)을 지킬 수 없기 때문입니다; 우리가 보기에는 양립 불가입니다.

9.9.1.2. 웹 호환 내재적 크기 알고리즘

참고: 아래 알고리즘은 웹 호환성이 검증되었습니다. 가능한 경우 위의 이상적인 알고리즘에 더 가까워지도록 변경될 수 있습니다.

웹 호환 알고리즘은 향후 여기에 기술될 예정입니다. [Issue #8884]

9.9.1.3. 다중 줄 min-content 알고리즘

다중 줄 컨테이너의 경우, min-content 메인 크기collapsed가 아닌 플렉스 아이템 중에서 min-content contribution이 가장 큰 값입니다. 이때, grow가 불가능한 아이템은 아이템의 flex base size로 상한을 두고, shrink가 불가능한 아이템은 flex base size로 하한을 두며, 이후 아이템의 min/max main size로 추가 클램핑합니다.

9.9.2. 플렉스 컨테이너의 내재적 교차 크기

min-content/max-content 교차 크기단일 줄 플렉스 컨테이너는, 해당 min-content contribution/max-content contribution 중 가장 큰 값입니다. (플렉스 아이템 기준)

다중 줄 플렉스 컨테이너의 경우, row/column flexbox 여부에 따라 동작이 달라집니다:

row 다중 줄 플렉스 컨테이너 교차 크기

min-content/max-content 교차 크기는, 플렉스 컨테이너가 교차 축 min-content constraint/max-content constraint 조건에서 크기가 결정될 때, flex 라인 교차 크기 합입니다.

column 다중 줄 플렉스 컨테이너 교차 크기

min-content 교차 크기는 모든 플렉스 아이템 중에서 min-content contribution이 가장 큰 값입니다.

참고: 이 휴리스틱은 플렉스 컨테이너에 높이 제약이 있으면 오버플로우가 발생할 수 있지만, 스크롤 컨테이너인 경우, 각 column이 scrollport 내에 완전히 들어갈 수 있을 만큼 충분히 크게 보장합니다.

max-content 교차 크기는, 플렉스 컨테이너교차 축 max-content constraint 하에서 크기가 결정될 때, flex 라인 교차 크기 합입니다. 이때 각 max-content 교차 크기 contribution 중 가장 큰 값을 각 플렉스 아이템의 레이아웃 시 교차 축 사용 가능 공간으로 사용합니다.

참고: 이 휴리스틱은 플렉스 컨테이너 크기를 합리적으로 근사합니다. 각 플렉스 아이템max-content contribution 이상으로 레이아웃되고, 각 flex 라인은 그 라인에서 가장 큰 플렉스 아이템 이상 크기를 넘지 않습니다. 완벽하진 않지만, 완전히 정확하게 처리하는 것은 매우 비효율적이고, 이 방법이 실용적으로 잘 동작합니다.

테스트

9.9.3. 플렉스 아이템의 내재적 크기 기여

min-content contribution 메인 크기플렉스 아이템외부 min-content size와 외부 preferred size 중 더 큰 값을 사용하며, 이 값이 auto가 아니라면, 아이템의 min/max main size에 따라 클램핑합니다.

max-content contribution 메인 크기플렉스 아이템외부 max-content size와 외부 preferred size 중 더 큰 값을 사용하며, 이 값이 auto가 아니라면, 아이템의 min/max main size에 따라 클램핑합니다.

10. 플렉스 레이아웃 분할(Fragmentation)

플렉스 컨테이너는 아이템 사이, 아이템 라인 사이(다중 줄 모드에서), 그리고 아이템 내부에서 페이지를 넘어서 분할될 수 있습니다. break-* 속성은 블록 레벨 또는 인라인 레벨 박스에 대해 flex 컨테이너에도 정상적으로 적용됩니다. 이 섹션에서는 해당 속성이 flex 아이템 및 flex 아이템의 내용에 어떻게 적용되는지 정의합니다. 자세한 내용은 CSS Fragmentation Module [CSS3-BREAK]을 참고하세요.

다음 분할 규칙은 fragmentation container를 "페이지"로 간주합니다. 동일한 규칙은 다른 fragmentation context에도 적용됩니다. (필요시 "페이지"를 적절한 fragmentation container 유형으로 대체하세요.) 가독성을 위해, 이 섹션에서 "row"와 "column" 용어는 플렉스 컨테이너fragmentation context의 블록 플로우 방향에 대해 가지는 상대적 방향을 의미하며, 플렉스 컨테이너 자체의 방향을 의미하지 않습니다.

분할된 flex 컨테이너의 정확한 레이아웃은 Flexible Box Layout의 이 레벨에서는 정의되어 있지 않습니다. 하지만 flex 컨테이너 내부의 분할은 다음 규칙을 따릅니다 (order-modified document order를 기준으로 해석):

테스트

10.1. 플렉스 분할 샘플 알고리즘

이 안내 섹션에서는 플렉스 컨테이너에 대한 가능한 분할 알고리즘을 제시합니다. 구현자들은 이 알고리즘을 개선하고 CSS 워킹 그룹에 피드백을 제공하는 것이 권장됩니다.

이 알고리즘은 항상 페이징이 앞으로만 진행된다고 가정합니다; 따라서 아래 알고리즘에서는 페이징 전에 정렬이 대부분 무시됩니다. 고급 레이아웃 엔진은 단편화된 영역에서도 정렬을 보장할 수 있습니다.

single-line column flex container
  1. 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 교차 크기 결정까지 실행합니다.
  2. 가능한 한 많은 연속 플렉스 아이템 또는 아이템 단편을, (최소 한 개 또는 그 일부를 포함하여) 처음부터 시작하여, 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다.
  3. 이전 단계에서 공간이 부족했고, 남은 공간이 양수라면, UA는 이 페이지에서 분배된 남은 공간을(0까지는 줄이되, 0 이하로는 가지 않음) 다음에 들어갈 수 없는 아이템이나 단편을 위해 공간을 만들기 위해 줄일 수 있습니다. 그렇지 않으면, 맞지 않는 아이템 또는 단편은 다음 페이지로 넘어갑니다. UA는 만약 단편의 50% 이상이 남은 공간에 들어갈 수 있으면 끌어올리고, 아니면 넘깁니다.
  4. 이전 단계에서 배치되지 않은 플렉스 아이템이나 단편이 있다면, 플렉스 레이아웃 알고리즘을 라인 길이 결정부터 교차 크기 결정까지 다음 페이지 크기로, 그리고 전체 컨텐츠(이미 배치된 것 포함)로 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템 또는 단편부터 시작합니다.
  5. 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 메인 축 정렬부터 끝까지 계속합니다.

이 알고리즘의 의도는 column 방향 single-line 플렉스 컨테이너가 블록 플로우와 매우 유사하게 페이징되도록 하는 것입니다. 의도를 테스트하려면, justify-content:start이고 유연하지 않은 아이템만 있는 플렉스 컨테이너는 같은 컨텐츠, 같은 사용 크기, 같은 마진을 가진 in-flow 자식이 있는 블록과 동일하게 페이징되어야 합니다.

multi-line column flex container
  1. 페이징을 고려하여(플렉스 컨테이너의 최대 라인 길이를 페이지에 남은 공간으로 제한) 플렉스 레이아웃 알고리즘을 교차 크기 결정까지 실행합니다.
  2. 가능한 한 많은 flex 라인을(최소 한 개) 플렉스 컨테이너의 교차 방향과 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치:
    1. 가능한 한 많은 연속 flex 아이템을(최소 한 개), 처음부터 시작해, 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다. flex 아이템 내부의 강제 분할은 무시합니다.
    2. 만약 이것이 첫 flex 컨테이너 단편이고, 해당 라인이 한 개의 flex 아이템만 포함하며, 그 아이템이 페이지에 남은 공간보다 크고, 플렉스 컨테이너가 이미 페이지의 맨 위에 없는 경우, 플렉스 컨테이너를 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다.
    3. 첫 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 메인 크기 결정부터 교차 크기 결정까지 해당 라인에서 이미 배치되지 않은 아이템만 사용해 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템부터 시작합니다.
  3. 이전 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 라인 크기 결정부터 교차 크기 결정까지 다음 페이지 크기로, 그리고 이미 배치되지 않은 아이템만 사용해 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템부터 시작합니다.
  4. 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 메인 축 정렬부터 끝까지 계속합니다.

이 샘플 알고리즘의 단점은 flex 아이템이 한 페이지에 완전히 들어가지 않으면, multi-line column flex 컨테이너에서 단편화되지 않는다는 점입니다.

single-line row flex container
  1. 전체 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 실행하되, align-selfflex-start 또는 baseline이 아닌 경우 flex-start로 처리합니다.
  2. 들어갈 수 없는 아이템이 페이지에 남은 공간 내에 들어가지 않고, 플렉스 컨테이너가 페이지 맨 위에 없으면, 플렉스 컨테이너를 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다.
  3. 각 아이템에 대해, 컨텐츠 중 남은 공간에 들어갈 수 있는 만큼 배치하고, 남은 컨텐츠는 다음 페이지로 단편화하여 넘긴 뒤, 플렉스 레이아웃 알고리즘을 라인 길이 결정부터 메인 축 정렬까지 새 페이지 크기로, 전체 컨텐츠(이전 페이지에서 완료된 아이템 포함)로 다시 실행합니다.

    이전 단편에 완전히 들어간 flex 아이템도 이후 단편에서 메인 축 공간을 계속 차지합니다.

  4. 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 교차 축 정렬부터 끝까지 다시 실행합니다. 첫 번째 단편을 제외한 모든 단편에서는, align-selfalign-content를 모든 아이템 단편 및 라인에 대해 flex-start로 처리합니다.
  5. 어떤 아이템이라도, 원래 align-self 값에 따라 모든 플렉스 컨테이너 단편의 결합된 교차 크기 내에 완전히 들어갈 수 있다면, 해당 단편으로 이동해 알맞게 정렬할 수 있습니다.
multi-line row flex container
  1. 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 교차 크기 결정까지 실행합니다.
  2. 가능한 한 많은 flex 라인을(최소 한 개) 처음부터 시작해서, 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다.

    라인이 페이지에 들어가지 않고, 라인이 페이지 맨 위에 없으면, 라인을 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다. 이때 해당 라인 및 이후 라인에 있는 아이템만 사용합니다.

    flex 아이템 자체가 강제 분할을 일으키면, 플렉스 레이아웃 알고리즘을 메인 크기 결정부터 메인 축 정렬까지, 해당 라인 및 이후 라인에 있는 아이템만 사용해 다시 실행하며, 분할을 유발한 아이템은 라인 나누기 단계에서 자동으로 새 라인을 시작하게 하고, 이후 이 단계를 계속합니다. flex 아이템 내부의 강제 분할은 무시합니다.

  3. 이전 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 라인 길이 결정부터 메인 축 정렬까지 다음 페이지 크기로, 그리고 이미 배치되지 않은 아이템만 사용해 다시 실행합니다. 이전 단계로 돌아가되, 이미 배치되지 않은 첫 라인부터 시작합니다.
  4. 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 교차 축 정렬부터 끝까지 계속합니다.

부록 A: 축 매핑

이 부록은 규범적이지 않습니다.

ltr + horizontal-tb 쓰기 모드 (예: 영어)의 축 매핑
flex-flow main axis start end cross axis start end
row + nowrap/wrap 수평 왼쪽 오른쪽 수직 아래
row-reverse + nowrap/wrap 오른쪽 왼쪽
row + wrap-reverse 왼쪽 오른쪽 아래
row-reverse + wrap-reverse 오른쪽 왼쪽
column + nowrap/wrap 수직 아래 수평 왼쪽 오른쪽
column-reverse + nowrap/wrap 아래
column + wrap-reverse 아래 오른쪽 왼쪽
column-reverse + wrap-reverse 아래
rtl + horizontal-tb 쓰기 모드 (예: 페르시아어)의 축 매핑
flex-flow main axis main-start main-end cross axis cross-start cross-end
row + nowrap/wrap 수평 오른쪽 왼쪽 수직 아래
row-reverse + nowrap/wrap 왼쪽 오른쪽
row + wrap-reverse 오른쪽 왼쪽 아래
row-reverse + wrap-reverse 왼쪽 오른쪽
column + nowrap/wrap 수직 아래 수평 오른쪽 왼쪽
column-reverse + nowrap/wrap 아래
column + wrap-reverse 아래 왼쪽 오른쪽
column-reverse + wrap-reverse 아래
ltr + vertical-rl 쓰기 모드 (예: 일본어)의 축 매핑
flex-flow main axis start end cross axis start end
row + nowrap/wrap 수직 아래 수평 오른쪽 왼쪽
row-reverse + nowrap/wrap 아래
row + wrap-reverse 아래 왼쪽 오른쪽
row-reverse + wrap-reverse 아래
column + nowrap/wrap 수직 오른쪽 왼쪽 수평 아래
column-reverse + nowrap/wrap 왼쪽 오른쪽
column + wrap-reverse 오른쪽 왼쪽 아래
column-reverse + wrap-reverse 왼쪽 오른쪽

부록 B: -webkit- 레거시 속성

이 부록은 규범적입니다.

이 별칭은 더 이상 사용하지 않으므로 저자는 실제로 사용하는 레거시 UA를 지원해야 할 필요가 없으면 사용하지 않는 것이 좋습니다.

일반 웹 콘텐츠 호환을 위해, 웹 브라우저인 UA는 반드시, 그 외 UA는 선택적으로, 다음 레거시 이름 별칭을 구현해야 합니다:

별칭 표준
-webkit-align-content align-content
-webkit-align-items align-items
-webkit-align-self align-self
-webkit-flex flex
-webkit-flex-basis flex-basis
-webkit-flex-direction flex-direction
-webkit-flex-flow flex-flow
-webkit-flex-grow flex-grow
-webkit-flex-shrink flex-shrink
-webkit-flex-wrap flex-wrap
-webkit-justify-content justify-content
-webkit-order order
테스트

감사의 말

피드백과 기여를 해주신 분들께 감사드립니다.

Erik Anderson, Christian Biesinger, Tony Chang, Phil Cupp, Arron Eicholz, James Elmore, Andrew Fedoniouk, Brian Heuston, Shinichiro Hamaji, Daniel Holbert, Ben Horst, John Jansen, Brad Kemper, Kang-hao Lu, Markus Mielke, Peter Moulder, Robert O’Callahan, Christoph Päper, Ning Rogers, Peter Salas, Elliott Sprehn, Morten Stenshorne, Christian Stockwell, Ojan Vafai, Eugene Veselov, Greg Whitworth, Boris Zbarsky.

변경 내역

이 섹션은 이전 출판 이후의 변경 사항을 기록합니다.

2018년 11월 19일 CR 이후 변경점

의견 반영 결과를 볼 수 있습니다. 주요 변경 사항은 다음과 같습니다:

2017년 10월 16일 CR 이후 변경점

의견 반영 결과도 제공됩니다.

2016년 5월 26일 CR 이후 변경점

의견 반영 결과도 제공됩니다.

실질적 변경 및 버그 수정

명확화

2016년 3월 1일 CR 이후 변경점

의견 반영 결과도 제공됩니다.

실질적 변경 및 버그 수정

명확화

2015년 5월 14일 LCWD 이후 변경점

의견 반영 결과도 제공됩니다.

실질적 변경 및 버그 수정

명확화

2014년 9월 25일 LCWD 이후 변경점

의견 반영 결과도 제공됩니다.

실질적 변경 및 버그 수정

명확화

2014년 3월 25일 LCWD 이후 변경점

Disposition of Comments도 제공됩니다.

실질적 변경 및 버그 수정

2014년 3월 25일 Last Call Working Draft 이후 다음과 같은 중요한 변경이 있었습니다.

명확화

2014년 3월 25일 Last Call Working Draft 이후 다음과 같은 중요한 명확화가 있었습니다.

2012년 9월 18일 Candidate Recommendation 이후 변경점

Disposition of Comments도 제공됩니다.

실질적 변경 및 버그 수정

2012년 9월 18일 Candidate Recommendation 이후 다음과 같은 중요한 변경이 있었습니다:

명확화

다음과 같은 중요한 명확화도 이루어졌습니다:

프라이버시 고려사항

이 명세에 대해 보고된 새로운 프라이버시 고려사항은 없습니다.

보안 고려사항

이 명세에 대해 보고된 새로운 보안 고려사항은 없습니다.

테스트

the order property, now in css-display-3


print stuff


non-specific crashers


need quirks mode


css box 3 tests


unsure/nonspecific


적합성

문서 규약

적합성 요구사항은 서술적 단언과 RFC 2119 용어의 조합으로 표현됩니다. 이 명세의 규범적 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL”이라는 핵심 단어는 RFC 2119에 기술된 바와 같이 해석되어야 합니다. 다만, 가독성을 위해 본 명세에서는 이러한 단어들이 모두 대문자로 표기되어 있지는 않습니다.

본 명세의 모든 본문은, 비규범으로 명시된 섹션과 예시, 주석을 제외하고, 규범적입니다. [RFC2119]

이 명세의 예시는 “for example”이라는 문구로 시작하거나, 다음과 같이 class="example"로 규범 텍스트와 구분됩니다:

이는 정보 제공용 예시의 한 예입니다.

정보 제공용 주석은 “Note”라는 단어로 시작하며, 다음과 같이 class="note"로 규범 텍스트와 구분됩니다:

참고: 이는 정보 제공용 주석입니다.

권고(Advisement)는 특별한 주의를 환기하도록 스타일링된 규범 섹션이며, 다음과 같이 <strong class="advisement">로 다른 규범 텍스트와 구분됩니다: UAs MUST provide an accessible alternative.

테스트

이 명세의 내용과 관련된 테스트는 다음과 같은 “Tests” 블록에 문서화될 수 있습니다. 이러한 블록은 모두 비규범적입니다.


적합성 클래스

본 명세에 대한 적합성은 다음의 세 가지 적합성 클래스로 정의됩니다:

style sheet
CSS style sheet.
renderer
스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링하는 UA.
authoring tool
스타일 시트를 작성하는 UA.

스타일 시트는, 이 모듈에서 정의된 구문을 사용하는 모든 선언이 일반 CSS 문법과 이 모듈에서 정의된 각 기능의 개별 문법에 따라 유효하다면, 본 명세에 적합합니다.

렌더러는, 적절한 명세에 정의된 대로 스타일 시트를 해석하는 것에 더해, 본 명세에 정의된 모든 기능을 올바르게 파싱하고 그에 따라 문서를 렌더링함으로써 지원한다면, 본 명세에 적합합니다. 다만, 디바이스의 한계로 인해 UA가 문서를 올바르게 렌더링하지 못하더라도 그 사실만으로 비적합인 것은 아닙니다. (예: UA는 모노크롬 모니터에서 색상을 렌더링할 필요가 없습니다.)

저작 도구는, 이 모듈의 일반 CSS 문법과 각 기능의 개별 문법에 따라 구문적으로 올바른 스타일 시트를 작성하고, 이 모듈에 기술된 스타일 시트의 그 밖의 모든 적합성 요구사항을 충족한다면, 본 명세에 적합합니다.

부분 구현

저자가 전방 호환 파싱 규칙을 활용해 폴백 값을 지정할 수 있도록, CSS 렌더러는 사용 가능한 수준의 지원이 없는 at-rule, 속성, 속성 값, 키워드, 기타 구문 구성 요소를 must 유효하지 않은 것으로 간주하고 (그리고 적절히 무시) 처리해야 합니다. 특히, 사용자 에이전트는 하나의 다중 값 속성 선언에서 지원되지 않는 구성 요소 값은 무시하면서 지원되는 값만을 적용하는 행위를 must not 해서는 안 됩니다: 어떤 값이 유효하지 않은 것으로 간주된다면(지원되지 않는 값은 반드시 그러해야 함), CSS는 전체 선언을 무시하도록 요구합니다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 CSS에 대한 불안정 기능과 독점 확장의 구현 시 모범 사례를 따를 것을 권장합니다.

비실험적 구현

명세가 후보 권고안(CR) 단계에 도달하면 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 모든 CR 수준 기능에 대해 접두사 없는 구현을 릴리스해야 합니다.

다양한 구현 간 CSS의 상호 운용성을 확립하고 유지하기 위해, CSS 작업 그룹은 비실험적 CSS 렌더러가 접두사 없는 CSS 기능 구현을 릴리스하기 전에 구현 보고서(및 필요한 경우 해당 구현 보고서에 사용된 테스트케이스)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 작업 그룹의 검토 및 수정 대상이 됩니다.

테스트케이스와 구현 보고서 제출에 대한 추가 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 보내주시기 바랍니다.

CR 종료 기준

본 명세가 제안 권고안(PR) 단계로 진전되기 위해서는, 각 기능에 대해 최소 두 개의 독립적이고 상호 운용 가능한 구현이 존재해야 합니다. 각 기능은 서로 다른 제품 집합에 의해 구현될 수 있으며, 모든 기능이 단일 제품에서 구현되어야 할 필요는 없습니다. 이 기준을 위해 다음 용어를 정의합니다:

independent
각 구현은 서로 다른 당사자에 의해 개발되어야 하며, 다른 적격 구현에서 사용된 코드를 공유, 재사용 또는 파생할 수 없습니다. 이 명세의 구현과 무관한 코드 부분은 이 요구사항에서 제외됩니다.
interoperable
공식 CSS 테스트 스위트의 해당 테스트케이스를 통과하거나, 구현이 웹 브라우저가 아닌 경우 이에 상응하는 테스트를 통과하는 것. 해당 사용자 에이전트(UA)를 사용해 상호 운용성을 주장하려면, 테스트 스위트의 모든 관련 테스트에 대해 상응하는 테스트가 생성되어야 합니다. 또한 해당 UA로 상호 운용성을 주장하려면, 동일한 방식으로 그 상응 테스트를 통과할 수 있는 하나 이상의 추가 UA가 존재해야 합니다. 상응 테스트는 동료 검토를 위해 공개되어야 합니다.
implementation
다음을 만족하는 사용자 에이전트:
  1. 명세를 구현합니다.
  2. 일반 대중이 이용할 수 있습니다. 구현은 출시 제품이거나 공개적으로 이용 가능한 버전(예: 베타 버전, 프리뷰 릴리스, "나이트리 빌드")일 수 있습니다. 출시되지 않은 제품의 경우, 안정성을 입증하기 위해 해당 기능을 최소 한 달 이상 구현한 상태여야 합니다.
  3. 실험적이지 않습니다(즉, 테스트 스위트를 통과하도록 특별히 설계되었고 향후 일반 사용을 의도하지 않는 버전이 아닙니다).

본 명세는 최소 6개월 동안 후보 권고안(CR) 단계에 머뭅니다.

색인

이 명세서에서 정의된 용어

참조에 의해 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 11 March 2025. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 4 August 2024. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 18 December 2018. FPWD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 13 January 2022. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 30 March 2023. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 19 December 2024. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 19 November 2018. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 18 December 2023. CRD. URL: https://www.w3.org/TR/css-images-3/
[CSS-INLINE-3]
Elika Etemad. CSS Inline Layout Module Level 3. 18 December 2024. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 7 October 2025. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 7 October 2025. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 27 June 2025. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 17 December 2021. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 20 May 2021. WD. URL: https://www.w3.org/TR/css-sizing-4/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 29 May 2024. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 22 March 2024. CRD. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 12 March 2024. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 30 July 2019. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-BREAK]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 4 December 2018. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS3-WRITING-MODES]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 10 December 2019. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 26 August 2021. WD. URL: https://www.w3.org/TR/cssom-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

비규범적 참고 문헌

[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 4. 4 May 2022. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS3UI]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 21 June 2018. REC. URL: https://www.w3.org/TR/css-ui-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/

속성 색인

Name Value Initial Applies to Inh. %ages Anim­ation type Canonical order Com­puted value
align-content flex-start | flex-end | center | space-between | space-around | stretch stretch multi-line flex containers no n/a discrete per grammar specified keyword
align-items flex-start | flex-end | center | baseline | stretch stretch flex containers no n/a discrete per grammar specified keyword
align-self auto | flex-start | flex-end | center | baseline | stretch auto flex items no n/a discrete per grammar specified keyword
flex none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] 0 1 auto flex items no see individual properties by computed value type per grammar see individual properties
flex-basis content | <'width'> auto flex items no relative to the flex container’s inner main size by computed value type per grammar specified keyword or a computed <length-percentage> value
flex-direction row | row-reverse | column | column-reverse row flex containers no n/a discrete per grammar specified keyword
flex-flow <'flex-direction'> || <'flex-wrap'> see individual properties see individual properties see individual properties see individual properties see individual properties per grammar see individual properties
flex-grow <number [0,∞]> 0 flex items no n/a by computed value type per grammar specified number
flex-shrink <number [0,∞]> 1 flex items no n/a number per grammar specified value
flex-wrap nowrap | wrap | wrap-reverse nowrap flex containers no n/a discrete per grammar specified keyword
justify-content flex-start | flex-end | center | space-between | space-around flex-start flex containers no n/a discrete per grammar specified keyword

이슈 색인

웹 호환 알고리즘이 준비되면, 여기에 개요를 작성합니다. [Issue #8884]