1. 소개
이 섹션은 규범적이지 않습니다.
CSS 2.1은 네 가지 레이아웃 모드를 정의했습니다 — 박스의 형제 및 조상 박스와의 관계에 따라 박스의 크기와 위치를 결정하는 알고리즘입니다:
-
블록 레이아웃, 문서 레이아웃에 적합
-
인라인 레이아웃, 텍스트 레이아웃에 적합
-
테이블 레이아웃, 2차원 데이터를 표 형식으로 배치
-
포지셔닝 레이아웃, 다른 요소와의 관계를 크게 고려하지 않고 명시적으로 배치
이 모듈은 새로운 레이아웃 모드인 플렉스 레이아웃을 도입합니다. 이는 보다 복잡한 애플리케이션과 웹페이지 레이아웃을 위해 설계되었습니다.
1.1. 개요
이 섹션은 규범적이지 않습니다.
플렉스 레이아웃은 표면적으로 블록 레이아웃과 비슷합니다. 플렉스 레이아웃에서는 float나 column과 같이 블록 레이아웃에서 사용되는 복잡한 텍스트 중심 또는 문서 중심 속성이 많이 없습니다. 대신에 플렉스는 공간 분배와 콘텐츠 정렬을 위한 간단하고 강력한 도구를 제공하여 웹 앱과 복잡한 웹페이지에서 자주 필요한 기능을 제공합니다. 플렉스 컨테이너의 내용은 다음과 같습니다:
-
어떤 플로우 방향으로든 배치될 수 있습니다 (왼쪽, 오른쪽, 아래, 심지어 위쪽도 가능!)
-
디스플레이 순서를 반전하거나 'order|재배열'할 수 있습니다. (즉, 시각적 순서가 소스 및 음성 순서와 독립적일 수 있음)
-
단일 (메인) 축을 따라 선형으로 배치하거나, 보조 (래핑) 축을 따라 여러 줄로 배치할 수 있습니다 (크로스 축)
-
“플렉스” 크기로 사용 가능한 공간에 대응할 수 있습니다
-
카탈로그는 플렉스 레이아웃을 사용해 항목의 행을 수평으로 배치하고, 행의 항목들이 모두 같은 높이가 되도록 합니다. 각 항목은 자체적으로 컬럼 플렉스 컨테이너로, 내부 콘텐츠를 수직으로 배치합니다.
-
각 항목 내에서는 원본 문서 콘텐츠가 논리적으로 정렬되어 제목이 먼저 나오고 그 다음에 설명과 사진이 나옵니다. 이는 음성 렌더링이나 CSS를 지원하지 않는 브라우저에서 적합한 순서를 제공합니다. 더 매력적인 시각적 표현을 위해 order를 사용하여 이미지를 콘텐츠 내 뒤쪽에서 위쪽으로 끌어올리고, align-self로 이미지를 수평 중앙에 배치합니다.
-
구매 버튼 위에 auto 마진을 주어 버튼을 각 항목 박스의 하단으로 밀어줍니다. 이는 항목 설명의 높이에 관계없이 동작합니다.
#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 아트만 인쇄 가능.
- 종이와 잉크는 포함되지 않음.
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. 플렉스 레이아웃 박스 모델과 용어
플렉스 컨테이너는 요소가 display가 flex 또는 inline-flex로 계산된 경우 생성되는 박스입니다. 플렉스 컨테이너의 플로우 내 자식은 플렉스 아이템이라 하며 플렉스 레이아웃 모델로 배치됩니다.
블록과 인라인 레이아웃은 블록 및 인라인 플로우 방향에 편향되어 레이아웃 계산이 이루어지지만, 플렉스 레이아웃은 플렉스 방향에 편향되어 있습니다. 플렉스 레이아웃을 설명하기 쉽게, 이 섹션에서는 플렉스 플로우 기준 용어를 정의합니다. flex-flow 값과 writing mode가 이러한 용어들이 물리적 방향(상/우/하/좌), 축(수직/수평), 크기(너비/높이)에 어떻게 매핑되는지를 결정합니다.
- 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. 플렉스 컨테이너: flex 및 inline-flex display 값
- flex
-
이 값은 요소가 플렉스 컨테이너 박스를
생성하게 하며,
플로우 레이아웃에 배치될 때 블록 레벨이 됩니다.
테스트
- baseline-synthesis-001.html (실시간 테스트) (source)
- baseline-synthesis-002.html (실시간 테스트) (source)
- baseline-synthesis-003.html (실시간 테스트) (source)
- baseline-synthesis-004.html (실시간 테스트) (source)
- baseline-synthesis-vert-lr-line-under.html (실시간 테스트) (source)
- display-flex-001.htm (실시간 테스트) (source)
- dynamic-change-simplified-layout-002.html (실시간 테스트) (source)
- dynamic-change-simplified-layout.html (실시간 테스트) (source)
- fixedpos-video-in-abspos-quirk-crash.html (실시간 테스트) (source)
- flexbox_flex-0-0-0.html (실시간 테스트) (source)
- flexbox_flex-0-0-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-0-0-1-unitless-basis.html (실시간 테스트) (source)
- flexbox_flex-0-0-auto.html (실시간 테스트) (source)
- flexbox_flex-0-0-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-0.html (실시간 테스트) (source)
- flexbox_flex-0-0-N.html (실시간 테스트) (source)
- flexbox_flex-0-0-Npercent.html (실시간 테스트) (source)
- flexbox_flex-0-0-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-0-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-0-N-unitless-basis.html (실시간 테스트) (source)
- flexbox_flex-0-1-0.html (실시간 테스트) (source)
- flexbox_flex-0-1-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-0-1-1-unitless-basis.html (실시간 테스트) (source)
- flexbox_flex-0-1-auto.html (실시간 테스트) (source)
- flexbox_flex-0-1-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-1.html (실시간 테스트) (source)
- flexbox_flex-0-1-N.html (실시간 테스트) (source)
- flexbox_flex-0-1-Npercent.html (실시간 테스트) (source)
- flexbox_flex-0-1-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-1-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-1-N-unitless-basis.html (실시간 테스트) (source)
- flexbox_flex-0-auto.html (실시간 테스트) (source)
- flexbox_flex-0-N-0.html (실시간 테스트) (source)
- flexbox_flex-0-N-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-0-N-auto.html (실시간 테스트) (source)
- flexbox_flex-0-N-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-N.html (실시간 테스트) (source)
- flexbox_flex-0-N-N.html (실시간 테스트) (source)
- flexbox_flex-0-N-Npercent.html (실시간 테스트) (source)
- flexbox_flex-0-N-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-0-N-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-0-0.html (실시간 테스트) (source)
- flexbox_flex-1-0-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-1-0-auto.html (실시간 테스트) (source)
- flexbox_flex-1-0-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-0.html (실시간 테스트) (source)
- flexbox_flex-1-0-N.html (실시간 테스트) (source)
- flexbox_flex-1-0-Npercent.html (실시간 테스트) (source)
- flexbox_flex-1-0-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-0-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-1-0.html (실시간 테스트) (source)
- flexbox_flex-1-1-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-1-1-auto.html (실시간 테스트) (source)
- flexbox_flex-1-1-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-1.html (실시간 테스트) (source)
- flexbox_flex-1-1-N.html (실시간 테스트) (source)
- flexbox_flex-1-1-Npercent.html (실시간 테스트) (source)
- flexbox_flex-1-1-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-1-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-N-0.html (실시간 테스트) (source)
- flexbox_flex-1-N-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-1-N-auto.html (실시간 테스트) (source)
- flexbox_flex-1-N-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-N.html (실시간 테스트) (source)
- flexbox_flex-1-N-N.html (실시간 테스트) (source)
- flexbox_flex-1-N-Npercent.html (실시간 테스트) (source)
- flexbox_flex-1-N-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-1-N-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-0-0.html (실시간 테스트) (source)
- flexbox_flex-N-0-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-N-0-auto.html (실시간 테스트) (source)
- flexbox_flex-N-0-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-0.html (실시간 테스트) (source)
- flexbox_flex-N-0-N.html (실시간 테스트) (source)
- flexbox_flex-N-0-Npercent.html (실시간 테스트) (source)
- flexbox_flex-N-0-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-0-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-1-0.html (실시간 테스트) (source)
- flexbox_flex-N-1-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-N-1-auto.html (실시간 테스트) (source)
- flexbox_flex-N-1-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-1.html (실시간 테스트) (source)
- flexbox_flex-N-1-N.html (실시간 테스트) (source)
- flexbox_flex-N-1-Npercent.html (실시간 테스트) (source)
- flexbox_flex-N-1-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-1-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-N-0.html (실시간 테스트) (source)
- flexbox_flex-N-N-0-unitless.html (실시간 테스트) (source)
- flexbox_flex-N-N-auto.html (실시간 테스트) (source)
- flexbox_flex-N-N-auto-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-N.html (실시간 테스트) (source)
- flexbox_flex-N-N-N.html (실시간 테스트) (source)
- flexbox_flex-N-N-Npercent.html (실시간 테스트) (source)
- flexbox_flex-N-N-Npercent-shrink.html (실시간 테스트) (source)
- flexbox_flex-N-N-N-shrink.html (실시간 테스트) (source)
- flexbox_flex-formatting-interop.html (실시간 테스트) (source)
- flexbox_generated-flex.html (실시간 테스트) (source)
- flexbox_generated.html (실시간 테스트) (source)
- flexbox_generated-nested-flex.html (실시간 테스트) (source)
- flexbox-iframe-intrinsic-size-001.html (실시간 테스트) (source)
- flexbox_item-bottom-float.html (실시간 테스트) (source)
- flexbox_item-clear.html (실시간 테스트) (source)
- flexbox_item-float.html (실시간 테스트) (source)
- flexbox_item-top-float.html (실시간 테스트) (source)
- flexbox_item-vertical-align.html (실시간 테스트) (source)
- flexbox_block.html (실시간 테스트) (source)
- flexbox_box-clear.html (실시간 테스트) (source)
- flexbox_display.html (실시간 테스트) (source)
- flexbox_fbfc2.html (실시간 테스트) (source)
- flexbox_fbfc.html (실시간 테스트) (source)
- flexbox_nested-flex.html (실시간 테스트) (source)
- flexbox-root-node-001a.html (실시간 테스트) (source)
- flexbox-root-node-001b.html (실시간 테스트) (source)
- flexbox_stf-fixpos.html (실시간 테스트) (source)
- flexbox_stf-float.html (실시간 테스트) (source)
- flexbox_stf-inline-block.html (실시간 테스트) (source)
- flexbox_stf-table-caption.html (실시간 테스트) (source)
- flexbox_stf-table-cell.html (실시간 테스트) (source)
- flexbox_stf-table.html (실시간 테스트) (source)
- flexbox_stf-table-row-group.html (실시간 테스트) (source)
- flexbox_stf-table-row.html (실시간 테스트) (source)
- flexbox_stf-table-singleline-2.html (실시간 테스트) (source)
- flexbox_stf-table-singleline.html (실시간 테스트) (source)
- flexbox_table-fixed-layout.html (실시간 테스트) (source)
- flexbox-with-multi-column-property.html (실시간 테스트) (source)
- flexbox_computedstyle_display.html (실시간 테스트) (source)
- grid-flex-item-001.html (실시간 테스트) (source)
- grid-flex-item-002.html (실시간 테스트) (source)
- grid-flex-item-003.html (실시간 테스트) (source)
- grid-flex-item-004.html (실시간 테스트) (source)
- grid-flex-item-005.html (실시간 테스트) (source)
- grid-flex-item-006.html (실시간 테스트) (source)
- grid-flex-item-007.html (실시간 테스트) (source)
- flexbox_interactive_flex-transitions.html (manual test) (source)
- flexbox_interactive_order-transitions-2.html (manual test) (source)
- flexbox_interactive_order-transitions.html (manual test) (source)
- nested-flex-image-loading-invalidates-intrinsic-sizes.html (실시간 테스트) (source)
- percentage-margins-001.html (실시간 테스트) (source)
- stretch-after-sibling-size-change.html (실시간 테스트) (source)
- stretched-child-in-nested-flexbox-001.html (실시간 테스트) (source)
- stretched-child-in-nested-flexbox-002.html (실시간 테스트) (source)
- stretched-child-in-nested-flexbox-003.html (실시간 테스트) (source)
- stretched-child-shrink-on-relayout.html (실시간 테스트) (source)
- stretch-flex-item-checkbox-input.html (실시간 테스트) (source)
- stretch-flex-item-radio-input.html (실시간 테스트) (source)
- stretching-orthogonal-flows.html (실시간 테스트) (source)
- table-with-percent-intrinsic-width.html (실시간 테스트) (source)
- inline-flex
-
이 값은 요소가 플렉스 컨테이너 박스를
생성하게 하며,
플로우 레이아웃에 배치될 때 인라인 레벨이 됩니다.
테스트
- flexbox_inline.html (실시간 테스트) (source)
- flex-inline.html (실시간 테스트) (source)
- flexbox_inline-float.html (실시간 테스트) (source)
- inline-flexbox-absurd-block-size-crash.html (실시간 테스트) (source)
- inline-flexbox-wrap-vertically-width-calculation.html (실시간 테스트) (source)
- inline-flex-editing-crash.html (실시간 테스트) (source)
- inline-flex-editing-with-updating-text-crash.html (실시간 테스트) (source)
- inline-flex-frameset-main-axis-crash.html (실시간 테스트) (source)
- inline-flex.html (실시간 테스트) (source)
- inline-flex-min-content-height.html (실시간 테스트) (source)
- flexbox_computedstyle_display-inline.html (실시간 테스트) (source)
- intrinsic-width-orthogonal-writing-mode.html (실시간 테스트) (source)
플렉스 컨테이너는 그 내용에 대해 새로운 플렉스 포매팅 컨텍스트를 생성합니다. 이는 블록 포매팅 컨텍스트를 생성하는 것과 동일하지만, 블록 레이아웃 대신 플렉스 레이아웃이 사용됩니다. 예를 들어, 플롯(float)이 플렉스 컨테이너 안으로 침범하지 않으며, 플렉스 컨테이너의 마진이 자식의 마진과 병합되지 않습니다. 플렉스 컨테이너는 블록 컨테이너와 정확히 동일하게 자식에 대한 포함 블록을 형성합니다. [CSS2] overflow 속성은 플렉스 컨테이너에 적용됩니다.
테스트
- flexbox-overflow-horiz-001.html (실시간 테스트) (source)
- flexbox-overflow-horiz-002.html (실시간 테스트) (source)
- flexbox-overflow-horiz-003.html (실시간 테스트) (source)
- flexbox-overflow-horiz-004.html (실시간 테스트) (source)
- flexbox-overflow-horiz-005.html (실시간 테스트) (source)
- flexbox-overflow-padding-001.html (실시간 테스트) (source)
- flexbox-overflow-padding-002.html (실시간 테스트) (source)
- flexbox-overflow-vert-001.html (실시간 테스트) (source)
- flexbox-overflow-vert-002.html (실시간 테스트) (source)
- flexbox-overflow-vert-003.html (실시간 테스트) (source)
- flexbox-overflow-vert-004.html (실시간 테스트) (source)
- flexbox-overflow-vert-005.html (실시간 테스트) (source)
- flexbox_rowspan-overflow-automatic.html (실시간 테스트) (source)
- flexbox_rowspan-overflow.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-001.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-002.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-003.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-004.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-005.html (실시간 테스트) (source)
- flexbox-safe-overflow-position-006.html (실시간 테스트) (source)
- flexbox_width-overflow.html (실시간 테스트) (source)
- min-size-auto-overflow-clip.html (실시간 테스트) (source)
- negative-overflow-002.html (실시간 테스트) (source)
- negative-overflow-003.html (실시간 테스트) (source)
- negative-overflow.html (실시간 테스트) (source)
- overflow-area-001.html (실시간 테스트) (source)
- overflow-area-002.html (실시간 테스트) (source)
- overflow-area-003.html (실시간 테스트) (source)
- overflow-auto-001.html (실시간 테스트) (source)
- overflow-auto-002.html (실시간 테스트) (source)
- overflow-auto-003.html (실시간 테스트) (source)
- overflow-auto-004.html (실시간 테스트) (source)
- overflow-auto-005.html (실시간 테스트) (source)
- overflow-auto-006.html (실시간 테스트) (source)
- overflow-auto-007.html (실시간 테스트) (source)
- overflow-auto-008.html (실시간 테스트) (source)
- overflow-top-left.html (실시간 테스트) (source)
- padding-overflow.html (실시간 테스트) (source)
- text-overflow-on-flexbox-001.html (실시간 테스트) (source)
- synthesize-vrl-baseline.html (실시간 테스트) (source)
플렉스 컨테이너는 블록 컨테이너가 아니므로, 블록 레이아웃을 전제로 설계된 일부 속성들은 플렉스 레이아웃에서는 적용되지 않습니다. 특히:
-
float와 clear는 flex item에 대해 부동(float) 또는 클리어런스(clearance)를 생성하지 않으며, 플로우에서 제외시키지 않습니다.
-
vertical-align은 플렉스 아이템에 아무런 효과가 없습니다.
-
::first-line 및 ::first-letter 의사 요소는 플렉스 컨테이너에 적용되지 않으며, 플렉스 컨테이너는 조상에게 첫 번째 형식화된 줄 또는 첫 글자를 제공하지 않습니다.
테스트
- align-content-wrap-004.html (실시간 테스트) (source)
- align-items-baseline-column-vert-lr-table-item.html (실시간 테스트) (source)
- align-items-baseline-vert-lr-column-horz-table-item.html (실시간 테스트) (source)
- align-items-baseline-vert-rl-column-horz-table-item.html (실시간 테스트) (source)
- flexbox_box-clear.html (실시간 테스트) (source)
- flexbox_first-letter.html (실시간 테스트) (source)
- flexbox_first-line.html (실시간 테스트) (source)
- flexbox-ignores-first-letter.html (실시간 테스트) (source)
- flexbox_item-vertical-align.html (실시간 테스트) (source)
- flexbox-with-pseudo-elements-001.html (실시간 테스트) (source)
- flexbox-with-pseudo-elements-002.html (실시간 테스트) (source)
- flexbox-with-pseudo-elements-003.html (실시간 테스트) (source)
- flexible-box-float.html (실시간 테스트) (source)
- flex-item-vertical-align.html (실시간 테스트) (source)
- flex-vertical-align-effect.html (실시간 테스트) (source)
- hittest-before-pseudo.html (실시간 테스트) (source)
요소의 지정된 display가 inline-flex인 경우, display 속성은 특정 상황에서 flex로 계산됩니다: CSS 2.1 섹션 9.7의 표에는 "Specified Value" 열에 inline-flex, "Computed Value" 열에 flex가 추가된 행이 포함됩니다.
4. 플렉스 아이템
대략적으로, 플렉스 아이템은 플렉스 컨테이너의 플로우 내 컨텐츠를 나타내는 박스입니다.
플렉스 컨테이너의 플로우 내 자식 각각은 플렉스 아이템이 되며, 자식 텍스트 시퀀스는 익명 블록 컨테이너 플렉스 아이템으로 감싸집니다. 하지만 전체 텍스트 시퀀스가 문서 공백 문자만 포함한다면(즉, white-space 속성에 의해 영향을 받을 수 있는 문자), 해당 텍스트는 렌더링되지 않으며(텍스트 노드가 display:none인 것과 동일하게 처리됨)입니다.
테스트
- anonymous-block.html (실시간 테스트) (source)
- anonymous-flex-item-001.html (실시간 테스트) (source)
- anonymous-flex-item-002.html (실시간 테스트) (source)
- anonymous-flex-item-003.html (실시간 테스트) (source)
- anonymous-flex-item-004.html (실시간 테스트) (source)
- anonymous-flex-item-005.html (실시간 테스트) (source)
- anonymous-flex-item-006.html (실시간 테스트) (source)
- canvas-dynamic-change-001.html (실시간 테스트) (source)
- column-flex-child-with-max-width.html (실시간 테스트) (source)
- flexbox-whitespace-handling-001a.xhtml (실시간 테스트) (source)
- flexbox-whitespace-handling-001b.xhtml (실시간 테스트) (source)
- flexbox-whitespace-handling-002.xhtml (실시간 테스트) (source)
- hittest-anonymous-box.html (실시간 테스트) (source)
- percentage-descendant-of-anonymous-flex-item.html (실시간 테스트) (source)
- percentage-size-subitems-001.html (실시간 테스트) (source)
- whitespace-in-flexitem-001.html (실시간 테스트) (source)
플렉스 아이템 예시:
< 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 >
요소 사이의 공백은 사라집니다: 자체적으로 플렉스 아이템이 되지 않으며, 요소 사이의 텍스트가 익명 플렉스 아이템으로 감싸지더라도 마찬가지입니다.
또한 익명 아이템의 박스는 스타일을 지정할 수 없습니다. 해당 박스에 스타일 규칙을 지정할 요소가 없기 때문입니다. 하지만 그 내용은 플렉스 컨테이너로부터(예: 폰트 설정 등) 스타일을 상속받습니다.
플렉스 아이템은 그 내용에 대해 독립적인 포매팅 컨텍스트를 생성합니다. 하지만, 플렉스 아이템 자체는 플렉스 레벨 박스이며, 블록 레벨 박스가 아닙니다: 이들은 컨테이너의 플렉스 포매팅 컨텍스트에 참여하며, 블록 포매팅 컨텍스트에는 참여하지 않습니다.
참고: 이 명세를 읽는 저자는 아래 박스 생성 및 정적 위치 세부사항 부분을 건너뛰고 싶을 수 있습니다.
계산된 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 크기 계산에 포함됩니다. 하지만 width와 height처럼, flex 롱핸드 속성도 테이블 박스에 다음과 같이 적용됩니다: 플렉스 아이템의 최종 크기는 테이블 래퍼 박스의 엣지와 테이블 박스의 컨텐츠 엣지 사이 거리가 모두 테이블 박스의 border+padding 영역으로 간주되고, 테이블 박스가 플렉스 아이템인 것처럼 레이아웃을 수행하여 계산됩니다.
4.1. 절대 위치 플렉스 자식
플로우 외에 있기 때문에, 플렉스 컨테이너의 절대 위치 자식은 플렉스 레이아웃에 참여하지 않습니다.
플렉스 컨테이너의 절대 위치 자식의 교차 축에서의 static-position 사각형의 엣지는 컨테이너의 컨텐츠 엣지가 됩니다. static-position 사각형의 메인 축 엣지는 해당 자식이 플렉스 컨테이너의 유일한 플렉스 아이템이라고 가정할 때 자식의 마진 엣지가 위치할 곳입니다. 이때 자식과 플렉스 컨테이너 모두 사용된 크기의 박스라고 가정합니다. (이 목적을 위해 자식의 auto 마진은 0으로 간주합니다.)
테스트
- abspos-autopos-htb-ltr.html (실시간 테스트) (source)
- abspos-autopos-htb-rtl.html (실시간 테스트) (source)
- abspos-autopos-vlr-ltr.html (실시간 테스트) (source)
- abspos-autopos-vlr-rtl.html (실시간 테스트) (source)
- abspos-autopos-vrl-ltr.html (실시간 테스트) (source)
- abspos-autopos-vrl-rtl.html (실시간 테스트) (source)
- dynamic-align-self-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-safe-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-safe-003.html (실시간 테스트) (source)
- abspos-descendent-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-content-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-003.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-004.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-005.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-006.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-007.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-008.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-rtl-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-rtl-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-rtl-003.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-rtl-004.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-safe-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-vertWM-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-vertWM-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-vertWM-003.html (실시간 테스트) (source)
- flex-abspos-staticpos-align-self-vertWM-004.html (실시간 테스트) (source)
- flex-abspos-staticpos-fallback-justify-content-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-003.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-004.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-005.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-006.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-007.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-008.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-rtl-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-rtl-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-vertWM-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-content-vertWM-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-justify-self-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-margin-001.html (실시간 테스트) (source)
- flex-abspos-staticpos-margin-002.html (실시간 테스트) (source)
- flex-abspos-staticpos-margin-003.html (실시간 테스트) (source)
- flexbox_absolute-atomic.html (실시간 테스트) (source)
- flexbox-abspos-child-001a.html (실시간 테스트) (source)
- flexbox-abspos-child-001b.html (실시간 테스트) (source)
- flexbox-abspos-child-002.html (실시간 테스트) (source)
- flexbox_inline-abspos.html (실시간 테스트) (source)
- position-absolute-001.html (실시간 테스트) (source)
- position-absolute-002.html (실시간 테스트) (source)
- position-absolute-003.html (실시간 테스트) (source)
- position-absolute-004.html (실시간 테스트) (source)
- position-absolute-005.html (실시간 테스트) (source)
- position-absolute-006.html (실시간 테스트) (source)
- position-absolute-007.html (실시간 테스트) (source)
- position-absolute-008.html (실시간 테스트) (source)
- position-absolute-009.html (실시간 테스트) (source)
- position-absolute-010.html (실시간 테스트) (source)
- position-absolute-011.html (실시간 테스트) (source)
- position-absolute-012.html (실시간 테스트) (source)
- position-absolute-013.html (실시간 테스트) (source)
- position-absolute-014.html (실시간 테스트) (source)
- position-absolute-015.html (실시간 테스트) (source)
- position-absolute-containing-block-001.html (실시간 테스트) (source)
- position-absolute-containing-block-002.html (실시간 테스트) (source)
- flex-content-alignment-with-abspos-001.html (실시간 테스트) (source)
- dynamic-grid-flex-abspos.html (실시간 테스트) (source)
- flexbox_stf-abspos.html (실시간 테스트) (source)
- flex-item-position-relative-001.html (실시간 테스트) (source)
4.2. 플렉스 아이템의 마진 및 패딩
플렉스 아이템의 백분율 마진 및 패딩은, 블록 박스와 마찬가지로, 그 포함 블록의 인라인 크기를 기준으로 계산됩니다. 예를 들어, 좌/우/상/하 백분율 모두가 포함 블록의 너비를 기준으로 수평 쓰기 모드에서 계산됩니다.
auto 마진은 해당 차원의 여분의 공간을 흡수하도록 확장됩니다. 정렬에 사용할 수 있으며, 인접한 플렉스 아이템을 서로 밀어낼 수도 있습니다. auto 마진으로 정렬하기를 참고하세요.
테스트
4.3. 플렉스 아이템 Z-정렬
플렉스 아이템은 인라인 블록과 완전히 동일하게 페인팅됩니다 [CSS2], 단 order로 변경된 문서 순서가 원본 문서 순서 대신 사용되며, z-index 값이 auto가 아닌 경우, position이 static이더라도 스태킹 컨텍스트를 생성합니다 (마치 position이 relative인 것처럼 동작합니다).
참고: 플렉스 아이템 바깥에 위치된 후손도 플렉스 아이템이 생성한 스태킹 컨텍스트에 계속 참여합니다.
테스트
- flexbox-paint-ordering-001.xhtml (실시간 테스트) (source)
- flexbox-paint-ordering-002.xhtml (실시간 테스트) (source)
- flexbox-paint-ordering-003.html (실시간 테스트) (source)
- flex-item-z-ordering-001.html (실시간 테스트) (source)
- flex-item-z-ordering-002.html (실시간 테스트) (source)
- flexbox-items-as-stacking-contexts-001.xhtml (실시간 테스트) (source)
- flexbox-items-as-stacking-contexts-002.html (실시간 테스트) (source)
- flexbox-items-as-stacking-contexts-003.html (실시간 테스트) (source)
- hittest-overlapping-margin.html (실시간 테스트) (source)
- hittest-overlapping-order.html (실시간 테스트) (source)
- hittest-overlapping-relative.html (실시간 테스트) (source)
4.4. 축소된 아이템
visibility:collapse를 플렉스 아이템에 지정하면, 해당 아이템은 축소된 플렉스 아이템이 되어, visibility:collapse가 테이블 행이나 테이블 열에 적용될 때와 유사한 효과를 냅니다: 축소된 플렉스 아이템은 렌더링에서 완전히 제거되지만, 플렉스 라인의 교차 크기를 안정적으로 유지하는 "스트럿"을 남깁니다. 따라서 플렉스 컨테이너에 플렉스 라인이 하나만 있을 경우, 아이템을 동적으로 축소하거나 축소 해제하면 플렉스 컨테이너의 메인 크기가 변경될 수 있지만, 교차 크기에는 영향을 주지 않으며 페이지 레이아웃이 "흔들리는" 현상이 발생하지 않습니다. 플렉스 라인 래핑은 축소 후에 다시 수행되므로, 여러 라인을 가진 플렉스 컨테이너의 교차 크기는 변할 수도 있고 변하지 않을 수도 있습니다.
축소된 플렉스 아이템은 렌더링되지 않더라도, 포매팅 구조에는 나타납니다. 따라서 display:none 아이템과 달리 [CSS2], 박스가 포매팅 구조에 나타나야 동작하는 효과(카운터 증가, 애니메이션 및 트랜지션 실행 등)는 축소된 아이템에도 계속 적용됩니다.
테스트
@media ( min-width:60 em ) { /* 충분한 공간이 있을 때만 두 열 레이아웃 (기본 텍스트 크기 기준) */ div{ display : flex; } #main{ flex : 1 ; /* Main은 남은 공간을 모두 차지함 */ order:1 ; /* 네비게이션 오른쪽에 배치 */ min-width:12 em ; /* 메인 콘텐츠 영역 크기 최적화 */ } } /* 메뉴 아이템에 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-width와 min-height 속성의 새로운 초기값입니다. 이 키워드는 이전에는 이 명세에서 정의되었으나, 이제 CSS Sizing 모듈에서 정의됩니다.
보다 합리적인 기본 최소 크기를 플렉스 아이템에 제공하기 위해, 메인 축의 자동 최소 크기의 사용 값은 플렉스 아이템의 계산된 overflow 값이 스크롤 불가일 때 콘텐츠 기반 최소 크기가 됩니다; 스크롤 컨테이너의 경우 자동 최소 크기는 평소처럼 0입니다.
콘텐츠 기반 최소 크기는 플렉스 아이템이 대체 요소인지 아닌지에 따라 다릅니다:
- 대체 요소의 경우
-
콘텐츠 크기 제안과 이동된 크기 제안 중 더 작은 값을 사용하고(존재하는 경우), 지정된 크기 제안(존재하는 경우)로 상한을 둡니다.
- 비대체 요소의 경우
-
콘텐츠 크기 제안과 이동된 크기 제안(존재하는 경우) 중 더 큰 값을 사용하고, 지정된 크기 제안(존재하는 경우)로 상한을 둡니다.
두 경우 모두, 크기는 최대 메인 크기가 명확하다면 그 값으로 제한(clamp)됩니다.
이 계산에 사용되는 콘텐츠 크기 제안, 지정된 크기 제안, 이동된 크기 제안은 관련된 min/max/선호 크기 속성을 고려하여 콘텐츠 기반 최소 크기가 작성자가 제공한 제약조건을 침범하지 않도록 하며, 아래와 같이 정의됩니다:
- 지정된 크기 제안
- 아이템의 선호 메인 크기가 명확하고 자동이 아니라면, 지정된 크기 제안은 그 크기가 됩니다. 그렇지 않으면 정의되지 않습니다.
- 이동된 크기 제안
- 아이템에 선호하는 종횡비가 있고 선호 교차 크기가 명확하다면, 이동된 크기 제안은 그 크기( 최소와 최대 교차 크기가 명확하다면 그 값으로 제한됨 )을 종횡비로 변환한 값입니다. 그렇지 않으면 정의되지 않습니다.
- 콘텐츠 크기 제안
- 콘텐츠 크기 제안은 min-content 크기의 메인 축에서의 값이며, 선호하는 종횡비가 있다면 명확한 최소 및 최대 교차 크기로 변환하여 제한됩니다.
테스트
- content-height-with-scrollbars.html (실시간 테스트) (source)
- fieldset-as-item-dynamic.html (실시간 테스트) (source)
- fieldset-as-item-overflow.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-001.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-002.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-003.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-004.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-005.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-006.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-007.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-008.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-009.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-010.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-011.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-012.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-013.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-014.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-015.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-016.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-017.html (실시간 테스트) (source)
- flex-aspect-ratio-img-column-018.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-001.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-002.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-003.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-004.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-005.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-006.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-007.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-008.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-009.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-010.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-011.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-012.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-013.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-014.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-015.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-016.html (실시간 테스트) (source)
- flex-aspect-ratio-img-row-017.html (실시간 테스트) (source)
- flex-aspect-ratio-img-vert-lr.html (실시간 테스트) (source)
- flexbox-definite-cross-size-constrained-percentage.html (실시간 테스트) (source)
- flexbox-min-height-auto-001.html (실시간 테스트) (source)
- flexbox-min-height-auto-002a.html (실시간 테스트) (source)
- flexbox-min-height-auto-002b.html (실시간 테스트) (source)
- flexbox-min-height-auto-002c.html (실시간 테스트) (source)
- flexbox-min-height-auto-003.html (실시간 테스트) (source)
- flexbox-min-height-auto-004.html (실시간 테스트) (source)
- flexbox-min-width-auto-001.html (실시간 테스트) (source)
- flexbox-min-width-auto-002a.html (실시간 테스트) (source)
- flexbox-min-width-auto-002b.html (실시간 테스트) (source)
- flexbox-min-width-auto-002c.html (실시간 테스트) (source)
- flexbox-min-width-auto-003.html (실시간 테스트) (source)
- flexbox-min-width-auto-004.html (실시간 테스트) (source)
- flexbox-min-width-auto-005.html (실시간 테스트) (source)
- flexbox-min-width-auto-006.html (실시간 테스트) (source)
- flex-item-compressible-001.html (실시간 테스트) (source)
- flex-item-compressible-002.html (실시간 테스트) (source)
- flexitem-stretch-image.html (실시간 테스트) (source)
- flexitem-stretch-range.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-001.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-002.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-003.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-004.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-005.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-006.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-007.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-008.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-009.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-010.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-011.xht (실시간 테스트) (source)
- flex-minimum-height-flex-items-012.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-013.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-014.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-015.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-016.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-017.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-018.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-019.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-020.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-021.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-022.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-023.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-024.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-025.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-026.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-027.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-028.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-029.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-030.html (실시간 테스트) (source)
- flex-minimum-height-flex-items-031.html (실시간 테스트) (source)
- flex-minimum-size-001.html (실시간 테스트) (source)
- flex-minimum-size-002.html (실시간 테스트) (source)
- flex-minimum-size-003.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-001.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-002.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-003.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-004.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-005.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-006.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-007.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-008.xht (실시간 테스트) (source)
- flex-minimum-width-flex-items-009.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-010.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-011.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-012.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-013.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-014.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-015.html (실시간 테스트) (source)
- flex-minimum-width-flex-items-016.html (실시간 테스트) (source)
- flexbox_computedstyle_min-auto-size.html (실시간 테스트) (source)
- flexbox_computedstyle_min-height-auto.html (실시간 테스트) (source)
- flexbox_computedstyle_min-width-auto.html (실시간 테스트) (source)
- select-element-zero-height-001.html (실시간 테스트) (source)
- select-element-zero-height-002.html (실시간 테스트) (source)
참고: 콘텐츠 기반 최소 크기는 내재적 크기 기여의 한 종류이므로, CSS Sizing 3 § 5.2 내재적 기여의 순환 백분율 규정이 적용됩니다.
박스의 내재적 크기를 계산할 때(예: 박스의 min-content 크기), 콘텐츠 기반 최소 크기는 해당 축에서 박스 크기를 불확정(indefinite)하게 만듭니다 (예를 들어 width 속성이 확정된 크기를 지정하더라도). 즉, 이 크기를 기준으로 계산되는 백분율은 auto로 동작하게 됩니다.
내재적 크기 계산 이외의 목적에서는, 콘텐츠 기반 최소 크기는(명시적 min-content/등의 최소 크기와 달리) 박스의 크기를 불확정으로 만들지 않습니다. 다만, 이 최소 크기가 적용되기 이전 박스 크기를 기준으로 계산된 백분율이 있다면, 반드시 최소 크기 적용 후의 새로운 크기에 맞게 다시 계산되어야 합니다.
특히, 문서의 주요 콘텐츠 영역에 플렉스 크기를 사용하는 경우, min-width: 12em처럼 명시적인 폰트 상대 최소 너비를 지정하는 것이 더 좋습니다. 콘텐츠 기반 최소 너비는 큰 표나 이미지를 전체 콘텐츠 영역이 넘치도록 늘려, 텍스트 줄이 불필요하게 길어지고 읽기 어려워질 수 있습니다.
또한, 콘텐츠 기반 크기를 많은 콘텐츠가 있는 아이템에 사용하면, 레이아웃 엔진이 최소 크기를 찾기 전 모든 콘텐츠를 탐색해야 하지만, 작성자가 명시적으로 최소값을 지정하면 이 과정이 불필요합니다. (콘텐츠가 적은 아이템의 경우에는 이 탐색이 사소하므로 성능상 문제가 되지 않습니다.)
테스트
- aspect-ratio-intrinsic-size-001.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-002.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-003.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-004.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-005.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-006.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-007.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-008.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-009.html (실시간 테스트) (source)
- aspect-ratio-intrinsic-size-010.html (실시간 테스트) (source)
- aspect-ratio-transferred-max-size.html (실시간 테스트) (source)
- flex-item-content-is-min-width-max-content.html (실시간 테스트) (source)
5. 정렬 및 방향
플렉스 컨테이너의 내용은 어떤 방향으로든, 어떤 순서로든 배치될 수 있습니다. 이를 통해 저자는 이전에는 복잡하거나 불안정한 방법이 필요했던 효과를 손쉽게 구현할 수 있습니다. 예를 들어 float 및 clear 속성을 사용하는 해킹 방식 등이 있습니다. 이러한 기능은 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-start와 main-end 방향은 각각 현재 inline-start 및 inline-end
방향과 동일합니다.
이 모든 것은 현재 writing mode 기준입니다.
테스트
- flex-child-percent-basis-resize-1.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001b.html (실시간 테스트) (source)
- flexbox-flex-direction-row.htm (실시간 테스트) (source)
- flexbox_justifycontent-left-001.html (실시간 테스트) (source)
- flexbox-writing-mode-010.html (실시간 테스트) (source)
- flexbox-writing-mode-011.html (실시간 테스트) (source)
- flexbox-writing-mode-012.html (실시간 테스트) (source)
- flexbox-writing-mode-016.html (실시간 테스트) (source)
- percentage-size.html (실시간 테스트) (source)
- row-reverse
-
row와 동일하지만,
main-start와 main-end 방향이 서로 뒤바뀝니다.
테스트
- flexbox_direction-row-reverse.html (실시간 테스트) (source)
- flexbox-mbp-horiz-001-reverse.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-001-rtl-reverse.xhtml (실시간 테스트) (source)
- multi-line-wrap-with-row-reverse.html (실시간 테스트) (source)
- flexbox_justifycontent-right-001.html (실시간 테스트) (source)
- flexbox_justifycontent-start.html (실시간 테스트) (source)
- flexbox_justifycontent-start-rtl.html (실시간 테스트) (source)
- column
-
플렉스 컨테이너의 main axis는 현재 block axis와 동일한 방향을 가집니다.
main-start와 main-end 방향은 각각 현재 block-start 및 block-end 방향과
동일합니다.
이 모든 것은 현재 writing mode 기준입니다.
테스트
- columns-height-set-via-top-bottom.html (실시간 테스트) (source)
- dynamic-bsize-change.html (실시간 테스트) (source)
- flexbox_direction-column.html (실시간 테스트) (source)
- flexbox_direction-column-reverse.html (실시간 테스트) (source)
- flexbox_rtl-flow.html (실시간 테스트) (source)
- flex-column-relayout-assert.html (실시간 테스트) (source)
- flex-item-max-height-min-content.html (실시간 테스트) (source)
- flex-item-transferred-sizes-padding-border-sizing.html (실시간 테스트) (source)
- flex-item-transferred-sizes-padding-content-sizing.html (실시간 테스트) (source)
- flex-outer-flexbox-column-recalculate-height-on-resize-001.html (실시간 테스트) (source)
- image-nested-within-definite-column-flexbox.html (실시간 테스트) (source)
- layout-with-inline-svg-001.html (실시간 테스트) (source)
- nested-orthogonal-flexbox-relayout.html (실시간 테스트) (source)
- percentage-max-width-cross-axis.html (실시간 테스트) (source)
- percentage-size.html (실시간 테스트) (source)
- column-reverse
- column과 동일하지만, main-start와 main-end 방향이 서로 뒤바뀝니다.
참고: reverse 값은 박스의 순서를 뒤집지 않습니다. writing-mode 및 direction [CSS3-WRITING-MODES]와 같이, 흐름의 방향만 변경됩니다. 페인팅 순서, 음성 순서, 그리고 순차 탐색 순서는 영향을 받지 않습니다.
참고: justify-content의 값에 따라, flex-direction의 reverse 값이 flex containers이자 scroll containers의 초기 스크롤 위치에 영향을 줄 수 있습니다. 자세한 내용은 CSS Box Alignment 3 § 5.3 Alignment Overflow and Scroll Containers를 참고하세요.
테스트
- discrete-no-interpolation.html (실시간 테스트) (source)
- change-column-flex-width.html (실시간 테스트) (source)
- column-flex-child-with-max-width.html (실시간 테스트) (source)
- column-flex-child-with-overflow-scroll.html (실시간 테스트) (source)
- cross-axis-scrollbar.html (실시간 테스트) (source)
- dynamic-orthogonal-flex-item.html (실시간 테스트) (source)
- flexbox-writing-mode-001.html (실시간 테스트) (source)
- flexbox-writing-mode-002.html (실시간 테스트) (source)
- flexbox-writing-mode-003.html (실시간 테스트) (source)
- flexbox-writing-mode-004.html (실시간 테스트) (source)
- flexbox-writing-mode-005.html (실시간 테스트) (source)
- flexbox-writing-mode-006.html (실시간 테스트) (source)
- flexbox-writing-mode-007.html (실시간 테스트) (source)
- flexbox-writing-mode-008.html (실시간 테스트) (source)
- flexbox-writing-mode-009.html (실시간 테스트) (source)
- flexbox-writing-mode-010.html (실시간 테스트) (source)
- flexbox-writing-mode-011.html (실시간 테스트) (source)
- flexbox-writing-mode-012.html (실시간 테스트) (source)
- flexbox-writing-mode-013.html (실시간 테스트) (source)
- flexbox-writing-mode-014.html (실시간 테스트) (source)
- flexbox-writing-mode-015.html (실시간 테스트) (source)
- flexbox-writing-mode-016.html (실시간 테스트) (source)
- flexbox-writing-mode-slr.html (실시간 테스트) (source)
- flexbox-writing-mode-slr-row-mix.html (실시간 테스트) (source)
- flexbox-writing-mode-slr-rtl.html (실시간 테스트) (source)
- flexbox-writing-mode-srl.html (실시간 테스트) (source)
- flexbox-writing-mode-srl-row-mix.html (실시간 테스트) (source)
- flexbox-writing-mode-srl-rtl.html (실시간 테스트) (source)
- flexbox_object.html (실시간 테스트) (source)
- flexbox_writing_mode_vertical_lays_out_contents_from_top_to_bottom.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-direction-column.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-direction-column-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-direction-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-direction-row.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-direction-row-reverse.html (실시간 테스트) (source)
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-wrap이 wrap-reverse일 때는 cross-start와 cross-end 방향이 서로 뒤바뀝니다.
참고: align-content의 값에 따라, wrap-reverse 값의 flex-wrap이 flex containers이자 scroll containers의 초기 스크롤 위치에 영향을 줄 수 있습니다. 자세한 내용은 CSS Box Alignment 3 § 5.3 Alignment Overflow and Scroll Containers를 참고하세요.
테스트
- discrete-no-interpolation.html (실시간 테스트) (source)
- flexbox-flex-wrap-default.htm (실시간 테스트) (source)
- flexbox-flex-wrap-flexing-002.html (실시간 테스트) (source)
- flexbox-flex-wrap-flexing-003.html (실시간 테스트) (source)
- flexbox-flex-wrap-flexing.html (실시간 테스트) (source)
- flexbox-flex-wrap-horiz-001.html (실시간 테스트) (source)
- flexbox-flex-wrap-horiz-002.html (실시간 테스트) (source)
- flexbox-flex-wrap-nowrap.htm (실시간 테스트) (source)
- flexbox-flex-wrap-vert-001.html (실시간 테스트) (source)
- flexbox-flex-wrap-vert-002.html (실시간 테스트) (source)
- flexbox-flex-wrap-wrap.htm (실시간 테스트) (source)
- flexbox-flex-wrap-wrap-reverse.htm (실시간 테스트) (source)
- flexbox_rowspan.html (실시간 테스트) (source)
- flexbox_rtl-flow.html (실시간 테스트) (source)
- flexbox_rtl-flow-reverse.html (실시간 테스트) (source)
- flexbox_rtl-order.html (실시간 테스트) (source)
- flex-box-wrap.html (실시간 테스트) (source)
- flexbox_wrap.html (실시간 테스트) (source)
- flexbox_wrap-long.html (실시간 테스트) (source)
- flexbox_wrap-reverse.html (실시간 테스트) (source)
- multi-line-wrap-reverse-column-reverse.html (실시간 테스트) (source)
- multi-line-wrap-reverse-row-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-wrap-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-wrap-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-wrap-wrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-wrap-wrap-reverse.html (실시간 테스트) (source)
- multiline-min-preferred-width.html (실시간 테스트) (source)
- multiline-reverse-wrap-baseline.html (실시간 테스트) (source)
5.3. 플렉스 방향 및 감싸기: flex-flow 단축 속성
이름: | flex-flow |
---|---|
값: | <'flex-direction'> || <'flex-wrap'> |
초기값: | 각 개별 속성 참고 |
적용 대상: | 각 개별 속성 참고 |
상속 여부: | 각 개별 속성 참고 |
백분율: | 각 개별 속성 참고 |
계산된 값: | 각 개별 속성 참고 |
애니메이션 타입: | 각 개별 속성 참고 |
정규 순서: | 문법에 따름 |
테스트
- box-sizing-001.html (실시간 테스트) (source)
- button-column-wrap-crash.html (실시간 테스트) (source)
- column-intrinsic-size-aspect-ratio-crash.html (실시간 테스트) (source)
- css-flexbox-row.html (실시간 테스트) (source)
- css-flexbox-row-reverse.html (실시간 테스트) (source)
- css-flexbox-row-reverse-wrap.html (실시간 테스트) (source)
- css-flexbox-row-reverse-wrap-reverse.html (실시간 테스트) (source)
- css-flexbox-row-wrap.html (실시간 테스트) (source)
- css-flexbox-row-wrap-reverse.html (실시간 테스트) (source)
- css-flexbox-test1.html (실시간 테스트) (source)
- flexbox-flex-direction-column.htm (실시간 테스트) (source)
- flexbox-flex-direction-column-percentage-ignored.html (실시간 테스트) (source)
- flexbox-flex-direction-column-reverse.htm (실시간 테스트) (source)
- flexbox-flex-direction-default.htm (실시간 테스트) (source)
- flexbox-flex-direction-row.htm (실시간 테스트) (source)
- flexbox-flex-direction-row-reverse.htm (실시간 테스트) (source)
- flex-direction-column-001-visual.html (visual test) (source)
- flex-direction-column.html (실시간 테스트) (source)
- flex-direction-column-overlap-001.html (실시간 테스트) (source)
- flex-direction-column-reverse-001-visual.html (visual test) (source)
- flex-direction-column-reverse-002-visual.html (visual test) (source)
- flex-direction-column-reverse.html (실시간 테스트) (source)
- flex-direction.html (실시간 테스트) (source)
- flex-direction-modify.html (실시간 테스트) (source)
- flex-direction-row-001-visual.html (visual test) (source)
- flex-direction-row-002-visual.html (visual test) (source)
- flex-direction-row-reverse-001-visual.html (visual test) (source)
- flex-direction-row-reverse-002-visual.html (visual test) (source)
- flex-direction-row-reverse.html (실시간 테스트) (source)
- flex-direction-row-vertical.html (실시간 테스트) (source)
- flex-direction-with-element-insert.html (실시간 테스트) (source)
- flexbox-flex-flow-001.html (실시간 테스트) (source)
- flexbox-flex-flow-002.html (실시간 테스트) (source)
- flexbox_flow-column-reverse-wrap.html (실시간 테스트) (source)
- flexbox_flow-column-reverse-wrap-reverse.html (실시간 테스트) (source)
- flexbox_flow-column-wrap.html (실시간 테스트) (source)
- flexbox_flow-column-wrap-reverse.html (실시간 테스트) (source)
- flexbox_flow-row-wrap.html (실시간 테스트) (source)
- flexbox_flow-row-wrap-reverse.html (실시간 테스트) (source)
- flex-flow-001.html (실시간 테스트) (source)
- flex-flow-002.html (실시간 테스트) (source)
- flex-flow-003.html (실시간 테스트) (source)
- flex-flow-004.html (실시간 테스트) (source)
- flex-flow-005.html (실시간 테스트) (source)
- flex-flow-006.html (실시간 테스트) (source)
- flex-flow-007.html (실시간 테스트) (source)
- flex-flow-008.html (실시간 테스트) (source)
- flex-flow-009.html (실시간 테스트) (source)
- flex-flow-010.html (실시간 테스트) (source)
- flex-flow-011.html (실시간 테스트) (source)
- flex-flow-012.html (실시간 테스트) (source)
- flex-flow-013.html (실시간 테스트) (source)
- flex-wrap-002.html (실시간 테스트) (source)
- flex-wrap-003.html (실시간 테스트) (source)
- flex-wrap-004.html (실시간 테스트) (source)
- flex-wrap-005.html (실시간 테스트) (source)
- flex-wrap-006.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-reverse-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-reverse-wrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-wrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-column-wrap-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-reverse-nowrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-reverse-wrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-reverse-wrap-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-wrap.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-row-wrap-reverse.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-flow-wrap.html (실시간 테스트) (source)
- multiline-column-max-height.html (실시간 테스트) (source)
- flex-direction-computed.html (실시간 테스트) (source)
- flex-direction-invalid.html (실시간 테스트) (source)
- flex-direction-valid.html (실시간 테스트) (source)
- flex-flow-computed.html (실시간 테스트) (source)
- flex-flow-invalid.html (실시간 테스트) (source)
- flex-flow-shorthand.html (실시간 테스트) (source)
- flex-flow-valid.html (실시간 테스트) (source)
- flex-wrap-computed.html (실시간 테스트) (source)
- flex-wrap-invalid.html (실시간 테스트) (source)
- flex-wrap-valid.html (실시간 테스트) (source)
flex-flow 속성은 flex-direction과 flex-wrap 속성을 한 번에 설정하는 단축 속성으로, 이 두 속성은 플렉스 컨테이너의 메인 축과 교차 축을 함께 정의합니다.
div | |
div | |
div |
영어 | 일본어 |
---|---|
|
|
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를 논리적 순서 변경에 사용하는 스타일 시트는 비준수입니다.
<!DOCTYPE html> < header > ...</ header > < main > < article > ...</ article > < nav > ...</ nav > < aside > ...</ aside > </ main > < footer > ...</ footer >
이 레이아웃은 플렉스 레이아웃으로 손쉽게 구현할 수 있습니다:
main{ display : flex; } main > article{ order : 2 ; min-width : 12 em ; flex : 1 ; } main > nav{ order : 1 ; width : 200 px ; } main > aside{ order : 3 ; width : 200 px ; }
추가로, 컬럼들은 기본적으로 동일 높이로 맞춰지며, 메인 콘텐츠는 화면을 채우는 만큼의 너비를 가지게 됩니다. 또한, 미디어 쿼리를 활용해 화면이 좁을 때 전체를 세로 레이아웃으로 바꿀 수도 있습니다:
@media all and( max-width:600 px ) { /* 세 컬럼을 지원하기엔 너무 좁음 */ main{ flex-flow : column; } main > article, main > nav, main > aside{ /* 문서 순서로 복귀 */ order:0 ; width : auto; } }
(다중 줄 플렉스 컨테이너를 더 활용해 보다 지능적인 감싸기를 구현하는 것은 독자에게 남깁니다.)
6. 플렉스 줄(Flex Lines)
플렉스 아이템은 플렉스 컨테이너 내에서 플렉스 줄에 따라 배치되고 정렬됩니다. 이는 레이아웃 알고리즘에서 그룹화와 정렬을 위해 사용하는 가상의 컨테이너입니다. 플렉스 컨테이너는 단일 줄이거나 다중 줄일 수 있으며, 이는 flex-wrap 속성에 따라 결정됩니다:
-
단일 줄 플렉스 컨테이너 (flex-wrap: nowrap을 사용하는 경우) 모든 자식 요소를 한 줄에 배치하며, 이로 인해 내용이 넘칠 수 있습니다.
-
다중 줄 플렉스 컨테이너 (flex-wrap: wrap 또는 flex-wrap: wrap-reverse을 사용하는 경우) 플렉스 아이템을 여러 줄로 나누어 배치합니다. 이는 텍스트가 너무 넓어 한 줄에 다 못 들어갈 때 새 줄로 넘어가는 방식과 유사합니다. 추가 줄이 생성되면, 교차 축 방향에 따라 플렉스 컨테이너에 쌓입니다. 모든 줄에는 최소한 하나의 플렉스 아이템이 포함되며, 플렉스 컨테이너가 완전히 비어 있지 않은 한 줄은 반드시 존재합니다.
#flex{ display : flex; flex-flow : row wrap; width : 300 px ; } .item{ width : 80 px ; }
< 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는 영향을 주지 않습니다. 줄의 메인 크기는 항상 플렉스 컨테이너의 콘텐츠 박스 메인 크기와 동일합니다.
테스트
- align-content-001.htm (실시간 테스트) (source)
- align-content-002.htm (실시간 테스트) (source)
- align-content-003.htm (실시간 테스트) (source)
- align-content-004.htm (실시간 테스트) (source)
- align-content-005.htm (실시간 테스트) (source)
- align-content-006.htm (실시간 테스트) (source)
- align-content-007.htm (실시간 테스트) (source)
- flexbox-lines-must-be-stretched-by-default.html (실시간 테스트) (source)
7. 유연성(Flexibility)
플렉스 레이아웃의 핵심은 플렉스 아이템을 "flex"하게 만들어, main dimension에서 사용 가능한 공간을 채우도록 너비/높이를 조정하는 기능입니다. 이는 flex 속성으로 구현됩니다. 플렉스 컨테이너는 남는 공간을 아이템에 분배할 때(각 아이템의 flex grow factor에 비례) 컨테이너를 채우고, 또는 넘침을 방지하기 위해(각 아이템의 flex shrink factor에 비례) 아이템 크기를 줄입니다.
플렉스 아이템은 완전히 유연하지 않음 상태일 때, flex-grow와 flex-shrink 값이 모두 0이면 그렇고, 그렇지 않으면 유연함입니다.
7.1. flex 단축 속성
이름: | flex |
---|---|
값: | none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] |
초기값: | 0 1 auto |
적용 대상: | flex items |
상속 여부: | no |
백분율: | 각 개별 속성 참고 |
계산된 값: | 각 개별 속성 참고 |
애니메이션 타입: | 계산된 값 타입에 따라 다름 |
정규 순서: | 문법에 따름 |
테스트
- flexbox-dyn-resize-001.html (실시간 테스트) (source)
- flex-item-max-width-min-content.html (실시간 테스트) (source)
- flex-item-min-height-min-content.html (실시간 테스트) (source)
- flex-item-min-width-min-content.html (실시간 테스트) (source)
- flex-shorthand-calc.html (실시간 테스트) (source)
- flex-computed.html (실시간 테스트) (source)
- flex-invalid.html (실시간 테스트) (source)
- flex-shorthand.html (실시간 테스트) (source)
- flex-valid.html (실시간 테스트) (source)
flex 속성은 유연한 크기를 구성하는 요소들을 지정합니다: flex 계수 (성장 및 축소) 그리고 flex 기준값입니다. 박스가 플렉스 아이템일 때, flex는 메인 크기 속성 대신 박스의 메인 크기를 결정하는 데 사용됩니다. 박스가 플렉스 아이템이 아니면 flex는 아무런 영향을 주지 않습니다.
참고: flex 롱핸드의 초기값은 flex: 0 1 auto와 동일합니다. 이는 flex 단축 속성에서 생략했을 때의 기본값(실질적으로 1 1 0px)과 다르며, flex 단축 속성이 가장 일반적인 경우를 더 잘 처리할 수 있도록 설계된 것입니다.
- <'flex-grow'>
-
이 <number
[0,∞]> 요소는 flex-grow 롱핸드를 설정하며,
flex 성장 계수를 지정합니다.
이는 플렉스 아이템이
flex 컨테이너 내에서 다른 플렉스 아이템에 비해
양의 여유 공간이 분배될 때 얼마나 성장할지 결정합니다.
생략 시 1로 설정됩니다.
테스트
- flex-grow-interpolation.html (실시간 테스트) (source)
- flex-001.htm (실시간 테스트) (source)
- flex-003.htm (실시간 테스트) (source)
- flex-grow-001.xht (실시간 테스트) (source)
- flex-grow-002.html (실시간 테스트) (source)
- flex-grow-003.html (실시간 테스트) (source)
- flex-grow-004.html (실시간 테스트) (source)
- flex-grow-005.html (실시간 테스트) (source)
- flex-grow-006.html (실시간 테스트) (source)
- flex-grow-007.html (실시간 테스트) (source)
- flex-grow-008.html (실시간 테스트) (source)
- flexbox_flex-natural.html (실시간 테스트) (source)
- flexbox_flex-natural-mixed-basis-auto.html (실시간 테스트) (source)
- flexbox_flex-natural-mixed-basis.html (실시간 테스트) (source)
- flexbox_flex-natural-variable-auto-basis.html (실시간 테스트) (source)
- flexbox_flex-natural-variable-zero-basis.html (실시간 테스트) (source)
- flexbox_flex-none.html (실시간 테스트) (source)
- flexbox_flex-none-wrappable-content.html (실시간 테스트) (source)
- flex-factor-less-than-one.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-0-auto.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-auto.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-initial.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-none.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shorthand-number.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-number.html (실시간 테스트) (source)
- flexbox_interactive_flex-grow-transitions.html (manual test) (source)
- flex-grow-computed.html (실시간 테스트) (source)
- flex-grow-invalid.html (실시간 테스트) (source)
- flex-grow-valid.html (실시간 테스트) (source)
- table-item-flex-percentage-min-width.html (실시간 테스트) (source)
- table-item-flex-percentage-width.html (실시간 테스트) (source)
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을 사용하는 것이 좋습니다; 예를 들어 1과 2를 사용하는 것이 .33과 .67을 사용하는 것보다 아이템이 추가, 삭제되거나 줄 바꿈이 발생할 때 의도대로 동작할 가능성이 높습니다.
- <'flex-shrink'>
-
이 <number
[0,∞]> 요소는 flex-shrink 롱핸드를 설정하며,
flex 축소 계수를 지정합니다.
이는 플렉스 아이템이
flex 컨테이너 내에서 다른 플렉스 아이템에 비해
음의 여유 공간이 분배될 때 얼마나 축소될지 결정합니다.
생략 시 1로 설정됩니다.
테스트
- flex-shrink-interpolation.html (실시간 테스트) (source)
- flex-002.htm (실시간 테스트) (source)
- flex-004.htm (실시간 테스트) (source)
- flex-factor-less-than-one.html (실시간 테스트) (source)
- flex-shrink-001.html (실시간 테스트) (source)
- flex-shrink-002.html (실시간 테스트) (source)
- flex-shrink-003.html (실시간 테스트) (source)
- flex-shrink-004.html (실시간 테스트) (source)
- flex-shrink-005.html (실시간 테스트) (source)
- flex-shrink-006.html (실시간 테스트) (source)
- flex-shrink-007.html (실시간 테스트) (source)
- flex-shrink-008.html (실시간 테스트) (source)
- flex-shrink-large-value-crash.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-number.html (실시간 테스트) (source)
- flexbox_interactive_flex-shrink-transitions.html (manual test) (source)
- flexbox_interactive_flex-shrink-transitions-invalid.html (manual test) (source)
- flex-shrink-computed.html (실시간 테스트) (source)
- flex-shrink-invalid.html (실시간 테스트) (source)
- flex-shrink-valid.html (실시간 테스트) (source)
- table-item-flex-percentage-min-width.html (실시간 테스트) (source)
- table-item-flex-percentage-width.html (실시간 테스트) (source)
참고: flex shrink factor는 음수 공간을 분배할 때 flex base size와 곱해집니다. 이는 각 아이템이 얼마나 줄어들 수 있는지에 비례하여 음수 공간을 분배하므로, 예를 들어 작은 아이템이 큰 아이템이 눈에 띄게 줄어들기 전에 0이 되지 않도록 합니다.
- <'flex-basis'>
-
이 구성 요소는 flex-basis 롱핸드를 설정하며,
flex
기준값을 지정합니다:
메인 크기의 초기값을 플렉스 아이템에 대해 지정하며,
flex 계수에 따라 남는 공간이 분배되기 전의 크기입니다.
테스트
- flex-basis-composition.html (실시간 테스트) (source)
- flex-basis-content-crash.html (실시간 테스트) (source)
- flex-basis-interpolation.html (실시간 테스트) (source)
- dynamic-isize-change-001.html (실시간 테스트) (source)
- dynamic-isize-change-002.html (실시간 테스트) (source)
- dynamic-isize-change-003.html (실시간 테스트) (source)
- dynamic-isize-change-004.html (실시간 테스트) (source)
- flex-basis-001.html (실시간 테스트) (source)
- flex-basis-002.html (실시간 테스트) (source)
- flex-basis-003.html (실시간 테스트) (source)
- flex-basis-004.html (실시간 테스트) (source)
- flex-basis-005.html (실시간 테스트) (source)
- flex-basis-006.html (실시간 테스트) (source)
- flex-basis-007.html (실시간 테스트) (source)
- flex-basis-008.html (실시간 테스트) (source)
- flex-basis-009.html (실시간 테스트) (source)
- flex-basis-010.html (실시간 테스트) (source)
- flex-basis-011.html (실시간 테스트) (source)
- flex-basis-012.html (실시간 테스트) (source)
- flex-basis-013.html (실시간 테스트) (source)
- flex-basis-intrinsics-001.html (실시간 테스트) (source)
- flex-basis-item-margins-001.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-002a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-002b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-003a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-003b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-004a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-004b.html (실시간 테스트) (source)
- flexbox_flex-basis.html (실시간 테스트) (source)
- flexbox_flex-basis-shrink.html (실시간 테스트) (source)
- flex-one-sets-flex-basis-to-zero-px.html (실시간 테스트) (source)
- flex-shorthand-flex-basis-middle.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-0percent.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-auto.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-percent.html (실시간 테스트) (source)
- flexbox_interactive_flex-basis-transitions.html (manual test) (source)
- flex-basis-computed.html (실시간 테스트) (source)
- flex-basis-invalid.html (실시간 테스트) (source)
- flex-basis-valid.html (실시간 테스트) (source)
- table-as-item-percent-width-cell-001.html (실시간 테스트) (source)
<'flex-basis'>는 width 및 height 속성과 동일한 값을 허용합니다 (auto는 다르게 처리됨) 그리고 content 키워드도 허용됩니다:
- auto
- 플렉스 아이템에 지정되면, auto 키워드는 메인 크기 속성의 값을 실제 flex-basis로 가져옵니다. 그 값 자체가 auto라면, 실제 값은 content가 됩니다.
- content
-
컨텐츠 기반 자동 크기를 의미하며,
플렉스 아이템의 컨텐츠를 기준으로 합니다.
(일반적으로 max-content 크기와 동일하지만,
선호 비율,
고유 크기 제약,
교차 흐름 등을 보정합니다;
자세한 내용은 § 9 Flex Layout Algorithm을
참고하세요.)
참고: 이 값은 Flexible Box Layout 초판에는 없었으며, 때문에 일부 오래된 구현에서는 지원되지 않을 수 있습니다. 같은 효과는 auto와 메인 크기(width 또는 height)를 auto로 지정하면 얻을 수 있습니다.
- <'width'>
- 그 외 값들은 flex-basis가 width 및 height와 동일하게 해석됩니다.
flex 단축 속성에서 생략된 경우, 지정값은 0입니다.
- none
- none 키워드는 0 0 auto로 확장됩니다.
단위 없는 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-grow-interpolation.html (실시간 테스트) (source)
- flex-001.htm (실시간 테스트) (source)
- flex-003.htm (실시간 테스트) (source)
- flex-grow-001.xht (실시간 테스트) (source)
- flex-grow-002.html (실시간 테스트) (source)
- flex-grow-003.html (실시간 테스트) (source)
- flex-grow-004.html (실시간 테스트) (source)
- flex-grow-005.html (실시간 테스트) (source)
- flex-grow-006.html (실시간 테스트) (source)
- flex-grow-007.html (실시간 테스트) (source)
- flex-grow-008.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-grow-number.html (실시간 테스트) (source)
- flexbox_interactive_flex-grow-transitions.html (manual test) (source)
- flex-grow-computed.html (실시간 테스트) (source)
- flex-grow-invalid.html (실시간 테스트) (source)
- flex-grow-valid.html (실시간 테스트) (source)
저자는 flex 단축 속성을 사용해 유연성을 제어하는 것이 권장됩니다. flex-grow 속성을 직접 사용하는 것보다, 단축 속성이 지정되지 않은 구성 요소를 올바르게 초기화하여 일반적인 사용 사례에 적합하게 동작하기 때문입니다.
flex-grow 속성은 flex 성장 계수를 제공된 <number> 값으로 설정합니다. 음수 값은 허용되지 않습니다.
7.2.2. flex-shrink 속성
이름: | flex-shrink |
---|---|
값: | <number [0,∞]> |
초기값: | 1 |
적용 대상: | flex items |
상속 여부: | no |
백분율: | 해당 없음 |
계산된 값: | 지정된 값 |
정규 순서: | 문법에 따름 |
애니메이션 타입: | number |
테스트
- flex-shrink-interpolation.html (실시간 테스트) (source)
- flex-002.htm (실시간 테스트) (source)
- flex-004.htm (실시간 테스트) (source)
- flex-shrink-001.html (실시간 테스트) (source)
- flex-shrink-002.html (실시간 테스트) (source)
- flex-shrink-003.html (실시간 테스트) (source)
- flex-shrink-004.html (실시간 테스트) (source)
- flex-shrink-005.html (실시간 테스트) (source)
- flex-shrink-006.html (실시간 테스트) (source)
- flex-shrink-007.html (실시간 테스트) (source)
- flex-shrink-008.html (실시간 테스트) (source)
- flex-shrink-large-value-crash.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-shrink-number.html (실시간 테스트) (source)
- flexbox_interactive_flex-shrink-transitions.html (manual test) (source)
- flexbox_interactive_flex-shrink-transitions-invalid.html (manual test) (source)
- flex-shrink-computed.html (실시간 테스트) (source)
- flex-shrink-invalid.html (실시간 테스트) (source)
- flex-shrink-valid.html (실시간 테스트) (source)
저자는 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-basis-composition.html (실시간 테스트) (source)
- flex-basis-content-crash.html (실시간 테스트) (source)
- flex-basis-interpolation.html (실시간 테스트) (source)
- dynamic-isize-change-001.html (실시간 테스트) (source)
- dynamic-isize-change-002.html (실시간 테스트) (source)
- dynamic-isize-change-003.html (실시간 테스트) (source)
- dynamic-isize-change-004.html (실시간 테스트) (source)
- flex-basis-001.html (실시간 테스트) (source)
- flex-basis-002.html (실시간 테스트) (source)
- flex-basis-003.html (실시간 테스트) (source)
- flex-basis-004.html (실시간 테스트) (source)
- flex-basis-005.html (실시간 테스트) (source)
- flex-basis-006.html (실시간 테스트) (source)
- flex-basis-007.html (실시간 테스트) (source)
- flex-basis-008.html (실시간 테스트) (source)
- flex-basis-009.html (실시간 테스트) (source)
- flex-basis-010.html (실시간 테스트) (source)
- flex-basis-011.html (실시간 테스트) (source)
- flex-basis-012.html (실시간 테스트) (source)
- flex-basis-013.html (실시간 테스트) (source)
- flex-basis-intrinsics-001.html (실시간 테스트) (source)
- flex-basis-item-margins-001.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-001b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-002a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-002b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-003a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-003b.html (실시간 테스트) (source)
- flexbox-flex-basis-content-004a.html (실시간 테스트) (source)
- flexbox-flex-basis-content-004b.html (실시간 테스트) (source)
- flexbox_flex-basis.html (실시간 테스트) (source)
- flexbox_flex-basis-shrink.html (실시간 테스트) (source)
- flex-one-sets-flex-basis-to-zero-px.html (실시간 테스트) (source)
- flex-shorthand-flex-basis-middle.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-0.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-0percent.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-auto.html (실시간 테스트) (source)
- flexbox_computedstyle_flex-basis-percent.html (실시간 테스트) (source)
- flexbox_interactive_flex-basis-transitions.html (manual test) (source)
- flex-basis-computed.html (실시간 테스트) (source)
- flex-basis-invalid.html (실시간 테스트) (source)
- flex-basis-valid.html (실시간 테스트) (source)
저자는 flex 단축 속성을 사용해 유연성을 제어하는 것을 권장합니다. flex-basis 속성을 직접 사용하기보다는, 단축 속성이 지정되지 않은 구성 요소를 올바르게 초기화해 일반적인 사용 사례에 적합하게 동작하기 때문입니다.
flex-basis 속성은 flex 기준값을 설정합니다. 이 속성은 width와 height 속성과 동일한 값, 그리고 content도 허용합니다.
auto와 content를 제외한 모든 값에 대해(위에서 정의됨), 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 마진은 0으로 취급됩니다.
-
justify-content 및 align-self로 정렬하기 전에, 해당 방향의 양의 남는 공간이 auto 마진에 분배됩니다.
-
오버플로우되는 박스는 auto 마진을 무시하고 end 방향으로 넘칩니다.
테스트
- auto-height-column-with-border-and-padding.html (실시간 테스트) (source)
- auto-height-with-flex.html (실시간 테스트) (source)
- auto-margins-001.html (실시간 테스트) (source)
- auto-margins-002.html (실시간 테스트) (source)
- auto-margins-003.html (실시간 테스트) (source)
- flexbox-margin-auto-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-margin-auto-horiz-002.xhtml (실시간 테스트) (source)
- flexbox_margin-auto.html (실시간 테스트) (source)
- flexbox_margin-auto-overflow.html (실시간 테스트) (source)
참고: 남는 공간이 auto 마진에 분배되면, 정렬 속성은 해당 방향에서 효과가 없습니다. 왜냐하면 마진이 flexing 후 남은 모든 공간을 가져가기 때문입니다.
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 >
8.2. 축 정렬: justify-content 속성
이름: | justify-content |
---|---|
값: | flex-start | flex-end | center | space-between | space-around |
초기값: | flex-start |
적용 대상: | flex containers |
상속 여부: | no |
백분율: | 해당 없음 |
계산된 값: | 지정된 키워드 |
정규 순서: | 문법에 따름 |
애니메이션 타입: | 불연속 |
테스트
- dynamic-isize-change-001.html (실시간 테스트) (source)
- dynamic-isize-change-002.html (실시간 테스트) (source)
- dynamic-isize-change-003.html (실시간 테스트) (source)
- dynamic-isize-change-004.html (실시간 테스트) (source)
- flexbox_justifycontent-center.html (실시간 테스트) (source)
- flexbox_justifycontent-center-overflow.html (실시간 테스트) (source)
- flexbox_justifycontent-end.html (실시간 테스트) (source)
- flexbox_justifycontent-end-rtl.html (실시간 테스트) (source)
- flexbox_justifycontent-flex-end.html (실시간 테스트) (source)
- flexbox_justifycontent-flex-start.html (실시간 테스트) (source)
- flexbox-justify-content-horiz-001a.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-001b.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-002.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-003.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-004.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-005.xhtml (실시간 테스트) (source)
- flexbox-justify-content-horiz-006.xhtml (실시간 테스트) (source)
- flexbox_justifycontent-left-001.html (실시간 테스트) (source)
- flexbox_justifycontent-left-002.html (실시간 테스트) (source)
- flexbox_justifycontent-right-001.html (실시간 테스트) (source)
- flexbox_justifycontent-right-002.html (실시간 테스트) (source)
- flexbox_justifycontent-rtl-001.html (실시간 테스트) (source)
- flexbox_justifycontent-rtl-002.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound-negative.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound-only.html (실시간 테스트) (source)
- flexbox_justifycontent-spacebetween.html (실시간 테스트) (source)
- flexbox_justifycontent-spacebetween-negative.html (실시간 테스트) (source)
- flexbox_justifycontent-spacebetween-only.html (실시간 테스트) (source)
- flexbox_justifycontent-start.html (실시간 테스트) (source)
- flexbox_justifycontent-start-rtl.html (실시간 테스트) (source)
- flexbox_justifycontent-stretch.html (실시간 테스트) (source)
- flexbox-justify-content-vert-001a.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-001b.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-002.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-003.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-004.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-005.xhtml (실시간 테스트) (source)
- flexbox-justify-content-vert-006.xhtml (실시간 테스트) (source)
- flexbox-justify-content-wmvert-001.xhtml (실시간 테스트) (source)
- flexbox-justify-content-wmvert-002.html (실시간 테스트) (source)
- flexbox-justify-content-wmvert-003.html (실시간 테스트) (source)
- flexbox_margin.html (실시간 테스트) (source)
- flexbox_margin-left-ex.html (실시간 테스트) (source)
- flexbox_computedstyle_justify-content-center.html (실시간 테스트) (source)
- flexbox_computedstyle_justify-content-flex-end.html (실시간 테스트) (source)
- flexbox_computedstyle_justify-content-flex-start.html (실시간 테스트) (source)
- flexbox_computedstyle_justify-content-space-around.html (실시간 테스트) (source)
- flexbox_computedstyle_justify-content-space-between.html (실시간 테스트) (source)
- justify-content-001.htm (실시간 테스트) (source)
- justify-content-002.htm (실시간 테스트) (source)
- justify-content-003.htm (실시간 테스트) (source)
- justify-content-004.htm (실시간 테스트) (source)
- justify-content-005.htm (실시간 테스트) (source)
- justify-content-006.html (실시간 테스트) (source)
- justify-content-007.html (실시간 테스트) (source)
- justify-content_center.html (visual test) (source)
- justify-content_flex-end.html (visual test) (source)
- justify-content_flex-start.html (visual test) (source)
- justify-content-sideways-001.html (실시간 테스트) (source)
- justify-content_space-around.html (visual test) (source)
- justify-content_space-between-001.html (visual test) (source)
- justify-content_space-between-002.html (실시간 테스트) (source)
- scrollbars-auto.html (실시간 테스트) (source)
- scrollbars.html (실시간 테스트) (source)
- scrollbars-no-margin.html (실시간 테스트) (source)
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로 대체됩니다.
그 외에는, 줄의 플렉스 아이템들이
인접한 플렉스 아이템 사이의 간격이 모두 동일하도록 분배되고,
첫/마지막 플렉스 아이템과 플렉스 컨테이너의 엣지 사이의 간격은
아이템 사이 간격의 절반 크기입니다.
테스트
- flexbox-column-row-gap-001.html (실시간 테스트) (source)
- flexbox-column-row-gap-002.html (실시간 테스트) (source)
- flexbox-column-row-gap-003.html (실시간 테스트) (source)
- flexbox-column-row-gap-004.html (실시간 테스트) (source)
- flexbox_columns-flexitems-2.html (실시간 테스트) (source)
- flexbox_columns-flexitems.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound-negative.html (실시간 테스트) (source)
- flexbox_justifycontent-spacearound-only.html (실시간 테스트) (source)
세 가지 색상 아이템으로 구성된 플렉스 컨테이너에서 justify-content의 다섯 키워드와 그 효과를 보여주는 그림입니다.
8.3. 교차 축 정렬: align-items, align-self 속성
이름: | align-items |
---|---|
값: | flex-start | flex-end | center | baseline | stretch |
초기값: | stretch |
적용 대상: | flex containers |
상속 여부: | no |
백분율: | 해당 없음 |
계산된 값: | 지정된 키워드 |
정규 순서: | 문법에 따름 |
애니메이션 타입: | 불연속 |
테스트
- align-items-007.html (실시간 테스트) (source)
- align-items-008.html (실시간 테스트) (source)
- align-items-009.html (실시간 테스트) (source)
- align-items-baseline-column-horz.html (실시간 테스트) (source)
- align-items-baseline-column-vert.html (실시간 테스트) (source)
- align-items-baseline-column-vert-lr-flexbox-item.html (실시간 테스트) (source)
- align-items-baseline-column-vert-lr-grid-item.html (실시간 테스트) (source)
- align-items-baseline-column-vert-lr-items.html (실시간 테스트) (source)
- align-items-baseline-column-vert-lr-table-item.html (실시간 테스트) (source)
- align-items-baseline-column-vert-rl-flexbox-item.html (실시간 테스트) (source)
- align-items-baseline-column-vert-rl-grid-item.html (실시간 테스트) (source)
- align-items-baseline-column-vert-rl-items.html (실시간 테스트) (source)
- align-items-baseline-column-vert-rl-table-item.html (실시간 테스트) (source)
- align-items-baseline-overflow-non-visible.html (실시간 테스트) (source)
- align-items-baseline-row-horz.html (실시간 테스트) (source)
- align-items-baseline-row-vert.html (실시간 테스트) (source)
- align-items-baseline-vert-lr-column-horz-flexbox-item.html (실시간 테스트) (source)
- align-items-baseline-vert-lr-column-horz-grid-item.html (실시간 테스트) (source)
- align-items-baseline-vert-lr-column-horz-items.html (실시간 테스트) (source)
- align-items-baseline-vert-lr-column-horz-table-item.html (실시간 테스트) (source)
- align-items-baseline-vert-rl-column-horz-flexbox-item.html (실시간 테스트) (source)
- align-items-baseline-vert-rl-column-horz-grid-item.html (실시간 테스트) (source)
- align-items-baseline-vert-rl-column-horz-items.html (실시간 테스트) (source)
- align-items-baseline-vert-rl-column-horz-table-item.html (실시간 테스트) (source)
- multiline-align-self.html (실시간 테스트) (source)
- column-flex-child-with-max-width.html (실시간 테스트) (source)
- dynamic-stretch-change.html (실시간 테스트) (source)
- flexbox_align-items-baseline.html (실시간 테스트) (source)
- flexbox_align-items-center-2.html (실시간 테스트) (source)
- flexbox_align-items-center-3.html (실시간 테스트) (source)
- flexbox_align-items-center.html (실시간 테스트) (source)
- flexbox-align-items-center-nested-001.html (실시간 테스트) (source)
- flexbox_align-items-flexend-2.html (실시간 테스트) (source)
- flexbox_align-items-flexend.html (실시간 테스트) (source)
- flexbox_align-items-flexstart-2.html (실시간 테스트) (source)
- flexbox_align-items-flexstart.html (실시간 테스트) (source)
- flexbox_align-items-stretch-2.html (실시간 테스트) (source)
- flexbox_align-items-stretch-3.html (실시간 테스트) (source)
- flexbox_align-items-stretch-4.html (실시간 테스트) (source)
- flexbox_align-items-stretch.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-baseline.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-center.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-flex-end.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-flex-start.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_align-items-stretch.html (실시간 테스트) (source)
- position-relative-percentage-top-001.html (실시간 테스트) (source)
- position-relative-percentage-top-002.html (실시간 테스트) (source)
- position-relative-percentage-top-003.html (실시간 테스트) (source)
- relayout-align-items.html (실시간 테스트) (source)
- stretch-input-in-column.html (실시간 테스트) (source)
- stretch-requires-computed-auto-size.html (실시간 테스트) (source)
- table-as-item-stretch-cross-size-2.html (실시간 테스트) (source)
- table-as-item-stretch-cross-size-3.html (실시간 테스트) (source)
- table-as-item-stretch-cross-size-4.html (실시간 테스트) (source)
- table-as-item-stretch-cross-size-5.html (실시간 테스트) (source)
- table-as-item-stretch-cross-size.html (실시간 테스트) (source)
이름: | align-self |
---|---|
값: | auto | flex-start | flex-end | center | baseline | stretch |
초기값: | auto |
적용 대상: | flex items |
상속 여부: | no |
백분율: | 해당 없음 |
계산된 값: | 지정된 키워드 |
정규 순서: | 문법에 따름 |
애니메이션 타입: | 불연속 |
테스트
- align-self-006.html (visual test) (source)
- align-self-010.html (visual test) (source)
- align-self-013.html (실시간 테스트) (source)
- align-self-014.html (실시간 테스트) (source)
- align-self-015.html (실시간 테스트) (source)
- align-self-016.html (실시간 테스트) (source)
- flexbox_align-self-auto.html (실시간 테스트) (source)
- flexbox-align-self-baseline-compatability.html (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-001a.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-001b.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-002.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-003.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-004.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-005.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-006.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-007.xhtml (실시간 테스트) (source)
- flexbox-align-self-baseline-horiz-008.xhtml (실시간 테스트) (source)
- flexbox_align-self-baseline.html (실시간 테스트) (source)
- flexbox_align-self-center.html (실시간 테스트) (source)
- flexbox_align-self-flexend.html (실시간 테스트) (source)
- flexbox_align-self-flexstart.html (실시간 테스트) (source)
- flexbox-align-self-horiz-001-block.xhtml (실시간 테스트) (source)
- flexbox-align-self-horiz-001-table.xhtml (실시간 테스트) (source)
- flexbox-align-self-horiz-002.xhtml (실시간 테스트) (source)
- flexbox-align-self-horiz-003.xhtml (실시간 테스트) (source)
- flexbox-align-self-horiz-004.xhtml (실시간 테스트) (source)
- flexbox-align-self-horiz-005.xhtml (실시간 테스트) (source)
- flexbox_align-self-stretch.html (실시간 테스트) (source)
- flexbox-align-self-stretch-vert-001.html (실시간 테스트) (source)
- flexbox-align-self-stretch-vert-002.html (실시간 테스트) (source)
- flexbox-align-self-vert-001.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-002.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-003.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-004.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-rtl-001.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-rtl-002.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-rtl-003.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-rtl-004.xhtml (실시간 테스트) (source)
- flexbox-align-self-vert-rtl-005.xhtml (실시간 테스트) (source)
- flexbox_computedstyle_align-self-baseline.html (실시간 테스트) (source)
- flexbox_computedstyle_align-self-center.html (실시간 테스트) (source)
- flexbox_computedstyle_align-self-flex-end.html (실시간 테스트) (source)
- flexbox_computedstyle_align-self-flex-start.html (실시간 테스트) (source)
- flexbox_computedstyle_align-self-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_align-self-stretch.html (실시간 테스트) (source)
플렉스 아이템은 플렉스 컨테이너의 현재 줄에서 교차 축을 따라 정렬될 수 있으며, 이는 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-005.htm (실시간 테스트) (source)
- align-self-004.html (실시간 테스트) (source)
- align-self-005.html (실시간 테스트) (source)
- css-flexbox-height-animation-stretch.html (manual test) (source)
네 가지 색상 아이템이 있는 플렉스 컨테이너에서 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 키워드와 다중 줄 플렉스 컨테이너에서의 효과를 보여주는 그림입니다.
테스트
- align-content_center.html (실시간 테스트) (source)
- align-content_flex-end.html (실시간 테스트) (source)
- align-content_flex-start.html (실시간 테스트) (source)
- align-content-horiz-001a.html (실시간 테스트) (source)
- align-content-horiz-001b.html (실시간 테스트) (source)
- align-content-horiz-002.html (실시간 테스트) (source)
- align-content_space-around.html (실시간 테스트) (source)
- align-content_space-between.html (실시간 테스트) (source)
- align-content_stretch.html (실시간 테스트) (source)
- align-content-vert-001a.html (실시간 테스트) (source)
- align-content-vert-001b.html (실시간 테스트) (source)
- align-content-vert-002.html (실시간 테스트) (source)
- align-content-wmvert-001.html (실시간 테스트) (source)
- align-content-wrap-001.html (실시간 테스트) (source)
- align-content-wrap-002.html (실시간 테스트) (source)
- align-content-wrap-003.html (실시간 테스트) (source)
- align-content-wrap-004.html (실시간 테스트) (source)
- align-content-wrap-005.html (실시간 테스트) (source)
- flex-align-content-center.html (실시간 테스트) (source)
- flex-align-content-end.html (실시간 테스트) (source)
- flex-align-content-space-around.html (실시간 테스트) (source)
- flex-align-content-space-between.html (실시간 테스트) (source)
- flex-align-content-start.html (실시간 테스트) (source)
- flexbox_align-content-center.html (실시간 테스트) (source)
- flexbox_align-content-flexend.html (실시간 테스트) (source)
- flexbox_align-content-flexstart.html (실시간 테스트) (source)
- flexbox_align-content-spacearound.html (실시간 테스트) (source)
- flexbox_align-content-spacebetween.html (실시간 테스트) (source)
- flexbox_align-content-stretch-2.html (실시간 테스트) (source)
- flexbox_align-content-stretch.html (실시간 테스트) (source)
- flexbox_computedstyle_align-content-center.html (실시간 테스트) (source)
- flexbox_computedstyle_align-content-flex-end.html (실시간 테스트) (source)
- flexbox_computedstyle_align-content-flex-start.html (실시간 테스트) (source)
- flexbox_computedstyle_align-content-space-around.html (실시간 테스트) (source)
- flexbox_computedstyle_align-content-space-between.html (실시간 테스트) (source)
8.5. 플렉스 컨테이너 기준선(Baselines)
플렉스 컨테이너가 기준선 정렬에 참여하려면(예: 플렉스 컨테이너 자체가 바깥 플렉스 컨테이너의 플렉스 아이템일 때), 그 컨테이너의 내용을 가장 잘 나타내는 기준선 위치를 제출해야 합니다. 이를 위해 플렉스 컨테이너의 기준선은 다음과 같이 결정됩니다 (order로 재정렬한 후, flex-direction도 고려함):
- first/last 메인 축 기준선 집합
-
인라인 축이 플렉스 컨테이너의 메인 축과 일치할 때,
기준선은 다음과 같이 결정됩니다:
-
플렉스 컨테이너의 플렉스 아이템 중 가장 시작/가장 끝 플렉스 줄에서 기준선 정렬에 참여하는 아이템이 있다면, 플렉스 컨테이너의 first/last 메인 축 기준선 집합은 해당 플렉스 아이템들의 공유 기준선에서 생성됩니다.
-
그렇지 않고 플렉스 컨테이너에 하나 이상의 플렉스 아이템이 있다면, first/last 메인 축 기준선 집합은 가장 시작/가장 끝 플렉스 아이템의 기준선에서 생성됩니다. (그 아이템이 플렉스 컨테이너의 메인 축과 평행한 기준선이 없으면, 테두리 엣지에서 생성됩니다.)
-
그 외에는 플렉스 컨테이너는 first/last 메인 축 기준선 집합이 없으며, 필요하다면 정렬 컨텍스트의 규칙에 따라 생성됩니다.
-
- first/last 교차 축 기준선 집합
- 인라인 축이 플렉스 컨테이너의 교차 축과 일치할 때, 기준선은 다음과 같이 결정됩니다:
위 규칙에 따라 기준선을 계산할 때, 기준선을 제공하는 박스의 overflow 값이 스크롤을 허용한다면, 기준선을 결정하는 목적에서는 박스가 초기 스크롤 위치에 있는 것으로 간주해야 합니다.
테이블 셀의 기준선을 결정할 때, 플렉스 컨테이너는 줄 박스나 테이블-row처럼 기준선을 제공합니다. [CSS2]
기준선에 대한 더 자세한 정보는 CSS Writing Modes 3 § 4.1 기준선 소개 및 CSS Box Alignment 3 § 9 기준선 정렬 세부사항를 참고하세요.
테스트
- flex-align-baseline-001.html (실시간 테스트) (source)
- flex-align-baseline-002.html (실시간 테스트) (source)
- flex-align-baseline-003.html (실시간 테스트) (source)
- flex-align-baseline-004.html (실시간 테스트) (source)
- flex-align-baseline-005.html (실시간 테스트) (source)
- flex-align-baseline-006.html (실시간 테스트) (source)
- flex-align-baseline-007.html (실시간 테스트) (source)
- flex-align-baseline-column-rtl-direction.html (실시간 테스트) (source)
- flex-align-baseline-column-vert-lr-rtl-wrap-reverse.html (실시간 테스트) (source)
- flex-align-baseline-column-vert-rl-rtl-wrap-reverse.html (실시간 테스트) (source)
- flex-align-baseline-fieldset-001.html (실시간 테스트) (source)
- flex-align-baseline-fieldset-002.html (실시간 테스트) (source)
- flex-align-baseline-fieldset-003.html (실시간 테스트) (source)
- flex-align-baseline-flex-001.html (실시간 테스트) (source)
- flex-align-baseline-flex-002.html (실시간 테스트) (source)
- flex-align-baseline-flex-003.html (실시간 테스트) (source)
- flex-align-baseline-flex-004.html (실시간 테스트) (source)
- flex-align-baseline-grid-001.html (실시간 테스트) (source)
- flex-align-baseline-grid-002.html (실시간 테스트) (source)
- flex-align-baseline-grid-003.html (실시간 테스트) (source)
- flex-align-baseline-multicol-001.html (실시간 테스트) (source)
- flex-align-baseline-multicol-002.html (실시간 테스트) (source)
- flex-align-baseline-multicol-003.html (실시간 테스트) (source)
- flex-align-baseline-overflow-001.html (실시간 테스트) (source)
- flex-align-baseline-overflow-002.html (실시간 테스트) (source)
- flex-align-baseline-overflow-003.html (실시간 테스트) (source)
- flex-align-baseline-table-001.html (실시간 테스트) (source)
- flex-align-baseline-table-002.html (실시간 테스트) (source)
- flex-align-baseline-table-003.html (실시간 테스트) (source)
- flexbox-baseline-align-self-baseline-horiz-001.html (실시간 테스트) (source)
- flexbox-baseline-align-self-baseline-vert-001.html (실시간 테스트) (source)
- flexbox-baseline-empty-001a.html (실시간 테스트) (source)
- flexbox-baseline-empty-001b.html (실시간 테스트) (source)
- flexbox-baseline-multi-item-horiz-001a.html (실시간 테스트) (source)
- flexbox-baseline-multi-item-horiz-001b.html (실시간 테스트) (source)
- flexbox-baseline-multi-item-vert-001a.html (실시간 테스트) (source)
- flexbox-baseline-multi-item-vert-001b.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-horiz-001.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-horiz-002.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-horiz-003.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-horiz-004.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-vert-001.html (실시간 테스트) (source)
- flexbox-baseline-multi-line-vert-002.html (실시간 테스트) (source)
- flexbox-baseline-nested-001.html (실시간 테스트) (source)
- flexbox-baseline-single-item-001a.html (실시간 테스트) (source)
- flexbox-baseline-single-item-001b.html (실시간 테스트) (source)
9. 플렉스 레이아웃 알고리즘
이 섹션에는 플렉스 컨테이너와 그 내용의 정확한 레이아웃 동작을 상세히 설명하는 규범적 알고리즘이 포함되어 있습니다. 여기의 알고리즘은 가독성과 이론적 단순성을 최적화하기 위해 작성되었으며, 반드시 가장 효율적인 방법일 필요는 없습니다. 구현체는 원하는 실제 알고리즘을 사용할 수 있지만, 여기서 설명하는 알고리즘과 동일한 결과를 내야 합니다.
참고: 이 섹션은 주로 구현자를 위한 것입니다. 웹 페이지를 작성하는 저자는 개별 속성 설명만 봐도 충분하며, CSS 레이아웃의 심오한 세부사항을 깊이 이해하려는 특별한 욕구가 없다면 이 섹션을 읽을 필요는 없습니다.
다음 섹션에서는 플렉스 컨테이너와 그 내용의 레이아웃 알고리즘을 정의합니다.
참고: 플렉스 레이아웃은 플렉스 아이템을 순서가 수정된 문서 순서로 처리하며, 원래 문서 순서로 처리하지 않습니다.
테스트
- flexbox-basic-block-horiz-001v.xhtml (실시간 테스트) (source)
- flexbox-basic-block-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-block-vert-001v.xhtml (실시간 테스트) (source)
- flexbox-basic-block-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-canvas-horiz-001v.xhtml (실시간 테스트) (source)
- flexbox-basic-canvas-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-canvas-vert-001v.xhtml (실시간 테스트) (source)
- flexbox-basic-canvas-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-fieldset-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-fieldset-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-iframe-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-iframe-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-img-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-img-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-textarea-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-textarea-vert-001.xhtml (실시간 테스트) (source)
- flexbox-basic-video-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-basic-video-vert-001.xhtml (실시간 테스트) (source)
- flexbox-dyn-resize-001.html (실시간 테스트) (source)
- flexbox-mbp-horiz-001-rtl.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-002a.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-002b.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-002v.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-003-reverse.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-003v.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-003.xhtml (실시간 테스트) (source)
- flexbox-mbp-horiz-004.xhtml (실시간 테스트) (source)
- flexbox-sizing-horiz-001.xhtml (실시간 테스트) (source)
- flexbox-sizing-horiz-002.xhtml (실시간 테스트) (source)
- flexbox-sizing-vert-001.xhtml (실시간 테스트) (source)
- flexbox-sizing-vert-002.xhtml (실시간 테스트) (source)
- percentage-max-height-001.html (실시간 테스트) (source)
- percentage-max-height-002.html (실시간 테스트) (source)
- percentage-max-height-003.html (실시간 테스트) (source)
- percentage-max-height-004.html (실시간 테스트) (source)
- percentage-max-height-005.html (실시간 테스트) (source)
- percent-height-flex-items-cross-sizes-with-mutations.html (실시간 테스트) (source)
- table-as-item-auto-min-width.html (실시간 테스트) (source)
- table-as-item-change-cell.html (실시간 테스트) (source)
- table-as-item-fixed-min-width-2.html (실시간 테스트) (source)
- table-as-item-fixed-min-width-3.html (실시간 테스트) (source)
- table-as-item-fixed-min-width.html (실시간 테스트) (source)
- table-as-item-narrow-content-2.html (실시간 테스트) (source)
- table-as-item-narrow-content.html (실시간 테스트) (source)
- table-as-item-specified-height.html (실시간 테스트) (source)
- table-as-item-specified-width.html (실시간 테스트) (source)
- table-as-item-specified-width-vertical.html (실시간 테스트) (source)
9.1. 초기 설정
- 익명 플렉스 아이템 생성 (§ 4 플렉스 아이템 참고)
9.2. 줄 길이 결정
- 플렉스 아이템을 위한 메인 및 교차 공간 결정 각 차원에 대해, 해당 차원의 플렉스 컨테이너 콘텐츠 박스가 확정된 크기면 그 값을 사용; 해당 차원의 플렉스 컨테이너가 최소 또는 최대 컨텐츠 제약 하에서 크기가 결정되고 있다면, 그 제약이 해당 차원의 사용 가능 공간이 됨; 그 외에는 플렉스 컨테이너의 마진, 테두리, 패딩을 플렉스 컨테이너에 주어진 공간에서 빼고 그 값을 사용. 이 값이 무한대가 될 수도 있습니다.
-
각 아이템의 플렉스 기준 크기 및 가상 메인 크기 결정:
테스트
- image-as-flexitem-size-001.html (실시간 테스트) (source)
- image-as-flexitem-size-001v.html (실시간 테스트) (source)
- image-as-flexitem-size-002.html (실시간 테스트) (source)
- image-as-flexitem-size-002v.html (실시간 테스트) (source)
- image-as-flexitem-size-003.html (실시간 테스트) (source)
- image-as-flexitem-size-003v.html (실시간 테스트) (source)
- image-as-flexitem-size-004.html (실시간 테스트) (source)
- image-as-flexitem-size-004v.html (실시간 테스트) (source)
- image-as-flexitem-size-005.html (실시간 테스트) (source)
- image-as-flexitem-size-005v.html (실시간 테스트) (source)
- image-as-flexitem-size-006.html (실시간 테스트) (source)
- image-as-flexitem-size-006v.html (실시간 테스트) (source)
- image-as-flexitem-size-007.html (실시간 테스트) (source)
- image-as-flexitem-size-007v.html (실시간 테스트) (source)
- item-with-table-with-infinite-max-intrinsic-width.html (실시간 테스트) (source)
- multiline-min-max.html (실시간 테스트) (source)
- orthogonal-writing-modes-and-intrinsic-sizing.html (실시간 테스트) (source)
- svg-root-as-flex-item-001.html (실시간 테스트) (source)
- svg-root-as-flex-item-002.html (실시간 테스트) (source)
- svg-root-as-flex-item-003.html (실시간 테스트) (source)
- svg-root-as-flex-item-004.html (실시간 테스트) (source)
- svg-root-as-flex-item-005.html (실시간 테스트) (source)
- svg-root-as-flex-item-006.html (실시간 테스트) (source)
- table-as-item-min-height-1.html (실시간 테스트) (source)
- table-as-item-wide-content.html (실시간 테스트) (source)
- table-with-infinite-max-intrinsic-width.html (실시간 테스트) (source)
- 아이템에 확정된 flex basis 사용 값이 있으면, 그것이 flex base size입니다.
-
플렉스 아이템이 ...
- 선호 비율을 가진 경우,
- 사용된 flex basis가 content인 경우, 그리고
- 확정된 cross size가 있는 경우,
- 사용된 flex basis가 content이거나 사용 가능 공간에 따라 결정된다면, 그리고 플렉스 컨테이너가 min-content 또는 max-content 제약 하에서 크기가 결정되고 있다면 (예: 자동 테이블 레이아웃 [CSS2] 수행 시), 해당 제약 하에서 아이템 크기를 결정합니다. flex base size는 아이템의 결과 main size가 됩니다.
-
그렇지 않고,
사용된 flex
basis가 content이거나 사용 가능 공간에
따라 결정되는 경우,
사용 가능한 메인 크기가 무한대이고,
플렉스 아이템의 인라인 축이 메인 축과 평행이면,
직교 흐름의 박스에 대한 규칙 [CSS3-WRITING-MODES]을 사용해 아이템을 레이아웃합니다.
flex base size는
아이템의 max-content main
size입니다.
참고: 이 경우는 예를 들어, 영어 문서(수평 writing mode)에 column 플렉스 컨테이너가 있고, 그 컨테이너 안에 일본어 세로쓰기(세로 writing mode) flex item이 포함된 경우 발생합니다.
-
그 외에는,
사용된 flex
basis를 사용 가능 공간에 맞춰 main size 대신 사용해 아이템 크기를 결정합니다.
이때 content 값은 max-content로 처리합니다.
main size를 결정하기 위해 cross size가 필요한 경우(예:
flex item의 main size가 블록 축에 있거나,
또는 선호 비율을 가진 경우)
그리고 flex item의 교차 크기가 auto이고 확정된 값이 아니라면,
이 계산에서는 fit-content를 flex item의
cross size로 사용하세요.
flex base size는
아이템의 결과 main size가 됩니다.
테스트
- css-flexbox-img-expand-evenly.html (실시간 테스트) (source)
- fit-content-item-001.html (실시간 테스트) (source)
- fit-content-item-002.html (실시간 테스트) (source)
- fit-content-item-003.html (실시간 테스트) (source)
- fit-content-item-004.html (실시간 테스트) (source)
- flexbox-vert-lr-with-img.html (실시간 테스트) (source)
- flex-container-max-content-001.html (실시간 테스트) (source)
- flex-container-min-content-001.html (실시간 테스트) (source)
- flex-height-min-content.html (실시간 테스트) (source)
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 size에 used min 및 max main sizes(그리고 컨텐츠 박스 크기를 0으로 내리는 것)를 적용해 클램핑한 값입니다.
- 플렉스 컨테이너의 메인 크기를 해당 포맷팅 컨텍스트의 규칙에 따라 결정합니다.
9.3. 메인 크기 결정
-
플렉스 아이템을 flex 라인으로 모읍니다:
- 플렉스 컨테이너가 단일 줄 플렉스 컨테이너라면, 모든 플렉스 아이템을 하나의 flex 라인에 모읍니다.
-
그렇지 않으면,
첫 번째 미수집 아이템부터 시작해,
연속된 아이템을 하나씩 모으다가
다음에 모으려는 아이템이 플렉스 컨테이너의 내부 메인 크기
(혹은 강제 줄바꿈이 발생할 때, § 10 플렉스 레이아웃 분할 참고)
에 맞지 않을 순간까지 수집합니다.
만약 첫 번째 미수집 아이템이 맞지 않는다면,
그 아이템만 라인에 수집합니다.
이 단계에서, 플렉스 아이템의 크기는 외부 가상 메인 크기입니다. (참고: 이 값은 음수일 수도 있습니다.)
모든 플렉스 아이템이 flex 라인에 수집될 때까지 반복합니다.
"최대한 많이 수집" 규칙은 크기가 0인 플렉스 아이템을 이전 라인의 끝에 추가하게 만듭니다. 마지막 0이 아닌 아이템이 라인을 정확히 "채우는" 경우에도 마찬가지입니다.
- 모든 플렉스 아이템의 유연한 길이를 해결하여 사용된 메인 크기를 찾습니다. § 9.7 유연한 길이 해결 참고.
테스트
- flexbox_quirks_body.html (실시간 테스트) (source)
- ortho-table-item-001.html (실시간 테스트) (source)
- percentage-heights-000.html (실시간 테스트) (source)
- percentage-heights-001.html (실시간 테스트) (source)
- percentage-heights-002.html (실시간 테스트) (source)
- percentage-heights-003.html (실시간 테스트) (source)
- percentage-heights-004.html (실시간 테스트) (source)
- percentage-heights-005.html (실시간 테스트) (source)
- percentage-heights-006.html (실시간 테스트) (source)
- percentage-heights-007.html (실시간 테스트) (source)
- percentage-heights-008.html (실시간 테스트) (source)
- percentage-heights-009.html (실시간 테스트) (source)
- percentage-heights-010.html (실시간 테스트) (source)
- percentage-heights-011.html (실시간 테스트) (source)
- percentage-heights-012.html (실시간 테스트) (source)
- percentage-heights-013.html (실시간 테스트) (source)
- percentage-heights-014.html (실시간 테스트) (source)
- percentage-heights-015.html (실시간 테스트) (source)
- percentage-heights-016.html (실시간 테스트) (source)
- percentage-heights-017.html (실시간 테스트) (source)
- percentage-heights-018.html (실시간 테스트) (source)
- percentage-heights-019.html (실시간 테스트) (source)
9.4. 교차 축 크기 결정
- 각 아이템의 가상 교차 크기 결정 아이템을 사용된 in-flow block-level box로, 사용된 main size와 주어진 사용 가능 공간을 사용해 레이아웃을 수행하여 계산합니다. auto는 fit-content로 처리합니다.
-
각 flex 라인의 교차 크기 계산
플렉스 컨테이너가 단일 줄이고 확정된 교차 크기가 있는 경우, flex 라인의 교차 크기는 플렉스 컨테이너의 내부 교차 크기입니다.
그 외의 경우, 각 flex 라인에 대해:
- 인라인 축이 메인 축과 평행인 아이템 중 align-self가 baseline이고, 교차 축 마진이 모두 auto가 아닌 아이템을 모읍니다. 각 아이템의 베이스라인과 가상 외부 cross-start 엣지 사이의 거리 중 최대값, 그리고 베이스라인과 가상 외부 cross-end 엣지 사이의 거리 중 최대값을 찾아 두 값을 더합니다.
- 이전 단계에서 수집되지 않은 모든 아이템 중 외부 가상 교차 크기가 가장 큰 값을 찾습니다.
-
flex 라인의 사용된 교차 크기는
위 두 단계에서 찾은 값들과 0 중에서 가장 큰 값입니다.
플렉스 컨테이너가 단일 줄인 경우, 라인의 교차 크기를 컨테이너의 계산된 min 및 max 교차 크기 내로 클램핑합니다. 참고: CSS 2.1의 min/max-width/height 정의가 더 일반적으로 적용된다면, 이 동작은 자동으로 따라오게 됩니다.
테스트
- flexbox-single-line-clamp-1.html (실시간 테스트) (source)
- flexbox-single-line-clamp-2.html (실시간 테스트) (source)
- flexbox-single-line-clamp-3.html (실시간 테스트) (source)
- flex-item-contains-size-layout-001.html (실시간 테스트) (source)
- flex-item-contains-strict.html (실시간 테스트) (source)
- layout-algorithm_algo-cross-line-001.html (실시간 테스트) (source)
- layout-algorithm_algo-cross-line-002.html (실시간 테스트) (source)
- 'align-content: stretch' 처리 플렉스 컨테이너에 확정된 교차 크기가 있고, align-content가 stretch이며, flex 라인들의 교차 크기 합이 플렉스 컨테이너의 내부 교차 크기보다 작으면, 각 flex 라인의 교차 크기를 동일하게 늘려 라인들의 교차 크기 합이 플렉스 컨테이너의 내부 교차 크기와 같아지도록 합니다.
-
visibility:collapse
아이템 처리
flex 아이템 중 visibility: collapse가 있다면,
해당 아이템이 속한 라인의 교차 크기를 아이템의 strut size로 기록하고 레이아웃을 처음부터 다시 시작합니다.
두 번째 레이아웃 라운드에서는, 아이템을 라인에 모을 때 collapse된 아이템을 메인 크기 0으로 취급합니다. 이후 알고리즘 단계에서는 collapse된 아이템을 완전히 무시합니다 (마치 display:none인 것처럼) 단, 라인의 교차 크기 계산 이후 라인의 교차 크기가 해당 라인에 collapse된 아이템 중 가장 큰 strut size보다 작으면, 라인의 교차 크기를 그 strut size로 설정합니다.
이 단계는 두 번째 레이아웃 라운드에서는 건너뜁니다.
-
각 flex 아이템의 사용된 교차 크기 결정
flex 아이템에 align-self: stretch가 있고,
계산된 교차 크기 속성이 auto이며,
교차 축 마진이 둘 다 auto가 아니면,
사용된 외부 교차 크기는 해당 flex 라인의 사용된 교차 크기이며,
아이템의 사용된 min 및 max 교차 크기에 따라
클램핑합니다.
그 외의 경우,
사용된 교차 크기는 아이템의 가상 교차 크기입니다.
flex 아이템에 align-self: stretch가 있다면, 해당 크기를 확정된 교차 크기로 취급하여 내용을 다시 레이아웃해 퍼센트 크기 자식 요소를 결정할 수 있게 합니다.
이 단계는 flex 아이템의 main size에는 영향을 주지 않습니다. 선호 비율이 있어도 마찬가지입니다.
9.5. 메인 축 정렬
-
남은 여유 공간 분배
각 flex 라인에 대해:
- 남은 여유 공간이 양수이고, 해당 라인에 메인 축 마진 중 하나 이상이 auto라면, 여유 공간을 해당 마진들에 동일하게 분배합니다. 그 외에는 모든 auto 마진을 0으로 설정합니다.
- justify-content에 따라 아이템을 메인 축 방향으로 정렬합니다.
9.6. 교차 축 정렬
-
교차 축 auto 마진 처리
flex 아이템에 auto 교차 축 마진이 있을 때:
- 외부 교차 크기(해당 auto 마진을 0으로 처리)가 flex 라인의 교차 크기보다 작으면, 두 크기의 차이를 auto 마진에 동일하게 분배합니다.
- 그 외에는 block-start 또는 inline-start 마진(교차 축에 있는 것)이 auto라면, 0으로 설정합니다. 반대쪽 마진은 아이템의 외부 교차 크기가 flex 라인의 교차 크기와 같아지도록 설정합니다.
- 모든 flex 아이템을 교차 축 방향으로 정렬 아이템의 교차 축 마진이 모두 auto가 아니면, align-self에 따라 정렬합니다.
- 플렉스 컨테이너의 사용된 교차 크기 결정 해당 포맷팅 컨텍스트의 규칙을 따라 결정합니다. 컨텐츠 기반 교차 크기가 필요하다면, flex 라인의 교차 크기 합을 사용합니다.
- 모든 flex 라인 정렬 align-content에 따라 정렬합니다.
9.7. 유연한 길이 해결
flex 라인 내 아이템의 유연한 길이를 해결하려면:
- 사용된 flex 계수 결정 라인 내 모든 아이템의 외부 가상 메인 크기를 합산합니다. 합이 플렉스 컨테이너의 내부 main size보다 작으면, 이 알고리즘의 나머지 단계에서 flex grow 계수를 사용하고; 그렇지 않으면 flex shrink 계수를 사용합니다.
-
flex 라인 내 각 아이템은 목표 메인
크기를 가지며,
처음에는 flex base size로
설정됩니다.
각 아이템은 처음에는 unfrozen이며 이후 frozen이 될 수 있습니다.
참고: 아이템의 목표 메인 크기는 freezing 이후에는 변경되지 않습니다.
-
유연하지 않은 아이템 크기 결정 freeze 처리하며,
목표 메인 크기를 가상 메인
크기로 설정합니다…
- flex 계수가 0인 아이템
- flex grow 계수를 사용할 때: flex base size가 가상 메인 크기보다 큰 아이템
- flex shrink 계수를 사용할 때: flex base size가 가상 메인 크기보다 작은 아이템
- 초기 여유 공간 계산 라인 내 모든 아이템의 외부 크기를 합산하고, 이를 플렉스 컨테이너의 내부 main size에서 뺍니다. freeze된 아이템에는 외부 목표 메인 크기를 사용하고, 그 외 아이템에는 외부 flex base size를 사용합니다.
-
반복:
- 유연한 아이템 존재 여부 확인 라인 내 모든 flex 아이템이 freeze되었으면 반복 종료.
- 남은 여유 공간 계산 위 초기 여유 공간과 동일하게 계산합니다. freeze되지 않은 flex 아이템의 flex 계수 합이 1 미만이면, 초기 여유 공간에 이 합을 곱합니다. 이 값의 절대값이 남은 여유 공간의 절대값보다 작으면, 이 값을 남은 여유 공간으로 사용합니다.
-
남은 여유
공간이 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가 음수가 될 수 있음. 다음 단계에서 수정됩니다.
- min/max 제한 위반 수정 freeze되지 않은 각 아이템의 목표 메인 크기를 사용된 min 및 max main size에 따라 클램핑하고, 컨텐츠 박스 크기를 0으로 내립니다. 아이템의 목표 메인 크기가 이로 인해 더 작아지면 max 위반, 더 커지면 min 위반입니다.
-
과도하게 늘어난 아이템 freeze
전체 위반량은 이전 단계에서의 조정값 합
∑(clamped size - unclamped size)
입니다. 전체 위반량이- 0
- 모든 아이템 freeze
- 양수
- min 위반된 아이템 모두 freeze
- 음수
- max 위반된 아이템 모두 freeze
참고: 최소한 하나의 아이템을 freeze하므로, 반복이 항상 진행되고 결국 종료됩니다.
- 반복의 처음으로 돌아갑니다.
- 각 아이템의 사용된 main size를 목표 메인 크기로 설정합니다.
테스트
- item-with-max-height-and-scrollbar.html (실시간 테스트) (source)
- item-with-max-height-and-scrollbar.html (실시간 테스트) (source)
- max-width-violation.html (실시간 테스트) (source)
- relayout-image-load.html (실시간 테스트) (source)
- table-as-item-inflexible-in-column-1.html (실시간 테스트) (source)
- table-as-item-inflexible-in-column-2.html (실시간 테스트) (source)
- table-as-item-inflexible-in-row-1.html (실시간 테스트) (source)
- table-as-item-inflexible-in-row-2.html (실시간 테스트) (source)
9.8. 확정 크기와 비확정 크기
CSS Sizing [CSS-SIZING-3]에서는 확정 및 비확정 길이를 정의하지만, Flexbox에서는 어떤 길이가 확정으로 간주될 수 있는 추가적인 경우가 있습니다:
-
플렉스 컨테이너에 확정된 메인 크기가 있으면, 플렉싱 이후 메인 크기는 플렉스 아이템에 대해 확정으로 처리됩니다.
-
플렉스 아이템의 flex basis가 확정이면, 플렉싱 이후 메인 크기도 확정으로 처리됩니다.
-
단일 줄 플렉스 컨테이너에 확정된 교차 크기가 있으면, 자동 선호 외부 교차 크기는 늘어진 플렉스 아이템에 대해 플렉스 컨테이너의 내부 교차 크기(플렉스 아이템의 min/max 교차 크기로 클램핑됨) 로 간주되며 확정으로 처리됩니다.
-
플렉스 라인의 교차 크기가 결정된 후에는, 자동 크기 플렉스 컨테이너의 아이템 교차 크기도 레이아웃 목적상 확정된 것으로 간주됩니다; 11단계 참고.
테스트
- flexbox-definite-cross-size-constrained-percentage.html (실시간 테스트) (source)
- flexbox-definite-sizes-001.html (실시간 테스트) (source)
- flexbox-definite-sizes-002.html (실시간 테스트) (source)
- flexbox-definite-sizes-003.html (실시간 테스트) (source)
- flexbox-definite-sizes-004.html (실시간 테스트) (source)
- flexbox-definite-sizes-005.html (실시간 테스트) (source)
- flexbox-definite-sizes-006.html (실시간 테스트) (source)
- height-percentage-with-dynamic-container-size.html (실시간 테스트) (source)
- percentage-widths-001.html (실시간 테스트) (source)
- position-fixed-001.html (실시간 테스트) (source)
- stretch-obeys-min-max-001.html (실시간 테스트) (source)
- stretch-obeys-min-max-002.html (실시간 테스트) (source)
- stretch-obeys-min-max-003.html (실시간 테스트) (source)
참고: 이것은 flex layout 내에서 "확정" 크기를 얻으려면 실제 레이아웃 계산을 수행해야 함을 의미합니다. 이는 flex item 내부의 백분율 값이 저자가 기대하는 위치에서 해석될 수 있도록 하기 위해 도입되었습니다.
9.9. 내재적 크기
내재적 크기 결정은 flex container에서 컨텐츠 기반 자동 크기 산출에 사용됩니다. 예를 들어 컨텐츠에 맞춰 줄어드는 논리적 너비(fit-content 공식을 사용)와, 컨텐츠 기반 논리적 높이(max-content 크기 공식을 사용) 등이 이에 해당합니다. 이 계산에서는 flex 아이템의 auto 마진을 0으로 취급합니다.
이 절의 용어 정의는 [CSS-SIZING-3]를 참고하세요.
테스트
- flexbox-gap-position-absolute.html (실시간 테스트) (source)
- gap-001-lr.html (실시간 테스트) (source)
- gap-001-ltr.html (실시간 테스트) (source)
- gap-001-rl.html (실시간 테스트) (source)
- gap-001-rtl.html (실시간 테스트) (source)
- gap-002-lr.html (실시간 테스트) (source)
- gap-002-ltr.html (실시간 테스트) (source)
- gap-002-rl.html (실시간 테스트) (source)
- gap-002-rtl.html (실시간 테스트) (source)
- gap-003-lr.html (실시간 테스트) (source)
- gap-003-ltr.html (실시간 테스트) (source)
- gap-003-rl.html (실시간 테스트) (source)
- gap-003-rtl.html (실시간 테스트) (source)
- gap-004-lr.html (실시간 테스트) (source)
- gap-004-ltr.html (실시간 테스트) (source)
- gap-004-rl.html (실시간 테스트) (source)
- gap-004-rtl.html (실시간 테스트) (source)
- gap-005-lr.html (실시간 테스트) (source)
- gap-005-ltr.html (실시간 테스트) (source)
- gap-005-rl.html (실시간 테스트) (source)
- gap-005-rtl.html (실시간 테스트) (source)
- gap-006-lr.html (실시간 테스트) (source)
- gap-006-ltr.html (실시간 테스트) (source)
- gap-006-rl.html (실시간 테스트) (source)
- gap-006-rtl.html (실시간 테스트) (source)
- gap-007-lr.html (실시간 테스트) (source)
- gap-007-ltr.html (실시간 테스트) (source)
- gap-007-rl.html (실시간 테스트) (source)
- gap-007-rtl.html (실시간 테스트) (source)
- gap-008-ltr.html (실시간 테스트) (source)
- gap-009-ltr.html (실시간 테스트) (source)
- gap-010-ltr.html (실시간 테스트) (source)
- gap-011.html (실시간 테스트) (source)
- gap-012.html (실시간 테스트) (source)
- gap-013.html (실시간 테스트) (source)
- gap-014.html (실시간 테스트) (source)
- gap-015.html (실시간 테스트) (source)
- gap-016.html (실시간 테스트) (source)
- gap-017.html (실시간 테스트) (source)
- gap-018.html (실시간 테스트) (source)
- gap-019.html (실시간 테스트) (source)
- gap-020.html (실시간 테스트) (source)
- gap-021.html (실시간 테스트) (source)
- auto-min-size-001.html (실시간 테스트) (source)
- col-wrap-001.html (실시간 테스트) (source)
- col-wrap-002.html (실시간 테스트) (source)
- col-wrap-003.html (실시간 테스트) (source)
- col-wrap-004.html (실시간 테스트) (source)
- col-wrap-005.html (실시간 테스트) (source)
- col-wrap-006.html (실시간 테스트) (source)
- col-wrap-007.html (실시간 테스트) (source)
- col-wrap-008.html (실시간 테스트) (source)
- col-wrap-009.html (실시간 테스트) (source)
- col-wrap-010.html (실시간 테스트) (source)
- col-wrap-011.html (실시간 테스트) (source)
- col-wrap-012.html (실시간 테스트) (source)
- col-wrap-013.html (실시간 테스트) (source)
- col-wrap-014.html (실시간 테스트) (source)
- col-wrap-015.html (실시간 테스트) (source)
- col-wrap-016.html (실시간 테스트) (source)
- col-wrap-017.html (실시간 테스트) (source)
- col-wrap-018.html (실시간 테스트) (source)
- col-wrap-019.html (실시간 테스트) (source)
- col-wrap-020.html (실시간 테스트) (source)
- col-wrap-crash.html (실시간 테스트) (source)
- row-001.html (실시간 테스트) (source)
- row-002.html (실시간 테스트) (source)
- row-003.html (실시간 테스트) (source)
- row-004.html (실시간 테스트) (source)
- row-005.html (실시간 테스트) (source)
- row-006.html (실시간 테스트) (source)
- row-007.html (실시간 테스트) (source)
- row-008.html (실시간 테스트) (source)
- row-compat-001.html (실시간 테스트) (source)
- row-use-cases-001.html (실시간 테스트) (source)
- row-wrap-001.html (실시간 테스트) (source)
- multiline-shrink-to-fit.html (실시간 테스트) (source)
- svg-no-natural-size-grandchild.html (실시간 테스트) (source)
9.9.1. 플렉스 컨테이너의 내재적 메인 크기
max-content 메인 크기의 플렉스 컨테이너는 이론적으로, 플렉스 컨테이너가 flex 레이아웃을 해당 컨테이너 크기로 실행할 때, 각 플렉스 아이템이 최소한 자신의 max-content contribution 크기만큼을 갖도록, (아이템의 유연성이 허락하는 한에서) 컨테이너가 가질 수 있는 최소 크기입니다.
min-content 메인 크기의 플렉스 컨테이너는 이론적으로, 플렉스 컨테이너가 아이템이 넘치지 않고, 아이템의 컨텐츠도 아이템을 넘치지 않는(박스 레이아웃이 정의상 오버플로우되는 경우를 제외하고, 예를 들어 음수 마진이나 100%를 초과하는 백분율 크기 등) 최소 크기입니다.
테스트
9.9.1.1. 이상적인 알고리즘
참고: 아래 알고리즘은 플렉스 컨테이너의 이상적인 내재적 메인 크기를 계산합니다. 하지만, 처음에 올바르게 구현되지 않았고, 기존 콘텐츠가 (안타깝게도 일관적인) 잘못 구현된 동작에 의존하게 되었기 때문에, 웹 호환성이 없습니다. 구현자와 CSS 워킹그룹은 웹 브라우저 구현체가 이 동작에 얼마나 안전하게 접근할 수 있을지 조사 중이며, 추가 실험도 환영합니다.
오직 collapsed가 아닌 플렉스 아이템만 고려합니다;
- 각 플렉스 아이템에 대해, 외부 flex base size를 max-content contribution 크기에서 뺍니다. 그 결과가 양수면, 아이템의 flex grow factor가 1 이상이면 나누고, flex grow factor가 1 미만이면 곱합니다; 결과가 음수면, 아이템의 scaled flex shrink factor로 나눕니다(0으로 나누면 음의 무한대로 처리). 이것이 아이템의 desired flex fraction입니다.
- 모든 플렉스 아이템을 무한 길이의 라인에 배치합니다. 각 라인에서, 모든 플렉스 아이템 중 가장 큰(가장 양수인) desired flex fraction을 찾습니다. 이것이 라인의 chosen flex fraction입니다.
-
chosen flex fraction이 양수이고,
라인의 flex grow
factors 합이 1 미만이면,
chosen flex fraction을 그 합으로 나눕니다.
chosen flex fraction이 음수이고, 라인의 flex shrink factors 합이 1 미만이면, chosen flex fraction에 그 합을 곱합니다.
- 각 아이템의 flex base size에, flex grow factor(축소 시에는 scaled flex shrink factor)와 chosen flex fraction의 곱을 더한 뒤, 그 결과를 max main size에서 min main size로 내립니다.
- 플렉스 컨테이너의 max-content 크기는 모든 라인 중에서, 한 라인 내 모든 아이템의 위에서 계산한 크기 합 중 가장 큰 값입니다.
min-content 메인 크기의 단일 줄 플렉스 컨테이너는 max-content 메인 크기와 동일하게 계산하지만, 플렉스 아이템의 min-content contribution을 max-content contribution 대신 사용합니다.
flex 합이 1 미만일 때 위 알고리즘의 영향
위 알고리즘은 특히 두 가지 경우에 올바른 동작을 제공하도록 설계되었으며, 두 경우를 전환할 때 플렉스 컨테이너 크기가 연속적이도록 합니다:
-
모든 아이템이 유연하지 않으면, 플렉스 컨테이너 크기는 아이템들의 flex base size 합이 됩니다. (유연하지 않은 flex base size는 본질적으로 width/height를 대체하며, 이것이 지정된 경우 Block Layout에서 max-content contribution의 기준이 됩니다.)
-
모든 아이템이 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 너비가 됩니다.
선택한 특정 동작에 대한 더 복잡한 참고 사항
원칙:
-
크기가 0에 가까워질 때, 아무 크기든(늘리거나 줄이거나) 폭발적이지 않아야 한다.
-
모든 flex 계수가 1 이상이면, 모든 아이템이 max-content 크기 이상이 되기 위한 최소 크기를 반환해야 한다.
-
flex 계수가 0인 아이템은 전체 크기에 영향을 주지 않아야 한다.
-
flex 계수와 아이템 크기 변화에 대해 연속성을 유지해야 한다.
-
입력 변수(크기, flex 계수)의 선형 변화에 대해 크기 변화도 가능한 한 선형적이어야 한다.
-
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를 기준으로 해석):
-
row flex 컨테이너에서는,
flex 아이템의 break-before 및 break-after 값이 flex 라인에 전파됩니다.
첫 번째 라인의 break-before 값과
마지막 라인의 break-after 값은 flex 컨테이너에 전파됩니다.
참고: break 전파(예: text-decoration 전파)는 계산된 값에는 영향을 주지 않습니다.
- column flex 컨테이너에서는, 첫 번째 아이템의 break-before 값과 마지막 아이템의 break-after 값이 flex 컨테이너에 전파됩니다. 그 외 아이템의 강제 분할은 해당 아이템에 적용됩니다.
- flex 아이템 내부의 강제 분할은 해당 아이템 컨텐츠 크기를 증가시키는 효과가 있으며, 형제 아이템 내부에 강제 분할을 유발하지 않습니다.
- row flex 컨테이너에서는 Class A break opportunities가 형제 flex 라인 사이에 발생하며, Class C break opportunities가 첫/마지막 flex 라인과 flex 컨테이너의 컨텐츠 엣지 사이에 발생합니다. column flex 컨테이너에서는 Class A break opportunities가 형제 flex 아이템 사이에, Class C break opportunities가 한 라인 내 첫/마지막 flex 아이템과 flex 컨테이너의 컨텐츠 엣지 사이에 발생합니다. [CSS3-BREAK]
- flex 컨테이너가 분할 후 이어질 때, flex 아이템에(분할 context의 블록 플로우 방향) 사용 가능한 공간은 이전 페이지의 flex 컨테이너 조각(fragment)이 차지한 공간만큼 줄어듭니다. flex 컨테이너 조각이 차지한 공간은 해당 페이지에서의 컨텐츠 박스 크기입니다. 이 조정 결과 사용 가능 공간이 음수가 되면, 0으로 설정합니다.
- flex 컨테이너의 첫 번째 fragment가 페이지의 맨 위에 있지 않고, flex 아이템 중 아무 것도 페이지의 남은 공간에 들어맞지 않으면, 전체 fragment를 다음 페이지로 이동합니다.
- 다중 줄 column flex 컨테이너를 분할할 때, UA는 각 fragment를 자체 flex 라인 "스택"으로 구성할 수 있습니다. 이는 다중 컬럼 컨테이너의 각 fragment가 자체 컬럼 박스 행을 갖는 것과 유사하며, 이전 페이지에 먼저 표시된 컨텐츠가 박스 순서상 먼저 오는 컨텐츠와 맞춰지도록 보장하기 위함입니다.
- 이전 항목에서 강제된 아이템 재배치 외에는, UA는 분할되지 않은 플로우와 비교해 flex 컨테이너의 왜곡을 최소화하려고 해야 합니다.
테스트
- flexbox_interactive_break-after-column-item.html (manual test) (source)
- flexbox_interactive_break-after-column-lastitem.html (manual test) (source)
- flexbox_interactive_break-after-container.html (manual test) (source)
- flexbox_interactive_break-after-item.html (manual test) (source)
- flexbox_interactive_break-after-line.html (manual test) (source)
- flexbox_interactive_break-after-line-order.html (manual test) (source)
- flexbox_interactive_break-after-multiline.html (manual test) (source)
- flexbox_interactive_break-before-column-firstitem.html (manual test) (source)
- flexbox_interactive_break-before-column-item.html (manual test) (source)
- flexbox_interactive_break-before-container.html (manual test) (source)
- flexbox_interactive_break-before-item.html (manual test) (source)
- flexbox_interactive_break-before-multiline.html (manual test) (source)
- flexbox_interactive_break-natural.html (manual test) (source)
10.1. 플렉스 분할 샘플 알고리즘
이 안내 섹션에서는 플렉스 컨테이너에 대한 가능한 분할 알고리즘을 제시합니다. 구현자들은 이 알고리즘을 개선하고 CSS 워킹 그룹에 피드백을 제공하는 것이 권장됩니다.
이 알고리즘은 항상 페이징이 앞으로만 진행된다고 가정합니다; 따라서 아래 알고리즘에서는 페이징 전에 정렬이 대부분 무시됩니다. 고급 레이아웃 엔진은 단편화된 영역에서도 정렬을 보장할 수 있습니다.
- single-line column flex container
-
- 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 교차 크기 결정까지 실행합니다.
- 가능한 한 많은 연속 플렉스 아이템 또는 아이템 단편을, (최소 한 개 또는 그 일부를 포함하여) 처음부터 시작하여, 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다.
- 이전 단계에서 공간이 부족했고, 남은 공간이 양수라면, UA는 이 페이지에서 분배된 남은 공간을(0까지는 줄이되, 0 이하로는 가지 않음) 다음에 들어갈 수 없는 아이템이나 단편을 위해 공간을 만들기 위해 줄일 수 있습니다. 그렇지 않으면, 맞지 않는 아이템 또는 단편은 다음 페이지로 넘어갑니다. UA는 만약 단편의 50% 이상이 남은 공간에 들어갈 수 있으면 끌어올리고, 아니면 넘깁니다.
- 이전 단계에서 배치되지 않은 플렉스 아이템이나 단편이 있다면, 플렉스 레이아웃 알고리즘을 라인 길이 결정부터 교차 크기 결정까지 다음 페이지 크기로, 그리고 전체 컨텐츠(이미 배치된 것 포함)로 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템 또는 단편부터 시작합니다.
- 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 메인 축 정렬부터 끝까지 계속합니다.
이 알고리즘의 의도는 column 방향 single-line 플렉스 컨테이너가 블록 플로우와 매우 유사하게 페이징되도록 하는 것입니다. 의도를 테스트하려면, justify-content:start이고 유연하지 않은 아이템만 있는 플렉스 컨테이너는 같은 컨텐츠, 같은 사용 크기, 같은 마진을 가진 in-flow 자식이 있는 블록과 동일하게 페이징되어야 합니다.
- multi-line column flex container
-
- 페이징을 고려하여(플렉스 컨테이너의 최대 라인 길이를 페이지에 남은 공간으로 제한) 플렉스 레이아웃 알고리즘을 교차 크기 결정까지 실행합니다.
-
가능한 한 많은 flex 라인을(최소 한 개)
플렉스 컨테이너의 교차 방향과 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치:
- 가능한 한 많은 연속 flex 아이템을(최소 한 개), 처음부터 시작해, 페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다. flex 아이템 내부의 강제 분할은 무시합니다.
- 만약 이것이 첫 flex 컨테이너 단편이고, 해당 라인이 한 개의 flex 아이템만 포함하며, 그 아이템이 페이지에 남은 공간보다 크고, 플렉스 컨테이너가 이미 페이지의 맨 위에 없는 경우, 플렉스 컨테이너를 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다.
- 첫 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 메인 크기 결정부터 교차 크기 결정까지 해당 라인에서 이미 배치되지 않은 아이템만 사용해 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템부터 시작합니다.
- 이전 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 라인 크기 결정부터 교차 크기 결정까지 다음 페이지 크기로, 그리고 이미 배치되지 않은 아이템만 사용해 다시 실행하고, 이전 단계로 돌아가되, 이미 배치되지 않은 첫 아이템부터 시작합니다.
- 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 메인 축 정렬부터 끝까지 계속합니다.
이 샘플 알고리즘의 단점은 flex 아이템이 한 페이지에 완전히 들어가지 않으면, multi-line column flex 컨테이너에서 단편화되지 않는다는 점입니다.
- single-line row flex container
-
- 전체 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 실행하되, align-self가 flex-start 또는 baseline이 아닌 경우 flex-start로 처리합니다.
- 들어갈 수 없는 아이템이 페이지에 남은 공간 내에 들어가지 않고, 플렉스 컨테이너가 페이지 맨 위에 없으면, 플렉스 컨테이너를 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다.
-
각 아이템에 대해,
컨텐츠 중 남은 공간에 들어갈 수 있는 만큼 배치하고,
남은 컨텐츠는 다음 페이지로 단편화하여 넘긴 뒤,
플렉스 레이아웃 알고리즘을
라인 길이 결정부터 메인 축 정렬까지 새 페이지 크기로,
전체 컨텐츠(이전 페이지에서 완료된 아이템 포함)로 다시 실행합니다.
이전 단편에 완전히 들어간 flex 아이템도 이후 단편에서 메인 축 공간을 계속 차지합니다.
- 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 교차 축 정렬부터 끝까지 다시 실행합니다. 첫 번째 단편을 제외한 모든 단편에서는, align-self 및 align-content를 모든 아이템 단편 및 라인에 대해 flex-start로 처리합니다.
- 어떤 아이템이라도, 원래 align-self 값에 따라 모든 플렉스 컨테이너 단편의 결합된 교차 크기 내에 완전히 들어갈 수 있다면, 해당 단편으로 이동해 알맞게 정렬할 수 있습니다.
- multi-line row flex container
-
- 플렉스 레이아웃 알고리즘을(페이징 신경쓰지 않고) 교차 크기 결정까지 실행합니다.
-
가능한 한 많은 flex 라인을(최소 한 개)
처음부터 시작해서,
페이지에 공간이 없거나 강제 분할이 발생할 때까지 배치합니다.
라인이 페이지에 들어가지 않고, 라인이 페이지 맨 위에 없으면, 라인을 다음 페이지로 옮기고 레이아웃을 완전히 다시 시작합니다. 이때 해당 라인 및 이후 라인에 있는 아이템만 사용합니다.
flex 아이템 자체가 강제 분할을 일으키면, 플렉스 레이아웃 알고리즘을 메인 크기 결정부터 메인 축 정렬까지, 해당 라인 및 이후 라인에 있는 아이템만 사용해 다시 실행하며, 분할을 유발한 아이템은 라인 나누기 단계에서 자동으로 새 라인을 시작하게 하고, 이후 이 단계를 계속합니다. flex 아이템 내부의 강제 분할은 무시합니다.
- 이전 단계에서 배치되지 않은 flex 아이템이 있다면, 플렉스 레이아웃 알고리즘을 라인 길이 결정부터 메인 축 정렬까지 다음 페이지 크기로, 그리고 이미 배치되지 않은 아이템만 사용해 다시 실행합니다. 이전 단계로 돌아가되, 이미 배치되지 않은 첫 라인부터 시작합니다.
- 플렉스 컨테이너의 각 단편에 대해, 플렉스 레이아웃 알고리즘을 교차 축 정렬부터 끝까지 계속합니다.
부록 A: 축 매핑
이 부록은 규범적이지 않습니다.
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 | 아래 | 위 |
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 | 아래 | 위 |
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 이후 변경점
의견 반영 결과를 볼 수 있습니다. 주요 변경 사항은 다음과 같습니다:
- § 9.9.1 플렉스 컨테이너 내재적 메인 크기의 일부를 이상적이지만 웹 호환이 아님으로 표시하고, 개선된 웹 호환 알고리즘을 추가 조사 대상으로 표기함. (이슈 8884)
- § 9.9.1 플렉스 컨테이너 내재적 메인 크기의 flex 규칙 오류를 실제 레이아웃 알고리즘에 더 가깝게 수정하고, 입력 값이 0에 가까워질 때 0으로 나누거나 크기가 폭발하는 문제를 방지함. (이슈 7189)
- 컬럼 wrap 플렉스 컨테이너의 교차 크기 내재적 크기 규칙을 더 좋은 결과를 내도록 개정함. (이슈 6777)
- 컨텐츠 엣지 기준으로 플렉스 컨테이너 자식의 static-position rectangle을 정하도록 해 여분 레이아웃 작업을 방지. 이로 인해 플렉스 컨테이너의 align-content는 무시되지만, 박스 자체의 align-self는 적용됨. (이슈 5843, 7596)
- min 및 max 크기 기여 계산에서 auto preferred sizes를 올바르게 무시함. (max에서 누락되었으나, 변경 로그에서는 올바르게 반영됨) (이슈 6455)
- order 속성 정의를 [CSS-DISPLAY-3]로 이동함. 자세한 설명은 § 5.4 재정렬 및 접근성: order 속성 참고. (이슈 5865)
-
확정 flex basis를 가진 flex item의 main size가 항상 확정이 되도록 변경하여 구현과 일치시킴.
(이슈 4311)
참고: 완전히 유연하지 않은 아이템의 확정 flex basis가 있으면 main size도 확정입니다.참고: 이것은 flex layout 내에서 "확정" 크기를 얻으려면 실제 레이아웃 계산을 수행해야 함을 의미합니다. 이는 flex item 내부의 백분율 값이 저자가 기대하는 위치에서 해석될 수 있도록 하기 위해 도입되었습니다.
- 각 페이지의 flex 아이템을 독립된 flex 라인 스택으로 재배치하는 것을 선택적으로 만들고, 샘플 알고리즘의 한계를 명시함. (6855)
- 속성 정의 표에서 값 문법을 최신 CSS bracketed range notation으로 업데이트함(음수 값 제한을 명시적으로 반영). (편집)
- aspect ratio 용어를 preferred aspect ratio로 변경하고, replaced elements에만 적용되는 경우 명확화함. 곧 도입될 aspect-ratio 속성 반영 목적.
- aspect-ratio와 automatic minimum size의 상호 작용 정의. transferred size suggestion에는 효과를 적용하고, specified size suggestion의 확정성에서는 제외. (이슈 6069, 6794, 변경셋 A, 변경셋 B)
- automatic minimum size를 computed value의 overflow에 따라 조건부로 고정함. scroll container 여부가 아니라, replaced elements의 scrollable overflow values가 non-scrollable used values로 해석되는 경우를 방지함. (7714)
- content-based minimum sizes가 아이템 크기를 비확정으로 만드는 규칙이 auto에만 한정되며, 다른 내재적 크기 키워드에는 영향이 없음을 명확히 함. (이슈 6457)
-
collapsed flex
items를 내재적 메인 크기 계산에서 명시적으로 제외함.
(이슈 5985)
max-content 메인 크기의 플렉스 컨테이너는 플렉스 컨테이너가 max-content contributions를 유지하는 한 flex item에 대해 아이템의 유연성이 허락하는 최솟값임. collapsed가 아닌 collapsed 아닌 flex item만 고려함:
다중 줄 컨테이너의 경우, collapsed가 아닌 collapsed 아이템 중에서 min-content contribution이 가장 큰 값이 됨.
-
flex base size 계산이 used 교차 크기에 의존함을 명확히 함.
(이슈 3736)
… 그럼 flex base size는 used 교차 크기와 flex 아이템의 내재적 aspect ratio로 계산됨.
- § 9.7 유연한 길이 해결의 설명을 약간 구조화하여 오류 수정. (이슈 5179)
-
"레이아웃 수행"이 블록 레벨 레이아웃 규칙 사용을 의미함을 명확화.
(이슈 5188)
각 아이템의 가상 교차 크기 결정은 in-flow block-level box처럼 레이아웃을 수행 사용된 main size 와 주어진 사용 가능 공간으로 …
-
플렉스 컨테이너의 교차 크기 결정 단계를
블록 레이아웃 규칙이 아닌, 해당 포맷팅 컨텍스트의 규칙에 따라 변경함.
(이슈 5190)
플렉스 컨테이너의 사용된 교차 크기 결정 해당 포맷팅 컨텍스트의 규칙을 따라 결정. 컨텐츠 기반 교차 크기가 필요하면, flex 라인의 교차 크기 합을 사용.
-
aspect-ratio 계산 시 어느 박스를 사용할지 명시하지 않고,
aspect-ratio 속성의 새 동작을 반영함.
(이슈 5246)
그럼 flex base size는 사용된
inner교차 크기와 flex 아이템의 내재적 aspect ratio로 계산됨. -
flex 아이템의 content-based minimum
size가 intrinsic size contribution의 한 종류임을 명확히 함.
따라서 [CSS-SIZING-3]의 관련 규칙이 적용됨.
(이슈 5665)
참고: content-based minimum size는 intrinsic size contribution의 한 종류이므로, CSS Sizing 3 § 5.2 Intrinsic Contributions의 규정이 적용됨.
- space-* 키워드의 fallback 정렬을 safe로 처리함(남은 공간이 음수일 때). (이슈 10154)
- content-based minimum size 정의를 더 쉽게 읽을 수 있도록 재작성(편집).
-
-webkit-
별칭과 flex 레이아웃 속성에 대한 부록 B 추가. 웹 호환을 위해 필요한-webkit-
별칭 문서화. (이슈 5634) - blockification 규칙을 computed values 기준으로 다시 작성. (이슈 4065)
- 기타 사소한 편집 및 명확화,
2017년 10월 16일 CR 이후 변경점
의견 반영 결과도 제공됩니다.
- 플렉스 아이템 블록 축 마진 및 패딩이 블록 크기를 기준으로 해석될 수 있는 옵션을 제거했습니다. 이제 반드시 블록처럼 인라인 크기를 기준으로 해석해야 합니다. (이슈 2085)
-
플렉스 아이템의 min-content contribution을 preferred
size로 내림(floor) 처리했습니다(이슈 2353) 및
관련 설명을 더 정확하게 다듬었습니다.
플렉스 아이템의 main-size min-content contribution은, 플렉스 아이템의 외부 min-content size와 외부 preferred size(적절할 때 width/height), 이 값이 auto가 아니면 중 더 큰 값입니다. 이 값은 flex base size로 최대(성장 불가 시), 최소(축소 불가 시)값을 제한하고, 이후 min/max main size properties로 추가 제한합니다.
플렉스 아이템의 main-size max-content contribution은 플렉스 아이템의 외부 max-content size와 외부
지정된선호 크기 (적절할 때 width/height,) 이 값이확정일 때auto가 아닐 때 중 더 큰 값입니다. 그리고 flex base size로 최대(성장 불가 시), 최소(축소 불가 시)값을 제한하고, 이후 min/max main size properties로 추가 제한합니다. -
flex-basis: content를 더 명확히 정의하는 설명과
교차 참조를 추가했습니다.
자동 크기
자동 크기 산출자동 크기 는 플렉스 아이템의 컨텐츠를 기반으로 결정됩니다. (일반적으로 max-content size와 같으나, aspect ratio, 내재적 크기 제약, 직교 플로우 등 조정이 들어가므로 자세한 내용은 § 9 Flex 레이아웃 알고리즘 참고) - auto 키워드의 min-width 및 min-height 정의를 [CSS-SIZING-3]로 이동했습니다. 플렉스 아이템의 automatic minimum size 정의는 여기에 남아 있습니다. (이슈 1920, 이슈 2103)
- auto의 min-width 및 min-height 계산을 변경해서 항상 자기 자신으로 계산되게 했습니다—단, CSS2 display 타입에서는 resolved value가 0으로 유지됩니다. (이슈 2230, 이슈 2248)
- min/max 클램핑이 min/max 크기 속성의 used value에 따라 이루어짐을 명확히 했습니다—특히 auto 레이아웃 테이블의 경우 테이블의 min-content size로 내림 처리됩니다. (이슈 2442)
-
break 전파가 computed value에는 영향을 주지 않으며 order-modified document order가 사용됨을 명확히 했습니다. (이슈 2614)
단편화된 flex 컨테이너의 정확한 레이아웃은 Flexible Box Layout 이 레벨에서는 정의되어 있지 않습니다. 그러나 flex 컨테이너 내부 분할은 다음 규칙을 따릅니다 (해석 시 order-modified document order 사용) :
-
row flex 컨테이너에서는,
flex 아이템의 break-before 및 break-after 값이 flex 라인에 전파됩니다.
첫 번째 라인의 break-before 값과
마지막 라인의 break-after 값은 flex
컨테이너에 전파됩니다.
참고: break 전파(text-decoration 전파와 유사)는 computed value에는 영향을 주지 않습니다.
-
row flex 컨테이너에서는,
flex 아이템의 break-before 및 break-after 값이 flex 라인에 전파됩니다.
첫 번째 라인의 break-before 값과
마지막 라인의 break-after 값은 flex
컨테이너에 전파됩니다.
-
automatic minimum size가 바로 0으로 결정된 경우 content-based minimum size가 아니면 indefiniteness를 야기하지
않음을 명확히 했습니다.
요소의 내재적 크기를 계산할 때(예: 요소의 min-content size),
this valuecontent-based minimum size 는 해당 축의 요소 크기를 비확정으로 만듭니다 (예: width 속성이 확정 크기를 지정했더라도). - automatic minimum size에 대해 편집적 개선을 했습니다. (이슈 2385)
- 기타 사소한 편집 및 명확화, 용어 업데이트 등 다른 CSS 모듈 업데이트와 맞춤
2016년 5월 26일 CR 이후 변경점
의견 반영 결과도 제공됩니다.
실질적 변경 및 버그 수정
-
플렉스 계수가 실제로 플렉스 아이템 크기의 절대 비율을 나타낼 수
있도록(여러 예시 참고),
아이템의 flex base size를 찾을
때 content-box 크기를 0으로 내림(floor)하는 절차를 제거했습니다.
(이러한 비율에는 flex base size가 0이어야 하며, 그렇지 않으면 margin, border,
padding도 모두 0이어야만 가능)
(가상의/최종 아이템 크기를 계산할 때는 flooring 및 min/max 크기 제약이 계속 적용됨)
(이슈 316)
flex base size를 결정할 때, 아이템의 min/max main size 속성은 무시됩니다(클램핑 없음). 또한 box-sizing 적용 시 content box 크기를 0으로 내리는 크기 계산도 무시합니다. (예: 크기가 0, 양수 padding, box-sizing: border-box인 아이템은 외부 flex base size가 0이고, 내부 flex base size는 음수가 될 수 있습니다.)
가상 메인 크기는 아이템의 flex base size에 min/max main size 속성을 적용해 클램핑한 값 (그리고 content box 크기를 0으로 내림) 입니다.
min/max 위반 수정. freeze되지 않은 각 아이템의 target main size를 min/max main size 속성에 따라 클램핑 하고 content-box 크기를 0으로 내림 . 이로 인해 아이템의 target main size가 더 작아지면 max 위반, 더 커지면 min 위반입니다.
-
shrink-to-fit 컨테이너에서 빈 flex 아이템이 지정된 크기가
있어도 0으로 무너지는 것을 막기 위해,
지정된 크기가 max-content contribution 계산에 반영되도록 했습니다(§ 9.9.3 Flex 아이템 내재적 크기 기여 참고). (이슈 1435)
max-content contribution 메인 크기는 더 큰 값 외부 max-content size 와 지정된 크기(적절할 때 width/height, 그 값이 확정일 때) 중에서 선택합니다. 그리고 flex base size로 최대(성장 불가 시), 최소(축소 불가 시)값을 제한하고, 이후 min/max main size properties로 추가 제한합니다.
-
두 개 이상의 구현체가 flex basis가 indefinite이어도 flex
아이템 내부 백분율 크기를 해석하는 것을 허용했으므로, definite flex basis를 요구하는 조건을 제거했습니다. (이슈 1679)
플렉스 아이템에 확정된 flex basis가 있고플렉스 컨테이너에 확정된 main size가 있으면,its플렉스 아이템의 플렉싱 이후 main size는 확정으로 처리됩니다(실제로는 같은 라인의 비확정 크기를 가지는 flex 아이템에 의존해 flexed main size가 결정될 수 있음). -
구현 편의를 위해 auto 값의 align-self가 항상 자체 값으로 계산되도록 했습니다.
이전 변경점에서 절대 위치 요소에 대해 이 계산을 요구한 바 있습니다. (이슈 440, 이슈 644)
Computed value: auto는 부모의 align-items 값으로 계산됨; 그 외는지정된 대로절대 위치 요소에서는 auto가 자기 자신으로 계산됨. 그 외 모든 요소에서는 auto 값의 align-self가 부모의 align-items 값 또는 부모가 없으면 stretch로 계산됨. - 직교 플로우의 flex items 및 베이스라인이 없는 flex items 모두에 대해 border box에서 alignment baseline을 synthesize하도록 변경했습니다. (이슈 373)
-
교차 축 기준선 집합 정의에서 main/cross 오류를
수정했습니다. (이슈 792)
그 외에는 플렉스 컨테이너에 first/last
maincross -axis baseline set이 없습니다… -
flex 아이템으로서의 테이블에 대한 삭제된 설명을 복원했습니다. 익명 박스 변경점 참고. (이슈 547)
플렉스 아이템에 display: table이 지정된 경우, 테이블 래퍼 박스가 flex item이 되며, order 및 align-self 속성이 적용됩니다. 캡션 박스의 컨텐츠는 테이블 래퍼 박스의 min/max-content 크기 계산에 기여합니다. 하지만 width 및 height처럼, flex longhands는 테이블 박스에 다음과 같이 적용됩니다: flex item의 최종 크기는 테이블 래퍼 박스의 엣지와 테이블 박스의 컨텐츠 엣지 사이 거리가 모두 테이블 박스의 border+padding 영역에 포함된 것처럼 레이아웃을 수행하여 결정되고, 테이블 박스가 flex item이 됩니다.
-
절대 위치 flex 컨테이너 자식의 static position 계산
시 auto 마진은 0으로 처리됨을 명확히 했습니다. (이슈 665)
이 목적에서는, align-self: auto 값이 start와 동일하게 처리되고 , auto 마진은 0으로 처리됩니다 .
-
max main size property로 플렉스 컨테이너 내재적 크기 계산 시, min main size property로 내림해야
함을 명확히 했습니다. (이슈 361)
각 라인에서, 모든 flex item 중 가장 큰 max-content flex fraction을 찾습니다. 각 아이템의 flex base size와 flex grow factor (또는 scaled flex shrink factor, 음수일 경우)를 곱한 뒤, 그 결과에 선택된 max-content flex fraction을 더하고, 아이템 크기를
bymax 및 min main size 속성에 따라yies 로 클램핑합니다. -
플렉스 컨테이너의 절대 위치 자식에 order가 적용되지 않도록 만든
변경점에 대해 누락된 편집을 추가했습니다. (이슈 1439)
적용 대상: flex item 및 flex 컨테이너의 절대 위치 자식order 속성은
플렉스 컨테이너의 자식flex item 이 flex 컨테이너 내에서 나타나는 순서를 제어하며, 아이템을 순서 그룹에 할당합니다. …플렉스 컨테이너의 절대 위치 자식은 order: 0로 처리되며, flex item과의 페인팅 순서 결정 시 참고합니다.
별도 명시 없는 한, 이 속성은
플렉스 컨테이너의 자식이 아닌 박스flex item이 아닌 박스 에는 효과가 없습니다. -
플렉스 컨테이너 기준선(first/last baseline)
결정 시 flex-direction을 고려하도록 했습니다. (이슈 995)
이를 위해, 플렉스 컨테이너의 기준선은 다음과 같이 결정됩니다 (order , 그리고 flex-direction도 고려 후):
…
-
플렉스 컨테이너의
first/last가장 시작most/가장 끝most flex line에서 기준선 정렬에 참여하는 flex item이 있으면, 플렉스 컨테이너의 first/last main-axis baseline set … -
그 외에 플렉스 컨테이너에 하나 이상의 flex item이 있으면,
first/last main-axis baseline set은 generated from
alignment baseline of
first/last가장 시작most/가장 끝most flex item. … - 그 외에는 플렉스 컨테이너에는 first/last main-axis baseline set이 없습니다. …
…
-
플렉스 컨테이너에 하나 이상의 flex
item이 있으면,
first/last cross-axis baseline set은 generated from
alignment baseline of
first/last가장 시작most/가장 끝most flex item. …
-
플렉스 컨테이너의
-
align-content: space-between이 한 개의 flex line일 때 start와 동일하게 동작하도록 정의함. (이슈 718)
줄들은 플렉스 컨테이너 내에서 고르게 분배됩니다. 남은 공간이 음수이거나 플렉스 컨테이너에 flex line이 한 개뿐이면, 이 값은 flex-start와 동일합니다.
- axis mapping table의 오류를 수정했습니다. (이슈 205)
- automatic minimum size의 정의(명시적 크기와 aspect ratio가 모두 없는 박스)에 대해 이전 rewrite에서 누락된 부분을 복원했습니다. (이슈 671)
명확화
- main size와 cross size가 플렉스 컨테이너뿐 아니라 플렉스 아이템에도 정의되어 있음을 확실히 했습니다. (이슈 981)
-
공간 내비게이션에 관한 주석의 마지막 설명 문장을 다듬었습니다.
(이슈 1677)
브라우저, 보조기술, 확장 기능 등을 포함한 사용자 에이전트는 공간 내비게이션 기능을 제공할 수 있습니다. 이 섹션은 그러한 공간 내비게이션 모드에서 요소의 순서를 결정할 때 order 속성을 존중하는 것을 금지하지 않습니다; 실제로 그러한 기능이 작동하려면 고려되어야 합니다.
그러나 순차 내비게이션을 결정할 때 order를 사용하지만, (플렉스 레이아웃을 포함하되 이에 국한되지 않는) CSS의 다양한 레이아웃 기능이 표현하는 요소 간 공간적 관계를 고려하지 않는 UA는 준수하지 않는 것입니다.하지만 공간 내비게이션 기능에는 order가 고려해야 할 유일한(혹은 주된) CSS 속성이 아닙니다. 제대로 구현된 공간 내비게이션 기능은 공간적 관계를 수정하는 모든 CSS 레이아웃 기능을 고려해야 합니다. - 기타 사소한 편집상 개선.
2016년 3월 1일 CR 이후 변경점
의견 반영 결과도 제공됩니다.
실질적 변경 및 버그 수정
-
내재적 자동 최소 크기를 계산할 때
백분율을 어떻게 처리하는지 정의했습니다.
(이슈 3)
요소의 내재적 크기를 계산할 때 (예: 요소의 min-content size), 이 값은 해당 축에서 요소의 크기를 비확정으로 만듭니다 (예: width 속성이 확정 크기를 지정했더라도). 이는 이 크기를 기준으로 계산되는 백분율이 auto로 취급됨을 의미합니다.
그럼에도 불구하고, 일부 경우 백분율을 재해결하기 위해 추가 레이아웃 패스가 필요할 수 있지만, 이 값은 (min-content, max-content, fit-content 등 [CSS-SIZING-3]에 정의된 값들과 마찬가지로) 아이템 내부의 백분율 크기 해석을 방해하지 않습니다.
- definite와 indefinite 용어가 이 모듈 내 인라인 정의가 아니라 보다 정확한 [CSS-SIZING-3]의 정의를 참조하도록 변경했습니다. (이슈 10)
- 플렉스박스의 절대 위치 자식은 더 이상 order 속성에 반응하지 않습니다. (이슈 12)
- § 8.5 Flex Container Baselines를 업데이트하여 baseline sets과 last-baseline alignment를 반영했습니다. (이슈 13))
명확화
-
§ 9.8 확정 및 비확정
크기에서
확정성의 추가 사례를 교차 참조했습니다 (이슈
2)
플렉스 라인의 교차 크기가 결정되면, 자동 크기 플렉스 컨테이너의 아이템도 레이아웃 목적상 확정으로 간주됩니다; 11단계를 참조하세요.
-
해결 불가능한 백분율 flex basis 값이
content로 변환되는 방식을 더 분명히 했습니다.
(이슈 6)
위에서 정의한 auto와 content를 제외한 모든 값에 대해, flex-basis는 수평 쓰기 모드에서의 width와 동일한 방식으로 해석됩니다 [CSS2], 단, 어떤 값이 auto로 width에서 해석될 상황이라면, flex-basis에서는 대신 content로 해석됩니다 . 예를 들어, flex-basis의 백분율 값은 플렉스 아이템의 포함 블록(즉, 플렉스 컨테이너)을 기준으로 해석되며, 그 포함 블록의 크기가 비확정이라면,
main size가 auto인 것과 동일한 결과(이 경우 content로 취급)flex-basis의 사용 값은 content가 됩니다 . -
확정 flex basis를 가진 비유연 아이템이
확정 크기를 가짐을 명확히 했습니다.
(이슈 8, 이슈 11)
플렉스 아이템은 완전히 비유연일 때, 즉 flex-grow와 flex-shrink 값이 모두 0인 경우를 말하며, 그 외에는 유연입니다.
완전히 비유연한 아이템이 확정 flex basis를 가질 경우 그 main size는 정의에 따라 확정입니다.
-
auto 값의 정의를 더 이해하기 쉽게 다시 서술했습니다.
(이슈 9)
플렉스 아이템에서 overflow가 visible이고, 메인 축에서 아이템의 메인 축 최소 크기 속성에 지정되었을 때,
다음 표는 최소 크기를 제공합니다 …자동 최소 크기를 지정합니다.일반적으로, 자동 최소 크기 … 아래에 정의됩니다:
- 플렉스 컨테이너의 절대 위치 자식의 정적 위치를 결정하는 섹션을 좀 더 명확하게 다시 서술했습니다.
- 애니메이션 가능(Animatable) 행의 형식을 조정하여 키워드 애니메이션에 대해 더 명확히 했습니다.
- 기타 사소한 편집상 개선.
2015년 5월 14일 LCWD 이후 변경점
의견 반영 결과도 제공됩니다.
실질적 변경 및 버그 수정
-
flex 축약 속성에서
생략된 변경을 되돌려
생략된 flex-basis의 값을 다시 0으로 했습니다.
이는 내재적 크기 문제를 해결하기 위한 편법이었고,
§ 9.9 내재적 크기의 올바른 구현을 고려하면
필요하지 않으며(또한 나쁜 결과를 초래합니다).
(이슈 13)
flex 축약 속성에서 생략되면, 지정 값은 0
%입니다. -
(있을 수 있는) 익명 래퍼 박스가 아니라
각 요소 자체에 대해 플렉스 아이템 결정이 작동하도록 변경했습니다.
(이슈 6)
display의 일부 값은 원래 박스 주위에 익명 박스 생성을 유발합니다. 가장 바깥 박스—플렉스 컨테이너의 직접 자식—가 플렉스 아이템이 됩니다. 예를 들어, 서로 인접한 두 자식 요소가 display: table-cell일 때, 그 주위에 생성되는 익명 테이블 래퍼 박스 [CSS2] 가 플렉스 아이템이 됩니다.
display: table인 플렉스 아이템의 경우, 테이블 래퍼 박스가 플렉스 아이템이 되며, order와 align-self 속성이 적용됩니다. 캡션 박스의 내용은 테이블 래퍼 박스의 min/max-content 크기 계산에 기여합니다. 그러나 width, height처럼, flex 롱핸드는 테이블 박스에 다음과 같이 적용됩니다: 플렉스 아이템의 최종 크기는 테이블 래퍼 박스의 엣지와 테이블 박스의 컨텐츠 엣지 사이의 거리가 모두 테이블 박스의 border+padding 영역의 일부인 것처럼 레이아웃을 수행하고, 테이블 박스가 플렉스 아이템인 것처럼 계산합니다.
참고: display의 일부 값은 원래 박스 주위에 익명 박스를 생성하는 것이 일반적입니다. 이러한 박스가 플렉스 아이템이라면, 먼저 블록화(blockify)되므로 익명 박스 생성은 발생하지 않습니다. 예를 들어, 플렉스 아이템 두 개가 display: table-cell이라면 단일 익명 테이블로 감싸지는 대신 각각 별도의 display: block 플렉스 아이템이 됩니다.
-
박스의 min-width: auto가 부과하는 크기 조정이
해당 내용의 백분율 크기 계산 시 참조되도록 정의했습니다.
(이슈 3)
순환적인 크기 계산을 방지하기 위해, auto 값의 min-height와 max-height는 박스 내용의 백분율 크기 해석에 고려되지 않습니다. 예를 들어, 백분율 높이를 가진 블록의 플렉스 아이템 부모가 height: 120em; min-height: auto라면, 해당 플렉스 아이템의 사용 크기에 min-height가 미치는 영향과 관계없이 height: 120em을 기준으로 크기가 결정됩니다.일부 경우 백분율을 재해결하기 위해 추가 레이아웃 패스가 필요할 수 있지만, auto 값의 min-width와 min-height는 (min-content, max-content, fit-content 등 [CSS-SIZING-3]에 정의된 값들처럼) 아이템 내부의 백분율 크기 해석을 방해하지 않습니다.
-
비유연 아이템을 처리하기 위해
내재적 크기 규칙을 수정했습니다.
(이슈 1)
min-content/max-content contribution의 메인 크기는 플렉스 아이템에 대해 그 외부
가상 메인 크기(각각 min-content/max-content 제약 하에서 크기 결정 시)min-content/max-content contribution의 메인 크기는 플렉스 아이템의 외부 min-content/max-content size이며, flex base size로 최대(성장 불가 시), 최소(축소 불가 시)값을 제한하고, 이후 min/max main size properties로 추가 제한됩니다 . -
플렉스 컨테이너의
메인 축 내재적 크기 정의의 오류를 수정했습니다.
(이슈 1)
max-content 메인 크기는 플렉스 컨테이너가 max-content contributions를 유지하면서 취할 수 있는 최소 크기입니다:
-
각 플렉스 아이템에 대해,
그 flex base
size의
외부
값을
max-content contribution 크기에서 뺍니다
, 그런 다음 flex grow factor로 나누되 최소 1로 내림, 혹은 결과가 음수라면 scaled flex shrink factor로 나눕니다 (필요하다면 flex shrink factor를 최소 1로 내림). 그 결과가 0이 아니라면, (양수였을 경우) 최소 1로 내린 flex grow factor로 나누거나, (음수였을 경우) 최소 1로 내린 flex shrink factor를 반영한 scaled flex shrink factor로 나눕니다. 이것이 아이템의 max-content flex fraction입니다.
-
각 플렉스 아이템에 대해,
그 flex base
size의
외부
값을
max-content contribution 크기에서 뺍니다
-
플렉스 컨테이너의
교차 축 내재적 크기 정의의 오류를 수정하고,
다중 줄 column 플렉스 컨테이너에 대해 일반적으로 구현되는 min-content 크기 휴리스틱을 명시했습니다.
(이슈 12)
min-content 교차 크기와 max-content 교차 크기는 주어진 가용 메인 축 공간과 무한대의 가용 교차 축 공간에서 레이아웃을 수행한 후의 플렉스 컨테이너의 교차 크기입니다.
단일 줄 플렉스 컨테이너의 min-content/max-content 교차 크기는 그 min-content contribution/max-content contribution 중 가장 큰 값입니다(각각).
다중 줄 플렉스 컨테이너의 경우, min-content/max-content 교차 크기는 교차 축의 min-content 제약/max-content 제약 하에서 플렉스 컨테이너를 크기 결정했을 때의 플렉스 라인 교차 크기 합입니다(각각). 다만 플렉스 컨테이너가 flex-flow: column wrap;인 경우에는, 먼저 모든 플렉스 아이템 중 가장 큰 min-content/max-content 교차 크기 기여값을 찾고(각각), 그 크기를 레이아웃 중 각 플렉스 아이템에 대한 교차 축의 가용 공간으로 사용하여 크기를 결정합니다.
이 column wrap 플렉스 컨테이너에 대한 휴리스틱은 플렉스 컨테이너가 가져야 할 크기를 합리적으로 근사합니다. 각 플렉스 아이템은 최종적으로 min(아이템 고유의 max-content, 모든 아이템 중 최대 min-content)이 되며, 각 플렉스 라인은 그 라인의 가장 큰 플렉스 아이템보다 커지지 않습니다. 일부 경우 완벽하지는 않지만, 이를 완전히 정확하게 수행하는 비용이 매우 크므로 이 방법이 실용적으로 잘 동작합니다.
-
저자가 명시적으로 동기화를 해제하려는 의도를 밝히지 않는 한,
프레젠테이션 순서와 DOM 순서를 동기화하도록
저작 도구에 대한 명시적 준수 기준을 추가했습니다.
(이슈 8)
모든 프레젠테이션 모드에서 저자가 의도한 순서를 보존하기 위해, WYSIWYG 편집기 및 웹 기반 저작 도구를 포함한 저작 도구는 기본 문서 소스를 재정렬해야 하며 저자가 명시적으로 시각적 순서와 동기화되지 않게 (음성 및 내비게이션 순서를 결정하는) 기본 문서 순서를 설정하려는 의도를 밝히지 않는 한, 재정렬을 위해 order를 사용해서는 안 됩니다.
예를 들어, 어떤 도구는 플렉스 아이템의 드래그 앤 드롭 재정렬과 화면 크기 범위별 대체 레이아웃을 위한 미디어 쿼리 처리를 모두 제공할 수 있습니다.대부분의 경우 재정렬은 모든 화면 범위뿐 아니라 내비게이션 및 음성 순서에도 영향을 미쳐야 하므로, 도구는 DOM 레이어에서 드래그 앤 드롭 재정렬을 수행할 것입니다. 하지만 경우에 따라 저자는 화면 크기별로 서로 다른 시각적 순서를 원할 수 있습니다. 도구는 미디어 쿼리와 함께 order를 사용하여 이 기능을 제공할 수 있으며, (논리적 선형 프레젠테이션 순서일 가능성이 가장 높은) 가장 작은 화면 크기의 순서는 기본 DOM 순서에 연결하고, 다른 크기 범위에서는 order를 사용해 시각적 프레젠테이션 순서를 결정할 수 있습니다.
이 도구는 준수하지만, (구현 편의성에도 불구하고) 드래그 앤 드롭 재정렬을 처리하기 위해 order만 사용하는 도구는 비준수입니다.
-
절대 위치 요소에서
align-self 또는
justify-self의 auto 값이
자체로 계산되도록 정의했습니다.
이는 [CSS-ALIGN-3]에서
이 속성의 향후 확장과의 일관성을 위한 것입니다.
(이슈 5)
절대 위치 요소에서는, auto 값이 자체로 계산됩니다. 다른 모든 요소에서는,
Aauto 값의 align-self는 부모의 align-items 값으로 계산되며, 부모가 없으면 stretch로 계산됩니다. -
백분율 마진과 패딩을
각자의 축에 상대적으로 만들었던 변경을 되돌리고,
두 가지 동작을 모두 허용하도록 했습니다.
(이슈 11, 이슈 16)
플렉스 아이템의 백분율 마진과 패딩은 항상 해당 차원을 기준으로 해석됩니다; 블록과 달리 포함 블록의 인라인 차원을 기준으로 항상 해석되지는 않습니다.
플렉스 아이템의 백분율 마진과 패딩은 다음 중 하나를 기준으로 해석될 수 있습니다:
- 자신의 축(좌/우 백분율은 너비 기준, 상/하 백분율은 높이 기준), 또는
- 인라인 축(좌/우/상/하 백분율 모두 너비 기준)
사용자 에이전트는 이 두 동작 중 하나를 선택해야 합니다.
참고: 이 다양성은 좋지 않지만, 구현 간 합의도, CSSWG 내부 합의도 없는 현재 상황을 정확히 반영합니다. 브라우저가 하나의 동작으로 수렴하는 것이 CSSWG의 의도이며, 그때 사양을 수정하여 해당 동작을 요구할 것입니다.
저자는 플렉스 아이템의 패딩이나 마진에 백분율 사용을 피해야 합니다. 브라우저마다 다른 동작을 보이게 됩니다.
-
플렉스 아이템의 크기 결정에서
min/max 제약을 처리하도록 했습니다.
- 플렉스 아이템을 위한 메인 및 교차 공간을 결정합니다. 각 차원에 대해, 해당 차원의 플렉스 컨테이너 콘텐츠 박스가 확정 크기라면 그 값을 사용하고, 해당 차원의 플렉스 컨테이너가 min 또는 max-content 제약 하에서 크기 결정 중이라면, 해당 차원의 사용 가능 공간은 그 제약입니다; 그렇지 않으면, 해당 차원에서 플렉스 컨테이너에 주어진 공간에서 플렉스 컨테이너의 마진, 보더, 패딩을 빼고 그 값을 사용합니다.
-
플렉스 컨테이너 단편화 규칙에서 부정을 수정했습니다:
이전 정의는 모든 경우에 break-inside: avoid 동작을 암시했습니다.
(이슈 5)
-
플렉스 컨테이너의 첫 번째 단편이 페이지 맨 위에 있지 않고,
그리고
일부어느 것도 플렉스 아이템이들어가지 않을남은 페이지 공간에 들어맞지 않는다면, 전체 단편을 다음 페이지로 옮깁니다.
-
플렉스 컨테이너의 첫 번째 단편이 페이지 맨 위에 있지 않고,
그리고
명확화
- 예시의 오류 수정과 함께 기타 사소한 편집상 개선.
2014년 9월 25일 LCWD 이후 변경점
의견 반영 결과도 제공됩니다.
실질적 변경 및 버그 수정
- flex-basis: auto를 원래 의미로 되돌렸습니다. 자동 콘텐츠 기반 크기를 명시적으로 지정하기 위해 flex-basis: content 키워드를 추가했습니다. (이슈 10)
-
align-content의 적용 가능성을
결과 플렉스 라인 수가 아니라 줄바꿈 가능성에 의존하도록 변경했습니다.
(이슈 4)
플렉스 컨테이너에 여러 줄이 있을 때,다중 줄 플렉스 컨테이너에서는 (비록 한 줄만 있더라도), 각 줄의 교차 크기는 필요한 최소 크기입니다 [...]플렉스 컨테이너(심지어 다중 줄인 경우라도)에 한 줄만 있을 때,단일 줄 플렉스 컨테이너에서는, 줄의 교차 크기는 플렉스 컨테이너의 교차 크기이며, align-content는 효과가 없습니다.줄을 정렬할 수 있는 교차 축의 여유 공간은 오직
여러 줄이 있는 플렉스 컨테이너에만다중 줄 플렉스 컨테이너에만 존재합니다. 왜냐하면한 줄짜리 플렉스 컨테이너에서는단일 줄 플렉스 컨테이너에서는 유일한 줄이 자동으로 공간을 채우도록 늘어나기 때문입니다.플렉스 컨테이너가
플렉스 라인이 하나뿐인 경우 (다중 줄 플렉스 컨테이너라도),단일 줄인 경우, 그리고 확정 교차 크기가 있다면, 플렉스 라인의 교차 크기는 플렉스 컨테이너의 내부 교차 크기가 됩니다.플렉스 컨테이너가
플렉스 라인이 하나뿐이면 (다중 줄 플렉스 컨테이너라도),단일 줄이라면, 줄의 교차 크기를 컨테이너의 계산된 min/max 교차 크기 속성 내로 클램핑합니다. -
강제 분할 동작을 단정하던 텍스트를 제거하고
단편화 섹션으로의 참조로 대체했습니다.
이는 사양의 충돌을 해결합니다.
(이슈 18)
연속된 아이템을 하나씩 수집하여, 다음에 수집될 아이템이 플렉스 컨테이너의 내부 메인 크기에 들어가지 않게 되는 최초 시점까지 수집합니다 ( 또는 강제 분할이 발생할 때까지 , § 10 플렉스 레이아웃 분할 참조) . [...]
CSS2.1의 page-break-before/page-break-after [CSS2] 또는 CSS3의 break-before/break-after [CSS3-BREAK] 속성이 단편화 분할을 지정하는 곳에서는 어디든 분할이 강제됩니다. -
flex shrink factor가
flex base size의
외부가 아니라 내부 값과 곱해지도록 변경했습니다.
(이슈 9)
라인에서 아직 고정되지 않은 각 아이템에 대해, flex shrink factor에
외부내부 flex base size를 곱하고, 이를 scaled flex shrink factor로 기록합니다. -
“neither”에 빠진 “n”을 다시 추가했습니다…
(이슈 6)
플렉스 아이템의 교차 크기 속성이 auto로 계산되고, 그리고 n either of the 교차 축 마진이 auto가 아닌 경우, 플렉스 아이템은 stretched가 됩니다.
-
플렉스 아이템의 플렉스된 메인 크기가
확정이 되려면
플렉스 컨테이너의
메인 크기 또한
확정이어야 함을 명시했습니다.
(이슈 20)
[만약] … 플렉스 아이템이 확정 flex basis를 가지고 또한 플렉스 컨테이너의 확정 메인 크기가 있다면, 플렉스 아이템의 메인 크기는 확정으로 취급되어야 합니다 ...
-
flex basis가
content여야
지정된 크기가 정의된다는 요구 사항을 제거했습니다.
지정된 크기는 내재적 크기보다 작다면 항상 우선해야 합니다.
이는 특히 저자 기대를 유지하는 데 중요합니다
(예:
<img src="…" width=40 height=40 title="100x100 image">
). (이슈 25)아이템의
계산된 flex-basis가 content이고, 그계산된 메인 크기 속성이 확정이라면, 지정된 크기는 그 크기입니다 - (예: display: table-cell 같은) 익명 블록 생성이 플렉스 아이템 블록화 전에 발생해야 한다는 요구를 제거했습니다. (대신, 이제 모든 자식은 abspos/float 동작과 일관되게 즉시 블록화됩니다.)
명확화
-
flex base size가 클램핑되지 않음을 명확히 했습니다.
(이슈 21)
flex base size를 결정할 때, 아이템의 min 및 max 메인 크기 속성은 무시되며 (클램핑이 발생하지 않습니다).
hypothetical main size는 아이템의 flex base size를 그 아이템의 min 및 max 메인 크기 속성에 따라 클램핑한 값입니다.
- 테이블 래퍼 박스에 대한 주석의 규범적 지위를 복원했습니다; 이전 초안에서 실수로 변경되었었습니다. (이슈 2)
- display 속성의 롱핸드에 대한 참조를 제거했습니다. 이는 CSS Display Level 3에서 제거될 예정이기 때문입니다.
-
불필요한 레이아웃 패스를 암시하지 않도록 문구를 변경했습니다.
(이슈 22)
Otherwise,
레이아웃 수행크기 산정 the item into the available space using its used flex basis in place of its main size, treating a value of content as max-content. - height: auto의 정의에서 “clamped size”를 “specified size”로 이름을 변경했습니다.
- 기타 사소한 수정.
2014년 3월 25일 LCWD 이후 변경점
Disposition of Comments도 제공됩니다.
실질적 변경 및 버그 수정
2014년 3월 25일 Last Call Working Draft 이후 다음과 같은 중요한 변경이 있었습니다.
-
min-width: auto
정의의 오류(부정 누락, 축 미지정)를 수정했습니다.
(이슈 11, 18, 30)
-
고유 비율을 가진 아이템에 대한 특별 처리를 추가하기 위해
min-width: auto의 정의를 확장하고 다시 작성했습니다.
(이슈 16, 28)
flex item에서 overflow가 visible이 아닌 경우, 다음 표가 최소 크기를 제공합니다: [표 보기]
이 키워드는 최소 크기를 다음 중 더 작은 값으로 지정합니다:- min-content size, 또는
- 그 값이 definite인 경우의 계산된 width/height.
-
min-width:
auto가 최소값으로 계산된 메인 크기를 적용하는 경우를,
flex basis가 메인 크기 속성에서 가져온 경우로만 한정하도록 조정했습니다.
(이슈 19)
… 은 다음의 경우 정의됩니다: 아이템의 계산된 flex-basis가 auto이고 계산된 메인 크기 속성이 definite인 경우 …
-
박스의 min-width: auto가 부과하는 크기 조정이
그 내용의 백분율 크기 계산 시에는 참조되지 않음을 정의했습니다.
(이슈 27)
이 변경은 이후 반대 정의로 되돌려졌습니다.
순환적인 크기 결정을 방지하기 위해, auto 값의 min-height 및 max-height는 박스 내용의 백분율 크기 해석에 고려되지 않습니다. 예를 들어, 백분율 높이를 가진 블록의 flex 아이템 부모가 height: 120em; min-height: auto라면, 해당 flex 아이템의 사용 크기에 height: 120em의 영향만을 기준으로 크기가 결정되며, min-height가 미치는 영향은 고려되지 않습니다.
- “메인 크기 속성에서 조회”와 “자동 크기” 동작을 각각 명시할 수 있도록 flex-basis에 추가 main-size 키워드를 도입했습니다. (이슈 20) 이 변경은 이후 동일한 문제를 해결하는 대안 제안( content 키워드 도입)으로 되돌려졌습니다.
-
definite한 flex basis를 가진 flex items가
main axis에서도 definite로 간주되어,
아이템 자체가 유연하더라도
백분율 크기의 자식이 해석될 수 있도록 정의했습니다.
(이슈 26)
백분율이 flex 아이템의 메인 크기를 기준으로 해석되어야 하고, 그 flex 아이템이 definite한 flex basis를 가진 경우, 메인 크기는 해당 백분율을 해석하는 목적상 definite로 취급되어야 하며, 백분율은 flex 아이템의 플렉싱된 최종 메인 크기를 기준으로 해석되어야 합니다 (즉, 아래 레이아웃 알고리즘이 해당 flex 컨테이너에 대해 완료되어 flex 아이템이 최종 크기를 얻은 이후의 크기).
-
단일 줄 flexbox의 라인 교차 크기를
컨테이너의 min/max 범위로 클램핑하도록 했습니다.
컨테이너 크기가 비확정인 경우에도 적용됩니다.
(이슈 9)
-
flex line의 사용된 교차 크기는
직전 두 단계에서 구한 수치들과 0
중 가장 큰 값입니다.
플렉스 컨테이너에 플렉스 라인이 하나뿐인 경우 (다중 줄 플렉스 컨테이너라도), 라인의 교차 크기를 컨테이너의 계산된 min 및 max 교차 크기 속성 범위로 클램핑합니다. 참고: CSS 2.1의 min/max-width/height 정의가 더 일반적으로 적용되었다면, 이 동작은 자동으로 충족되었을 것입니다.
-
flex line의 사용된 교차 크기는
직전 두 단계에서 구한 수치들과 0
중 가장 큰 값입니다.
- 새로운 Resolving Flexible Lengths 섹션의 다양한 오류를 수정하고 (2014년 3월의 flex: 0과 flex: 1 사이 연속성 확보를 위한 재작성 참고) 편집 구조를 이전 Candidate Recommendation과 일치하도록 되돌렸습니다. (이슈 3, 4, 8, 10, 15)
- 플렉스 컨테이너의 max-content 크기 결정이 플렉싱 동작을 반영하도록, 단순히 플렉스 아이템의 max-content 크기를 합산하는 대신 플렉스 분수(flex fraction)별로 정규화하도록 수정했습니다. (이슈 39)
- flex 속성이 항상 애니메이션을 허용하도록 업데이트했습니다. 이는 0과 0이 아닌 값 사이의 불연속성이 해결되었기 때문입니다. (이슈 5)
명확화
2014년 3월 25일 Last Call Working Draft 이후 다음과 같은 중요한 명확화가 있었습니다.
-
플렉스 컨테이너의 절대 위치 자식의 정적 위치가
CSS2.1의 개념 및 용어와 더 밀접하게 연관되도록
그 효과에 대한 설명을 도입하여 계산 방법을 명확히 했습니다.
(이슈 12)
ItsThe static position of an absolutely-positioned child of a flex container iscalculated by first doing full flex layout without the absolutely-positioned children, then positioning each absolutely-positioned childdetermined such that the child is positioned 마치 그 자식이 플렉스 컨테이너의 유일한 flex item인 것처럼, 자식과 플렉스 컨테이너가 모두 사용된 크기의 고정 크기 박스라고 가정하여 배치됩니다.즉, 플렉스 컨테이너의 절대 위치 자식의 정적 위치는 플렉스 레이아웃 이후에 자식의 static-position rectangle을 플렉스 컨테이너의 콘텐츠 박스로 설정하고, 플렉스 컨테이너의 justify-content 값과 자식 자신의 align-self 값에 따라 이 사각형 안에서 절대 위치 자식을 정렬하여 결정됩니다.
-
order의
적용을 플렉스 컨테이너의 절대 위치 자식에 대해 명확히 했습니다.
(참고: 이 동작은 이후 철회되었습니다.)
플렉스 컨테이너의 절대 위치 자식은 플렉스 레이아웃에 참여하지 않습니다
beyond the reordering step. 하지만 재정렬 단계( order 참조)에는 참여하며, 이는 페인팅 순서에 영향을 줍니다.order 속성은
flex items플렉스 컨테이너의 자식 이 플렉스 컨테이너 내에서 표시되는 순서를 제어합니다…향후 명세에서 달리 규정하지 않는 한, 이 속성은
flex items플렉스 컨테이너의 자식 이 아닌 박스에는 영향을 주지 않습니다.참고: 플렉스 컨테이너의 절대 위치 자식은 플렉스 레이아웃에는 참여하지 않지만, 플렉스 아이템 자식들과 함께 재정렬됩니다.
-
특수 동작(예: 확정성) 목적을 위해
stretched 플렉스 아이템이 무엇인지 명확히 했습니다.
(이슈 25)
플렉스 아이템의 교차 크기 속성이 auto로 계산되고, 교차 축 마진 중 하나라도 auto이면, 그 플렉스 아이템은 stretched입니다. 그
its사용 값 …
2012년 9월 18일 Candidate Recommendation 이후 변경점
Disposition of Comments도 제공됩니다.
실질적 변경 및 버그 수정
2012년 9월 18일 Candidate Recommendation 이후 다음과 같은 중요한 변경이 있었습니다:
-
auto인 min-width/min-height의 새로운 초기값 동작을 다음과 같이 변경했습니다:
- overflow가 visible인지 고려합니다. overflow가 명시적으로 처리되는 경우, 모든 콘텐츠를 표시할 만큼 크기를 강제하는 것은 혼란스럽고(또한 불필요) 하기 때문입니다.
- 암시된 최소값이 지정된 크기보다 커지는 일이 없도록, 지정된 width/height를 고려합니다.
- 플렉스 아이템에서는 자기 자신으로 계산되도록( min-content로 계산되지 않도록) 합니다. (위 변경으로 인해 두 값이 더 이상 동등하지 않기 때문입니다).
- auto
-
플렉스 아이템의 최소 메인 크기 속성 값으로 사용될 때, 이 키워드는 아이템이 그 내용을 담을 수 있을 만큼 충분히 크도록 최소값을 min-content size로 지정합니다.
이 값은 ([CSS-SIZING-3])가 충분히 성숙해지면 min-content 키워드로 계산되도록 의도되어 있습니다.
flex item에서 overflow가 visible이 아닌 경우, 이 키워드는 최소 크기를 다음 중 더 작은 값으로 지정합니다:
- min-content size, 또는
- 그 값이 definite인 경우의 계산된 width/height.
-
플렉스 아이템의 백분율 마진/패딩은
블록처럼 포함 블록의 인라인 차원이 아닌,
각자의 차원을 기준으로 해석되도록 규정했습니다.
(이슈 16)
flex items의 백분율 마진과 패딩은 항상 각각의 차원을 기준으로 해석됩니다; 블록과 달리, 포함 블록의 인라인 차원을 기준으로 항상 해석되지는 않습니다.
-
단일 줄 플렉스 컨테이너의 크기의 확정성이
stretched 아이템에도 전달되도록 했습니다.
(이슈 3)
stretched된 flex items 처리를 위한 특수 케이스로, single-line flex container가 definite한 교차 크기를 가지면, align-self: stretch인 모든 flex item의 외부 교차 크기는 플렉스 컨테이너의 내부 교차 크기(아이템의 min/max 교차 크기로 클램핑)이며, definite로 간주됩니다.
-
stretched된 auto-height 플렉스 아이템 내부의 백분율이
해석될 수 있도록, 재레이아웃 패스를 요구하도록 허용했습니다.
(이슈 3)
플렉스 아이템이 align-self: stretch인 경우, 그 내용에 대해 레이아웃을 다시 수행하되, 이 사용된 크기를 definite한 교차 크기로 취급하여 백분율 크기 자식이 해석될 수 있도록 합니다.
참고: 이 단계는 플렉스 아이템의 메인 크기에는 영향을 주지 않습니다. 고유 종횡비를 가진 경우라도 마찬가지입니다.
-
고유 종횡비가
main-size 계산에 반영되도록 허용했습니다. (이슈 8)
플렉스 아이템이 …
- 고유 종횡비를 가지고,
- flex basis가 auto이며,
- definite한 교차 크기를 가지면
그때 flex base size는 내부 교차 크기와 flex item의 고유 종횡비로부터 계산됩니다.
-
메인 크기가 교차 크기에 의존할 때
hypothetical
main size를 정의했습니다.
(이슈 23)
메인 크기를 결정하는 데 교차 크기가 필요하고 (예: flex item의 메인 크기가 그 블록 축에 있을 때), 그 flex item의 교차 크기가 auto이며 definite가 아니라면, 이 계산에서 fit-content를 flex item의 교차 크기로 사용합니다.
-
플렉스 컨테이너의 내재적
크기를 정의했습니다.
플렉스 컨테이너의 메인 크기를 결정합니다 메인 크기 속성을 사용합니다.
이 계산에서, 플렉스 컨테이너의 min content 메인 크기는 플렉스 컨테이너 아이템들의 min-content size 기여값의 최대이며, 플렉스 컨테이너의 max content 메인 크기는 플렉스 컨테이너 아이템들의 max-content size 기여값의 합입니다. 아이템의 min-content/max-content 메인 크기 기여값은 각각 min-content/max-content 제약 하에서 크기 결정 시의 외부 hypothetical main size입니다.이 계산을 위해, 플렉스 아이템의 ‘auto’ 마진은 ‘0’으로 취급합니다.max-content 메인 크기는 flex container의 max-content 기여값을 메인 축에서 합산한 값입니다. single-line 플렉스 컨테이너의 min-content 메인 크기는 min-content 기여값의 합이며; multi-line 컨테이너의 경우, 그 기여값 중 최대입니다.
플렉스 컨테이너의 min-content 교차 크기 및 max-content 교차 크기는, 주어진 가용 메인 축 공간과 무한대의 가용 교차 축 공간에서 레이아웃을 수행한 후의 플렉스 컨테이너의 교차 크기입니다.
min-content/max-content 기여값의 메인 크기는 flex item에 대해 hypothetical main size의 외부 크기이며, 각각 min-content/max-content 제약 하에서 크기 결정 시의 값입니다.
이 섹션의 용어 정의는 [CSS-SIZING-3]을 참조하세요.
-
플렉스 라인 크기 결정에서의 누락을 수정하여,
single-line 플렉스 박스가
definite한 크기가 없으면 그 내용에 맞춰 크기 결정되도록 했습니다.
플렉스 컨테이너에 flex line이 하나뿐인 경우 (비록 multi-line flex container일지라도) 그리고 definite한 교차 크기를 가진 경우 , flex line의 교차 크기는 flex container의 내부 교차 크기가 됩니다.
-
플렉스 라인의 크기는 0으로 바닥(floor) 처리됩니다.
(이슈 2)
플렉스 라인의 사용된 교차 크기는
larger가장 큰 값이며, 직전 두 단계에서 구한 수치들과 0 중에서 결정됩니다. -
플렉스 아이템은 블록이 아닌
인라인 블록처럼 페인팅됩니다.
(이슈 18)
Flex items는
일반 흐름의 블록 레벨 요소인라인 블록 [CSS2] 과 정확히 동일하게 페인팅됩니다. -
flex-basis가 생략된 flex 축약 속성이
이제 0px 대신 0%로 해석됩니다.
비확정 크기를 기준으로 해석되는 백분율은 auto처럼 동작하기 때문에,
이는 shrink-wrap된 플렉스 컨테이너에서 더 나은 동작을 제공합니다.
(이슈 20)
flex 축약 속성에서 생략되면, 지정 값은 0%
길이 0입니다. -
해석 불가능한 백분율 flex base size는
auto로 취급됨을 정의했습니다.
flex-basis의 백분율 값은 플렉스 아이템의 포함 블록(즉, 플렉스 컨테이너)을 기준으로 해석되며, 그 포함 블록의 크기가 indefinite인 경우, 결과는
정의되지 않습니다main size가 auto인 것과 동일합니다 . -
flex
containers의 절대 위치 자식의 정적 위치를
Grid Layout과 일관되도록 단순화했습니다.
(이슈 6)
플렉스 컨테이너의 flex container의 절대 위치 자식은 재정렬 단계를 넘어서는 플렉스 레이아웃에 참여하지 않습니다.
다만, left와 right 모두 또는 top과 bottom 모두가 auto이면, 해당 속성의 사용 값은 다음과 같이 정적 위치에서 계산됩니다:
left와 right가 모두 auto이면, flex item은 그 main-start 또는 cross-start 엣지(가로 축에 해당하는 쪽)가 static position에 맞춰지도록 배치되어야 합니다. top과 bottom이 auto이면, flex item은 그 main-start 또는 cross-start 엣지(세로 축에 해당하는 쪽)가 static position에 맞춰지도록 배치되어야 합니다.
main axis에서,
- 동일한 flex line에 이후의 in-flow flex item이 있다면, static position은 그 flex item의 외부 main-start 엣지입니다.
- 그렇지 않고 동일한 flex line에 이전의 in-flow flex item이 있다면, static position은 그 flex item의 외부 main-end 엣지입니다.
- 그렇지 않으면, static position은 플렉스 컨테이너의 justify-content 값에 의해 결정되며, static position이 크기 0의 플렉스 아이템으로 대표된다고 가정합니다.
교차 축에서,
- 이전의 in-flow flex item이 있다면, static position은 그 아이템이 속한 flex line의 cross-start 엣지입니다.
- 그렇지 않으면, static position은 첫 번째 flex line의 cross-start 엣지입니다.
정적 위치는 플렉스 레이아웃에 참여하는 익명 0×0 in-flow flex-start 정렬 플렉스 아이템의 위치와 대체로 일치하도록 의도되었습니다. 주요 차이는 justify-content: space-around 또는 justify-content: space-between으로 인한 패킹 공간이 가상의 아이템 주변에서 억제된다는 점입니다: 뒤에 실제 아이템이 있다면 그 아이템과 가상 아이템 사이에서, 없다면 (있다면) 이전 아이템과의 사이에서 억제됩니다.
정적 위치는 먼저 절대 위치 자식 없이 전체 플렉스 레이아웃을 수행하고, 그 다음 각 절대 위치 자식을 마치 그 자식이 해당 flex container의 유일한 flex item인 것처럼 배치함으로써 계산됩니다. 이때 자식과 flex container 모두 사용된 크기의 고정 크기 박스라고 가정합니다.
예를 들어, 기본적으로 플렉스 컨테이너의 절대 위치 자식의 정적 위치는 main-start/cross-start 코너에 맞춰지며, 이는 플렉스 컨테이너의 justify-content 및 align-content의 기본값에 대응합니다. 그러나 justify-content:center를 flex container에 설정하면, 메인 축에서 가운데 정렬됩니다. - 유연한 길이 해결 알고리즘을 변경하여, 플렉스 계수의 합이 0에 가까워질 때 동작이 연속적이 되도록 했습니다. (합 ≥ 1인 경우에는 변경 없음) (이슈 30) 기존 섹션을 현재 섹션으로 대체합니다.
명확화
다음과 같은 중요한 명확화도 이루어졌습니다:
-
용어 혼동을 피하기 위해,
플렉스 컨테이너의 절대 위치 자식은 더 이상 "flex items"라고 부르지 않습니다. (??)
Name: order Applies to: flex items 및 flex containers의 절대 위치 자식 플렉스 아이템을 재정렬합니다 그리고 플렉스 컨테이너의 절대 위치 자식도 그들의 order에 따라 재정렬합니다.
-
float가 여전히 계산된 display에 영향을 주며
(이는 플렉스 아이템 결정 이전에 실행되는 박스 수정 규칙에 영향을 줄 수 있음)을 명확히 했습니다.
(이슈 7)
float와 clear는 flex item에 영향을 주지 않으며 , 이를 흐름 밖으로 빼지도 않습니다. 그러나 float 속성은 display 속성의 계산 값에 영향을 주어 박스 생성에 여전히 영향을 줄 수 있습니다.
-
“white space”의 의미를 명확히 했습니다. (이슈 26)
하지만, white space만 포함하는 익명 플렉스 아이템은 (즉, white-space 속성의 영향을 받을 수 있는 문자) display:none인 것처럼 렌더링되지 않습니다.
- 내부 테이블 요소에 대해, 테이블 익명 박스 생성이 계산 값 변환 대신 발생함을 명확히 했습니다.
-
display-inside / display-outside
(display의 새로운 롱핸드, CSS Display Module Level 3에 정의됨)와
플렉스 아이템 결정의 상호작용을 명확히 했습니다.
flex container를 생성하는 요소의 in-flow 자식의 지정된 display-outside가 inline-level이면, block-level로 계산됩니다. (이는 사실상 모든 인라인 display 값을 블록 동등값으로 변환합니다.)
- overflow가 플렉스 컨테이너에 적용됨을 명확히 했습니다.
- 플렉스 컨테이너는 블록 컨테이너가 아니므로, ::first-line과 ::first-letter 의사 요소가 적용되지 않음을 명확히 했습니다.
-
stretch는 교차 크기 속성의 계산된 값이
auto인지 확인한다는 점을 명확히 했습니다.
이는 (definite 크기에 대해 해석되지 않아서) auto처럼 동작하는 백분율 교차 크기가
stretched되지 않음을 의미합니다.
(이슈 5)
각 플렉스 아이템의 사용된 교차 크기를 결정합니다. 플렉스 아이템이 align-self: stretch이고, 그 계산된 교차 크기 속성이 auto이면, …
-
플렉스 컨테이너의 메인 크기 결정에는
해당 포맷팅 컨텍스트의 규칙이 사용됨을 명확히 했습니다.
플렉스 컨테이너의 메인 크기를 결정합니다 참여하는 포맷팅 컨텍스트의 규칙을 사용하여
그 메인 크기 속성으로. - 페인팅 시 원시 문서 순서 대신 order로 수정된 문서 순서가 사용됨을 명확히 했습니다. (이는 이미 order 섹션에 명시되어 있었지만, 페인팅 순서에 대한 섹션에선 명시되지 않았습니다.)
-
음수 크기의 플렉스 아이템과
라인 끝의 크기 0 아이템을 정확히 처리하도록 줄바꿈을 명확히 했습니다.
(이슈 1)
그렇지 않으면, 첫 번째 미수집 아이템부터 시작하여, 연속된 아이템을 하나씩 수집합니다. 다음에 수집될 다음 아이템이 플렉스 컨테이너의 내부 메인 크기에 들어가지 않게 되는 최초 시점까지, 또는 강제 분할이 발생할 때까지 수집합니다. 첫 번째 미수집 아이템이 들어가지 않는 경우에는, 그 아이템만 라인에 수집합니다
플렉스 컨테이너의 내부 메인 크기에 들어갈 수 있는 (또는 강제 분할이 발생할 때까지, 단 최소 하나는) 가능한 많은 연속 플렉스 아이템을 하나의 플렉스 라인에 수집합니다.참고:
메인 크기 0인 아이템은 플렉스 컨테이너의 첫 번째 아이템이거나 강제 분할 뒤가 아닌 이상 라인의 시작에 오지 않습니다."가능한 만큼 수집" 규칙은 마지막의 비 0 아이템이 라인을 정확히 "가득 채웠더라도",그들크기 0의 플렉스 아이템 을 이전 라인의 끝으로 함께 수집합니다. -
플렉스 컨테이너의 교차 크기는
플렉스 컨테이너의 min/max 속성에 의해 여전히 클램핑됨을 명확히 했습니다.
(이슈 24)
- 교차 크기 속성이 definite 크기라면, 그 값을 사용하되, flex container의 min 및 max 교차 크기 속성에 따라 클램핑합니다 .
- 그렇지 않으면, 플렉스 라인의 교차 크기 합을 사용하되, flex container의 min 및 max 교차 크기 속성에 따라 클램핑합니다 .
프라이버시 고려사항
이 명세에 대해 보고된 새로운 프라이버시 고려사항은 없습니다.
보안 고려사항
이 명세에 대해 보고된 새로운 보안 고려사항은 없습니다.
테스트
the order property, now in css-display-3
- order-interpolation.html (실시간 테스트) (source)
- flexbox-anonymous-items-001.html (실시간 테스트) (source)
- flexbox_order-abspos-space-around.html (실시간 테스트) (source)
- flexbox_order-box.html (실시간 테스트) (source)
- flexbox-order-from-lowest.html (visual test) (source)
- flexbox_order.html (실시간 테스트) (source)
- flexbox_order-noninteger-invalid.html (실시간 테스트) (source)
- flexbox-order-only-flexitems.html (실시간 테스트) (source)
- flexible-order.html (실시간 테스트) (source)
- flex-item-z-ordering-001.html (실시간 테스트) (source)
- flex-item-z-ordering-002.html (실시간 테스트) (source)
- flex-order.html (실시간 테스트) (source)
- flexbox_computedstyle_order.html (실시간 테스트) (source)
- flexbox_computedstyle_order-inherit.html (실시간 테스트) (source)
- flexbox_computedstyle_order-integer.html (실시간 테스트) (source)
- flexbox_computedstyle_order-invalid.html (실시간 테스트) (source)
- flexbox_computedstyle_order-negative.html (실시간 테스트) (source)
- order-001.htm (visual test) (source)
- order-abs-children-painting-order-different-container.html (실시간 테스트) (source)
- order-abs-children-painting-order.html (실시간 테스트) (source)
- order-with-column-reverse.html (실시간 테스트) (source)
- order-with-row-reverse.html (실시간 테스트) (source)
- order-painting.html (실시간 테스트) (source)
- order_value.html (실시간 테스트) (source)
- order-computed.html (실시간 테스트) (source)
- order-invalid.html (실시간 테스트) (source)
- order-valid.html (실시간 테스트) (source)
print stuff
- break-nested-float-in-flex-item-001-print.html (실시간 테스트) (source)
- break-nested-float-in-flex-item-002-print.html (실시간 테스트) (source)
- flexbox-break-request-horiz-001a.html (실시간 테스트) (source)
- flexbox-break-request-horiz-001b.html (실시간 테스트) (source)
- flexbox-break-request-horiz-002a.html (실시간 테스트) (source)
- flexbox-break-request-horiz-002b.html (실시간 테스트) (source)
- flexbox-break-request-vert-001a.html (실시간 테스트) (source)
- flexbox-break-request-vert-001b.html (실시간 테스트) (source)
- flexbox-break-request-vert-002a.html (실시간 테스트) (source)
- flexbox-break-request-vert-002b.html (실시간 테스트) (source)
- inline-flexbox-vertical-rl-image-flexitem-crash-print.html (실시간 테스트) (source)
non-specific crashers
- contain-size-layout-abspos-flex-container-crash.html (실시간 테스트) (source)
- frame-flex-item-crash.html (실시간 테스트) (source)
- frameset-crash.html (실시간 테스트) (source)
- grandchild-span-height.html (실시간 테스트) (source)
- min-height-min-content-crash.html (실시간 테스트) (source)
- mixed-containing-blocks-crash.html (실시간 테스트) (source)
- negative-available-size-crash.html (실시간 테스트) (source)
- negative-flex-margins-crash.html (실시간 테스트) (source)
- negative-flex-rounding-crash.html (실시간 테스트) (source)
- negative-item-margins-002-crash.html (실시간 테스트) (source)
- negative-item-margins-crash.html (실시간 테스트) (source)
- orthogonal-flex-item-crash.html (실시간 테스트) (source)
- position-absolute-scrollbar-freeze.html (실시간 테스트) (source)
- position-relative-with-scrollable-with-abspos-crash.html (실시간 테스트) (source)
- relayout-input.html (실시간 테스트) (source)
- remove-out-of-flow-child-crash.html (실시간 테스트) (source)
- zero-content-size-with-scrollbar-crash.html (실시간 테스트) (source)
need quirks mode
- fixed-table-layout-with-percentage-width-in-flex-item.html (실시간 테스트) (source)
- percentage-size-quirks-002.html (실시간 테스트) (source)
- percentage-size-quirks.html (실시간 테스트) (source)
- quirks-auto-block-size-with-percentage-item.html (실시간 테스트) (source)
css box 3 tests
- percentage-padding-001.html (실시간 테스트) (source)
- percentage-padding-002.html (실시간 테스트) (source)
- percentage-padding-003.html (실시간 테스트) (source)
- percentage-padding-004.html (실시간 테스트) (source)
- percentage-padding-005.html (실시간 테스트) (source)
unsure/nonspecific
- remove-wrapped-001.html (실시간 테스트) (source)
- remove-wrapped-002.html (실시간 테스트) (source)
- scrollbars-auto-min-content-sizing.html (실시간 테스트) (source)
- select-element-multiple.html (실시간 테스트) (source)
- shrinking-column-flexbox.html (실시간 테스트) (source)
- table-as-item-large-intrinsic-size.html (실시간 테스트) (source)
- table-with-float-paint.html (실시간 테스트) (source)