私は動的に私のページに合わせてサイズ変更される8項目を表示するためにフレックスボックスを使用しています。アイテムを2行に分割するように強制するにはどうすればよいですか。 (1行につき4)
これは関連する断片です:
(またはjsfiddleをお望みの場合 - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
コンテナにflex-wrap: wrap
があります。これは、nowrap
( source )であるデフォルト値を上書きするので、それは良いことです。これが、アイテムが 場合によっては でグリッドを形成するために折り返されない理由です。
この場合、主な問題はフレックスアイテムのflex-grow: 1
です。
flex-grow
プロパティは実際にはフレックスアイテムのサイズを決めません。その仕事は、コンテナー( source )内の空きスペースを分配することです。したがって、画面サイズがいくら小さくても、各項目にはライン上の空きスペースの比例部分が表示されます。
具体的には、コンテナには8つのフレックスアイテムがあります。 flex-grow: 1
を指定すると、それぞれの行の空き容量の1/8を受け取ります。アイテムにはコンテンツがないため、幅が0に縮小されて折り返されることはありません。
解決策はアイテムの幅を定義することです。これを試して:
.parent {
display: flex;
flex-wrap: wrap;
}
.child {
flex: 1 0 21%; /* explanation below */
margin: 5px;
height: 100px;
background-color: blue;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
flex
速記でflex-grow: 1
を定義した場合、flex-basis
を25%にする必要はありません。実際には、マージンのために1行に3つの項目が含まれます。
flex-grow
は行の空きスペースを消費するので、flex-basis
は折り返しを強制するのに十分な大きさであれば十分です。この場合、flex-basis: 21%
では、余白に十分なスペースがありますが、5番目の項目に十分なスペースはありません。
.child
要素に幅を追加します。あなたがそれを常に1行につき4にしたいのであれば、私は個人的にはmargin-left
のパーセンテージを使うでしょう。
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 2%;
flex-grow: 1;
height: 100px;
width: calc(100% * (1/4) - 10px - 1px);
}
これは別のやり方です。
あなたもこのようにしてそれを達成することができます:
.parent{
display: flex;
flex-wrap: wrap;
}
.child{
width: 25%;
box-sizing: border-box;
}
サンプル: https://codepen.io/capynet/pen/WOPBBm
そしてより完全なサンプル: https://codepen.io/capynet/pen/JyYaba
<style type="text/css">
.parent{
display: flex;
flex-wrap: wrap;
}
.parent .child{
flex: 1 1 25%;
}
</style>
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
それが役に立てば幸い。より詳しくはあなたはこれに従うことができます リンク
私はこれを好きなように負のマージンとcalcを使ってやります:
.parent {
display: flex;
flex-wrap: wrap;
margin-top: -10px;
margin-left: -10px;
}
.child {
width: calc(25% - 10px);
margin-left: 10px;
margin-top: 10px;
}
デモ: https://jsfiddle.net/9j2rvom4/ /
.parent {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin-right: -10px;
margin-bottom: -10px;
}
.child {
background: blue;
height: 100px;
flex-grow: 1;
flex-shrink: 0;
flex-basis: calc(25% - 10px);
}
.child:nth-child(even) {
margin: 0 10px 10px 10px;
background-color: Lime;
}
.child:nth-child(odd) {
background-color: orange;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
</style>
</head>
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
</html>
;)
この例はもっと基本的で、 理解しやすい それから@dowomenfartであると思います。
.child {
display: inline-block;
margin: 0 1em;
flex-grow: 1;
width: calc(25% - 2em);
}
これは、肉にまっすぐにカットしながら同じ幅の計算を達成します。そのスケーラビリティと携帯性のため、数学はもっと簡単で、em
は new standard です。
なぜフレックスとdisplay: inline-block
?
なぜ負のマージン?
Edgeの場合(つまり、列の最初の要素)にSCSSまたはCSS-in-JSを使用するか、デフォルトのマージンを設定して、後で外側のマージンを取り除きます。
https://codepen.io/zurfyx/pen/BaBWpja
<div class="outerContainer">
<div class="container">
<div class="elementContainer">
<div class="element">
</div>
</div>
...
</div>
</div>
:root {
--columns: 2;
--betweenColumns: 20px; /* This value is doubled when no margin collapsing */
}
.outerContainer {
overflow: hidden; /* Hide the negative margin */
}
.container {
background-color: grey;
display: flex;
flex-wrap: wrap;
margin: calc(-1 * var(--betweenColumns));
}
.elementContainer {
display: flex; /* To prevent margin collapsing */
width: calc(1/var(--columns) * 100% - 2 * var(--betweenColumns));
margin: var(--betweenColumns);
}
.element {
display: flex;
border: 1px solid red;
background-color: yellow;
width: 100%;
height: 42px;
}