最も簡単で信頼性の高いソリューションは、適切な場所にフレックスアイテムを挿入することです。それらが十分に広い場合(width: 100%
)、それらは改行を強制します。
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(4n - 1) {
background: silver;
}
.line-break {
width: 100%;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="line-break"></div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="line-break"></div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="line-break"></div>
<div class="item">10</div>
</div>
しかし、それは醜く、意味的ではありません。代わりに、フレックスコンテナー内に疑似要素を生成し、それを使用order
して適切な場所に移動できます。
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(3n) {
background: silver;
}
.container::before, .container::after {
content: '';
width: 100%;
order: 1;
}
.item:nth-child(n + 4) {
order: 1;
}
.item:nth-child(n + 7) {
order: 2;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
ただし、制限があります。フレックスコンテナには、::before
および::after
疑似要素しか含めることができません。つまり、強制できる改行は2つだけです。
これを解決するには、フレックスコンテナー内ではなく、フレックスアイテム内に擬似要素を生成します。この方法では、2に制限されません。しかし、これらの疑似要素はフレックスアイテムではないため、強制的に改行することはできません。
しかし幸いにも、CSS Display L3が導入されましたdisplay: contents
(現在はFirefox 37でのみサポートされています)。
要素自体はボックスを生成しませんが、その子と疑似要素は通常どおりボックスを生成します。ボックスの生成とレイアウトのために、要素は、ドキュメントツリー内の子要素と疑似要素で置き換えられたかのように処理する必要があります。
したがってdisplay: contents
、フレックスコンテナーの子に適用し、それぞれのコンテンツを追加のラッパーでラップすることができます。次に、フレックス項目は、それらの追加のラッパーと子の疑似要素になります。
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
display: contents;
}
.item > div {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) > div {
background: silver;
}
.item:nth-child(3n)::after {
content: '';
width: 100%;
}
<div class="container">
<div class="item"><div>1</div></div>
<div class="item"><div>2</div></div>
<div class="item"><div>3</div></div>
<div class="item"><div>4</div></div>
<div class="item"><div>5</div></div>
<div class="item"><div>6</div></div>
<div class="item"><div>7</div></div>
<div class="item"><div>8</div></div>
<div class="item"><div>9</div></div>
<div class="item"><div>10</div></div>
</div>
または、Fragmenting Flex LayoutおよびCSS Fragmentationによると、Flexboxはbreak-before
、break-after
またはそれらのCSS 2.1エイリアスを使用して強制ブレークを許可します。
.item:nth-child(3n) {
page-break-after: always; /* CSS 2.1 syntax */
break-after: always; /* New syntax */
}
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
background: gold;
height: 100px;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px
}
.item:nth-child(3n) {
page-break-after: always;
background: silver;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
flexboxでの強制改行はまだ広くサポートされていませんが、Firefoxでは機能します。