フレックスボックスアイテム間の最小距離を設定するために、私はmargin: 0 5px
に.item
を、コンテナーにmargin: 0 -5px
を使用しています。私にとってはハックのように思えますが、これを実行するためのより良い方法を見つけることができません。
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
.item {
background: gray;
width: 50px;
height: 50px;
margin: 0 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
border-spacing
に似たものは何もありません。したがって、あなたが求めているものを達成することはもう少し難しいです。
私の経験では、:first-child
/:last-child
を使用せず、flex-wrap:wrap
を変更せずに動作する "最もクリーンな"方法は、コンテナにpadding:5px
を設定し、子にmargin:5px
を設定することです。それはそれぞれの子供たちの間そしてそれぞれの子供たちと彼らの親の間に10px
のギャップを生み出すでしょう。
.upper
{
margin:30px;
display:flex;
flex-direction:row;
width:300px;
height:80px;
border:1px red solid;
padding:5px; /* this */
}
.upper > div
{
flex:1 1 auto;
border:1px red solid;
text-align:center;
margin:5px; /* and that, will result in a 10px gap */
}
.upper.mc /* multicol test */
{flex-direction:column;flex-wrap:wrap;width:200px;height:200px;}
<div class="upper">
<div>aaa<br/>aaa</div>
<div>aaa</div>
<div>aaa<br/>aaa</div>
<div>aaa<br/>aaa<br/>aaa</div>
<div>aaa</div>
<div>aaa</div>
</div>
<div class="upper mc">
<div>aaa<br/>aaa</div>
<div>aaa</div>
<div>aaa<br/>aaa</div>
<div>aaa<br/>aaa<br/>aaa</div>
<div>aaa</div>
<div>aaa</div>
</div>
これはハックではありません。同じ方法がブートストラップとそのグリッドでも使用されていますが、マージンの代わりに、ブートストラップはそのcolにパディングを使用します。
.row {
margin:0 -15px;
}
.col-xx-xx {
padding:0 15px;
}
透明な枠線を使用できます。
私は、古いブラウザ用のテーブル+テーブルセルモデルにフォールバックできるフレックスグリッドモデルを構築しようとしているときに、この問題を考えていました。そして、コラムガターのためのボーダーは私にとって最も適切な選択のように思われました。つまり、テーブルセルには余白がありません。
例えば.
.column{
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-bottom: 10px solid transparent;
}
Flexboxにはmin-width: 50px;
が必要です。フレックスモデルは、固定したい特定の子要素に対してflex: none;
を実行しない限り固定サイズを処理しないため、"flexi"
から除外されます。 http://jsfiddle.net/GLpUp/4/ しかし、flex:none;
を含むすべての列は、もはやフレックスモデルではありません。 http://jsfiddle.net/GLpUp/5/
そのため、古いブラウザでテーブルセルのフォールバックが不要な場合は、実際には通常マージンを使用できます。 http://jsfiddle.net/GLpUp/3/
背景を使用する場合はbackground-clip: padding-box;
を設定する必要があります。そうしないと、背景が透明な境界領域に流れ込むためです。
こんにちは、下記はflexboxをサポートしているすべてのブラウザ用の私の解決策です。マイナスのマージン、ハック、回避策、純粋なCssはありません。
.flexbox {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
}
.flexbox > div {
/*
1/3 - 3 columns per row
10px - spacing between columns
*/
box-sizing: border-box;
margin-bottom: 10px;
width: calc(1/3*100% - (1 - 1/3)*10px);
}
<div class="flexbox">
<div>col</div>
<div>col</div>
<div>col</div>
<div>col</div>
<div>col</div>
<div>col</div>
</div>
これは複数の行や要素の数があってもすべての場合に有効です。
display: grid;
を使用していますが、これはプロパティです。
#box {
display: grid;
width: 100px;
grid-gap: 5px;
/* Space between items */
grid-template-columns: 1fr 1fr 1fr 1fr;
/* Decide the number of columns and size */
}
.item {
background: gray;
width: 100%;
/* width is not necessary only added this to understand that width works as 100% to the grid template allocated space **DEFAULT WIDTH WILL BE 100%** */
height: 50px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
この方法の欠点はモバイルにあります Opera Mini はサポートされません。PCではこれは IE11 の後にのみ機能します。
古い答え
欲しい場合は、常にCSS兄弟の組み合わせを使用できます。
.item+.item{
margin-left: 5px;
}
上記のコードはうまくいくでしょう。このメソッドでは、margin: 0 -5px;
を#box
ラッパーに指定する必要はありません。
あなたのためのワーキングサンプル:
#box {
display: flex;
width: 100px;
}
.item {
background: gray;
width: 50px;
height: 50px;
}
.item+.item{
margin-left: 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
私はcssのpreceded by
セレクタ~
に基づいており、不定ネスティングを可能にする解決策を見つけました。
基本的に、列コンテナーの内側では、別の子の前にあるすべての子は上マージンを取ります。同様に、すべての行コンテナー内で、別の行の前にあるすべての子には左マージンがあります。
.box {
display: flex;
flex-grow: 1;
flex-shrink: 1;
}
.box.columns {
flex-direction: row;
}
.box.columns>.box~.box {
margin-left: 5px;
}
.box.rows {
flex-direction: column;
}
.box.rows>.box~.box {
margin-top: 5px;
}
<div class="box columns">
<div class="box" style="background-color: red;"></div>
<div class="box rows">
<div class="box rows">
<div class="box" style="background-color: blue;"></div>
<div class="box" style="background-color: orange;"></div>
<div class="box columns">
<div class="box" style="background-color: yellow;"></div>
<div class="box" style="background-color: pink;"></div>
</div>
</div>
<div class="box" style="background-color: green;"></div>
</div>
</div>
Sawaの答えから続けて、これはあなたが周囲のマージンなしで項目間の固定間隔を設定することを可能にするわずかに改良されたバージョンです。
http://jsfiddle.net/chris00/s52wmgtq/49/
Safariの "-webkit-flex"バージョンも含まれています。
.outer1 {
background-color: orange;
padding: 10px;
}
.outer0 {
background-color: green;
overflow: hidden;
}
.container
{
display: flex;
display: -webkit-flex;
flex-wrap: wrap;
-webkit-flex-wrap: wrap;
background-color: rgba(0, 0, 255, 0.5);
margin-left: -10px;
margin-top: -10px;
}
.item
{
flex-grow: 1;
-webkit-flex-grow: 1;
background-color: rgba(255, 0, 0, 0.5);
width: 100px;
padding: 10px;
margin-left: 10px;
margin-top: 10px;
text-align: center;
color: white;
}
<div class="outer1">
<div class="outer0">
<div class="container">
<div class="item">text</div>
<div class="item">text</div>
<div class="item">text</div>
<div class="item">text</div>
<div class="item">text</div>
<div class="item">text</div>
</div>
</div>
</div>
あなたがアイテムの間に10px
スペースを設定したいならば、あなたはただすべてのために.item {margin-right:10px;}
をセットして、そして最後のものにそれをリセットすることができます.item:last-child {margin-right:0;}
一般的な兄弟~
または次の+
兄弟セレクタを使用して、最初の.item ~ .item {margin-left:10px;}
以外の項目に左マージンを設定するか、.item:not(:last-child) {margin-right: 10px;}
を使用することもできます。
Flexboxは非常に賢いので、グリッドを自動的に再計算して均等に分配します。
body {
margin: 0;
}
.container {
display: flex;
}
.item {
flex: 1;
background: gray;
height: 50px;
}
.item:not(:last-child) {
margin-right: 10px;
}
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
flex wrap を許可したい場合は、次の例を参照してください。
body {
margin: 0;
}
.container {
display: flex;
flex-wrap: wrap;
margin-left: -10px;
}
.item {
flex: 0 0 calc(50% - 10px);
background: gray;
height: 50px;
margin: 0 0 10px 10px;
}
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
& > * + *
セレクタを使ってflex-gap
をエミュレートすることができます(単一行用)。
#box { display: flex; width: 230px; outline: 1px solid blue; }
.item { background: gray; width: 50px; height: 100px; }
/* ----- Flexbox gap: ----- */
#box > * + * {
margin-left: 10px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
フレックスラッピング をサポートする必要がある場合は、wrapper要素を使用できます。
.flex { display: flex; flex-wrap: wrap; }
.box { background: gray; height: 100px; min-width: 100px; flex: auto; }
.flex-wrapper {outline: 1px solid red; }
/* ----- Flex gap 10px: ----- */
.flex > * {
margin: 5px;
}
.flex {
margin: -5px;
}
.flex-wrapper {
width: 400px; /* optional */
overflow: hidden; /* optional */
}
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
</div>
</div>
これは折り返し幅と固定幅の列に使用しました。ここで重要なのはcalc()
です
SCSSサンプル
$gap: 10px;
dl {
display: flex;
flex-wrap: wrap;
padding: $gap/2;
dt, dd {
margin: $gap/2;}
dt { // full width, acts as header
flex: 0 0 calc(100% - #{$gap});}
dd { // default grid: four columns
flex: 0 0 calc(25% - #{$gap});}
.half { // hall width columns
flex: 0 0 calc(50% - #{$gap});}
}
フレックスコンテナwith -x(マイナス)マージンおよびフレックスアイテムwith x(プラス)マージン または パディング)を指定すると、望ましい視覚的結果が得られます。アイテムは互いに2倍の固定ギャップ の間のみ を持ちます。
フレックスアイテムにマージンまたはパディングを使用するかどうかは、単なる好みの問題のようです。
この例では、固定ギャップを維持するためにフレックスアイテムが動的に拡大縮小されます。
.flex-container {
margin: 0 -5px;
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.flex-item {
margin: 0 5px; // Alternatively: padding: 0 5px;
flex: 1 0 auto;
}
やがて彼らはgap
プロパティをflexboxに追加するでしょう。それまでは、代わりにCSSグリッドを使用し、すでにgap
プロパティを使用し、単一行を使用することができました。マージンを扱うよりも優れています。
このようにしないでください。
.item + .item {
margin-left: 5px;
}
これは、 隣接兄弟セレクタ を使用して、最初のものを除くすべての.item
要素をmargin-left
にします。 flexboxのおかげで、これも同じように幅広い要素をもたらします。これは、垂直方向に配置された要素とmargin-top
でももちろん可能です。
私のソリューションでのFlexboxの使用親要素(コンテナ)にjustify-content
プロパティを使用し、アイテムのflex-basis
プロパティ内に余白を指定しました。次のコードスニペットを確認してください。
.container {
display: flex;
flex-flow: row wrap;
justify-content: space-around;
margin-bottom: 10px;
}
.item {
height: 50px;
display: flex;
justify-content: center;
align-items: center;
background-color: #999;
}
.item-1-4 {
flex-basis: calc(25% - 10px);
}
.item-1-3 {
flex-basis: calc(33.33333% - 10px);
}
.item-1-2 {
flex-basis: calc(50% - 10px);
}
<div class="container">
<div class="item item-1-4">1</div>
<div class="item item-1-4">2</div>
<div class="item item-1-4">3</div>
<div class="item item-1-4">4</div>
</div>
<div class="container">
<div class="item item-1-3">1</div>
<div class="item item-1-3">2</div>
<div class="item item-1-3">3</div>
</div>
<div class="container">
<div class="item item-1-2">1</div>
<div class="item item-1-2">2</div>
</div>
私はそのような場合にはしばしば+演算子を使います
#box {
display: flex;
width: 100px;
}
.item {
background: gray;
width: 50px;
height: 50px;
}
.item + .item {
margin-left: 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
これが私の解決策です。子要素にクラスを設定する必要はありません。
.flex-inline-row {
display: inline-flex;
flex-direction: row;
}
.flex-inline-row.flex-spacing-4px > :not(:last-child) {
margin-right: 4px;
}
使用法:
<div class="flex-inline-row flex-spacing-4px">
<span>Testing</span>
<span>123</span>
</div>
上記のインラインの例に加えて、同じテクニックを通常のflexの行と列に使用でき、4px以外の間隔のクラスで拡張できます。
Flexboxでは、特にラッピングが関係しているときは、溝を作成するのは面倒です。
負のマージンを使用する必要があります( 質問のように )。
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
...またはHTMLを変更します( 別の回答に示すように )。
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
... または、他の何か。
どのような場合でも、flexboxには "flex-gap
"機能( 少なくとも今のところは )が用意されていないので、うまく動作させるには醜いハックが必要です。
ただし、溝の問題は、CSSグリッドレイアウトを使用すると簡単で簡単です。
グリッド仕様は、項目とコンテナーの間のスペースを無視しながら、グリッド項目の間にスペースを作成するプロパティーを提供します。これらのプロパティは以下のとおりです。
grid-column-gap
grid-row-gap
grid-gap
(上記の両方のプロパティの省略形)最近、仕様は CSS Box Alignment Module に準拠するように更新されました。これは、すべてのボックスモデルで使用するための一連の配置プロパティを提供します。だからプロパティは今です:
column-gap
row-gap
gap
(速記)しかし、すべての グリッド対応ブラウザ が新しいプロパティをサポートしているわけではないので、以下のデモでは元のバージョンを使用します。
また、アイテムとコンテナーの間にスペースが必要な場合は、コンテナーのpadding
は問題なく機能します(以下のデモの3番目の例を参照)。
スペックより:
10.1。樋:
row-gap
、column-gap
、およびgap
プロパティ
row-gap
およびcolumn-gap
プロパティ(およびそれらのgap
省略形)をグリッドコンテナで指定すると、grid 行とグリッド列の間の溝を定義します。それらの構文は CSS Box Alignment 3 §8 Box Between Boxes で定義されています。これらの特性の効果は、影響を受けたグリッド線が太さを獲得したかのようです。2つのグリッド線の間のグリッドトラックは、それらを表す溝の間のスペースです。
.box {
display: inline-grid;
grid-auto-rows: 50px;
grid-template-columns: repeat(4, 50px);
border: 1px solid black;
}
.one {
grid-column-gap: 5px;
}
.two {
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.three {
grid-gap: 10px;
padding: 10px;
}
.item {
background: lightgray;
}
<div class='box one'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box two'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box three'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
詳しくは:
.columnify {
display: flex;
> * {
flex: 1;
&:not(:first-child) {
margin-left: 2rem;
}
}
}
.columnify {
display: flex;
}
.columnify > * {
flex: 1;
}
.columnify > *:not(:first-child) {
margin-left: 2rem;
}
<div class="columnify">
<div style="display: inline-block; height: 20px; background-color: blue;"></div>
<div style="display: inline-block; height: 20px; background-color: blue"></div>
<div style="display: inline-block; height: 20px; background-color: blue"></div>
</div>
JSFiddle で再生してください。
2番目の.item + .item
から一致させるには、セレクタで.item
を使用するだけです。
#box {
display: inline-flex;
margin: 0 -5px;
}
.item {
background: gray;
width: 10px;
height: 50px;
}
#box .item + .item {
margin-left: 10px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
これは、柔軟なボックスを使用してスペースを入れたカードUI要素のグリッドです。
私はiffyの結果でパディングとマージンを操作することによって手動でカードをスペーシングすることに失望しました。それで、これは私が非常に効果的であると思ったCSS属性の組み合わせです:
.card-container {
width: 100%;
height: 900px;
overflow-y: scroll;
max-width: inherit;
background-color: #ffffff;
/*Here's the relevant flexbox stuff*/
display: flex;
flex-direction: row;
justify-content: center;
align-items: flex-start;
flex-wrap: wrap;
}
/*Supplementary styles for .card element*/
.card {
width: 120px;
height: 120px;
background-color: #ffeb3b;
border-radius: 3px;
margin: 20px 10px 20px 10px;
}
<section class="card-container">
<div class="card">
</div>
<div class="card">
</div>
<div class="card">
</div>
<div class="card">
</div>
</section>
これが皆さん、現在、そして未来に役立つことを願っています。
と仮定します。
1、5、9番目の項目などを除くすべての項目に左マージンを設定します。各項目に固定幅を設定します。左マージンが10ピクセルの場合、各行には4つのアイテムの間に30ピクセルのマージンがあります。アイテムのパーセント幅は次のように計算できます。
100% / 4 - horizontal-border - horizontal-padding - left-margin * (4 - 1) / 4
これは、flexboxの最後の行に関する問題に対する適切な回避策です。
.flex {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin: 1em 0;
background-color: peachpuff;
}
.item {
margin-left: 10px;
border: 1px solid;
padding: 10px;
width: calc(100% / 4 - 2px - 20px - 10px * (4 - 1) / 4);
background-color: papayawhip;
}
.item:nth-child(4n + 1) {
margin-left: 0;
}
.item:nth-child(n + 5) {
margin-top: 10px;
}
<div class="flex">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
<div class="flex">
<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>
<div class="flex">
<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>
これを実行するには、確かに、きちんとした、CSS専用の方法があります(「より良い」と考えるかもしれません)。
ここに投稿されたすべての答えのうち、私はcalc()をうまく使用したものだけを見つけました(Dariusz Sikorskiによる)。しかし、「最後の行に2つの項目しかない場合は失敗します」と提示された場合、解決策は展開されませんでした。
この解決策は、マイナスのマージンに代わるものとしてOPの問題に対処し、Dariuszに提起された問題に対処します。
ノート:
calc()
を使用します - 100%/3
(33.3333%も同様に動作するはずです) 、および (1em/3)*2
.66emもうまくいくはずです) 。::after
を使用します。.flex-container {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.flex-container:after {
content: "";
}
.flex-container > div,
.flex-container:after {
box-sizing: border-box;
width: calc((100%/3) - ((1em/3)*2));
}
.flex-container > :nth-child(n + 4) {
margin-top: 1em;
}
/* the following is just to visualize the items */
.flex-container > div,
.flex-container:after {
font-size: 2em;
}
.flex-container {
margin-bottom:4em;
}
.flex-container > div {
text-align: center;
background-color: #aaa;
padding: 1em;
}
.flex-container:after {
border: 1px dashed red;
}
<h2>Example 1 (2 elements)</h2>
<div class="flex-container">
<div>1</div>
<div>2</div>
</div>
<h2>Example 2 (3 elements)</h2>
<div class="flex-container">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
これを行う最も簡単な方法は、パーセンテージを使用し、マージンを広げて幅を広げることです。
あなたがあなたの例を使っている場合、これはあなたが結局このような何かで終わることを意味します
#box {
display: flex;
}
.item {
flex: 1 1 23%;
margin: 0 1%;
}
それはあなたの値が幅に基づいていることを意味しますが、それは誰にとっても良いことではないかもしれません。
私は早く同じ問題に出くわし、それからこれに対する答えにつまずいた。それが将来の参考のために他の人を助けることを願っています。
長い答えを短くするには、あなたの子供のフレックスアイテムにボーダーを追加します。そして、あなたは好きなものにフレックスアイテム間のマージンを指定することができます。あなたが好きなら '透明'を使用することができます。
#box {
display: flex;
width: 100px;
/* margin: 0 -5px; *remove this*/
}
.item {
background: gray;
width: 50px;
height: 50px;
/* margin: 0 5px; *remove this*/
border: 1px solid black; /* add this */
}
.item.special{ margin: 0 10px; }
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item special'></div>
</div>
ボックスコンテナのネガティブマージントリックは非常にうまくいきます。これは、秩序、ラッピング、そしてそうでないものでうまく機能する別の例です。
.container {
border: 1px solid green;
width: 200px;
display: inline-block;
}
#box {
display: flex;
flex-wrap: wrap-reverse;
margin: -10px;
border: 1px solid red;
}
.item {
flex: 1 1 auto;
order: 1;
background: gray;
width: 50px;
height: 50px;
margin: 10px;
border: 1px solid blue;
}
.first {
order: 0;
}
<div class=container>
<div id='box'>
<div class='item'>1</div>
<div class='item'>2</div>
<div class='item first'>3*</div>
<div class='item'>4</div>
<div class='item'>5</div>
</div>
</div>
#box {
display: flex;
width: 100px;
}
.item {
background: gray;
width: 50px;
height: 50px;
}
/* u mean utility */
.u-gap-10 > *:not(:last-child) {
margin-right: 10px;
}
<div id='box' class="u-gap-10">
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
どのような場合でもうまくいくとは限りませんが、柔軟な子の幅(%)があり、1行あたりの項目数がわかっている場合は、nth-child
セレクタを使用して必要な要素の余白を非常に明確に指定できます。
それはあなたが「より良い」という意味に大きく依存します。この方法では、子要素や否定要素に追加のラッパーマークアップは必要ありません。
section {
display: block
width: 100vw;
}
.container {
align-content: flex-start;
align-items: stretch;
background-color: #ccc;
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
width: 100%;
}
.child-item {
background-color: #c00;
margin-bottom: 2%;
min-height: 5em;
width: 32%;
}
.child-item:nth-child(3n-1) {
margin-left: 2%;
margin-right: 2%;
}
<html>
<body>
<div class="container">
<div class="child-item"></div>
<div class="child-item"></div>
<div class="child-item"></div>
<div class="child-item"></div>
<div class="child-item"></div>
<div class="child-item"></div>
<div class="child-item"></div>
</div>
</body>
</html>
ハックを見つけたのは、自分自身が本当に必要だからです。
/* grid */
.container {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.container::after, /* this makes sure odd element goes left and not space between */
.item {
content:"";
width: calc(33.3333% - 20px);
margin-bottom: 40px;
}
/* extra styling - not important */
.item {
height: 100px;
background: #787878;
}
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
Nice flex growカテゴリもある投稿グリッドです。あなたはそれが欲しいと思う。 Codepenを参照
フレックスアイテムの間隔は、コンテナによって固定された方向にのみ設定します。フレックスコンテナが左から右に流れるように設定されている場合(flex-direction:row
)、最後のものを除いて、その子には right マージンのみを設定します。
.flex-lr{
display:flex;
flex-direction:row;
}
.flex-lr > *:not(:last-child){
margin-right:5px;
}
これは一見したところうまくいくように見えるかもしれませんが、待ってください! justify-content
がstart
またはend
以外の値に設定されている場合、これは行われるべきではありません。他のすべての値はすでにそれら自身でスペースを分配しているからです。
商品が折り返された場合はどうなりますか?次に、適切な交差軸側にもスペースを追加する必要があります。しかし、コンテナがその子のラップを許可しているかどうかを知る方法は? wrap-reverse
はどうですか?
こうしたことすべてを考慮すると、これは簡単な作業ではなく、それを超える小さなステップが必要であると思いました。
私のアプローチは、flexboxのラッパーとして機能する一連の短いクラスの構築に基づいています。これにはいくつかの利点があります。
フレックスボックスがどのように機能するのかを理解し、フレックスボックスの素晴らしさを実感するために、これらすべてを試すためのフレックスボックスデザイナーを作成しました。
http://algid.com/Flex-Designer
そのため、以下では、私が使用するクラスと1つのフロー方向の間隔(マージン)の有用性を見つけて要約します。あなたは他の人を推論するか、または上記のリンクでそれらを見つけることができるでしょう。簡潔にするため、ここではベンダープレフィックスを省略しています。
/* Flex container definition */
.flex-lr{display:flex; flex-direction:row;}
.flex-tb{display:flex; flex-direction:column;}
.flex-rl{display:flex; flex-direction:row-reverse;}
.flex-bt{display:flex; flex-direction:column-reverse;}
/* Wrapping */
.wrap{flex-wrap:wrap;}
.nowrap{flex-wrap:nowrap;}
.wrap-rev{flex-wrap:wrap-reverse;}
/* Main axis alignment */
.align-start{justify-content:flex-start;}
.align-end{justify-content:flex-end;}
.align-center{justify-content:center;}
.align-between{justify-content:space-between;}
.align-around{justify-content:space-around;}
.align-evenly{justify-content:space-evenly;}
/* Cross axis alignment */
.cross-align-start{align-items:flex-start;}
.cross-align-end{align-items:flex-end;}
.cross-align-center{align-items:center;}
.cross-align-stretch{align-items:stretch;}
.cross-align-baseline{align-items:baseline;}
/* Cross axis alignment when content is wrapped */
.wrap-align-start{align-content:flex-start;}
.wrap-align-end{align-content:flex-end;}
.wrap-align-center{align-content:center;}
.wrap-align-stretch{align-content:stretch;}
.wrap-align-between{align-content:space-between;}
.wrap-align-around{align-content:space-around;}
/* Item alignment */
.item-cross-align-start{align-self:flex-start;}
.item-cross-align-end{align-self:flex-end;}
.item-cross-align-center{align-self:center;}
.item-cross-align-stretch{align-self:stretch;}
.item-cross-align-baseline{align-self:baseline;}
.item-cross-align-auto{align-self:auto;}
そして今ここに私たちをもたらしたもの:アイテム間のスペース:
/* Flow margin (left to right) */
.flex-lr.fm-0 > *:not(:last-child){margin-right:0;}
.flex-lr.fm-1 > *:not(:last-child){margin-right:3px;}
.flex-lr.fm-2 > *:not(:last-child){margin-right:7px;}
.flex-lr.fm-3 > *:not(:last-child){margin-right:15px;}
.flex-lr.fm-4 > *:not(:last-child){margin-right:32px;}
/* Cross axis */
.flex-lr.wrap.fm-0:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap.fm-0.wrap-align-stretch.cross-align-stretch > * {margin-bottom:0;}
.flex-lr.wrap.fm-1:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap.fm-1.wrap-align-stretch.cross-align-stretch > * {margin-bottom:3px;}
.flex-lr.wrap.fm-2:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap.fm-2.wrap-align-stretch.cross-align-stretch > * {margin-bottom:7px;}
.flex-lr.wrap.fm-3:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap.fm-3.wrap-align-stretch.cross-align-stretch > * {margin-bottom:15px;}
.flex-lr.wrap.fm-4:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap.fm-4.wrap-align-stretch.cross-align-stretch > * {margin-bottom:32px;}
/* wrap reverse */
.flex-lr.wrap-rev.fm-0:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap-rev.fm-0.wrap-align-stretch.cross-align-stretch > * {margin-top:0;}
.flex-lr.wrap-rev.fm-1:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap-rev.fm-1.wrap-align-stretch.cross-align-stretch > * {margin-top:3px;}
.flex-lr.wrap-rev.fm-2:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap-rev.fm-2.wrap-align-stretch.cross-align-stretch > * {margin-top:7px;}
.flex-lr.wrap-rev.fm-3:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap-rev.fm-3.wrap-align-stretch.cross-align-stretch > * {margin-top:15px;}
.flex-lr.wrap-rev.fm-4:not(.wrap-align-stretch):not(.wrap-align-between):not(.wrap-align-around) > *, .flex-lr.wrap-rev.fm-4.wrap-align-stretch.cross-align-stretch > * {margin-top:32px;}
最後に、マークアップは次のようになります。
<div class="flex-lr cross-align-center fm-3">
<div>
Some content here...
</div>
<div>
A bit more stuff here...
</div>
<div class="flex-tb fm-3">
<div>
Now vertical content
</div>
<div>
etc.
</div>
</div>
</div>
これが私が大声でコードを呼ぶものです。