2015-12-14 19 views
8

項目が配置される.wrapという1つのdivがあります。未知の量の品目(.thing)は、4つの列に並べる必要があります(互いの上に積み重ねる)。列に要素を均等に配分する

<div class="wrap"> 
    <div class="thing"> thing1 </div> 
    <div class="thing"> thing2 </div> 
    ... 
</div> 

列が空でないように列を均等に配分する必要があります。これは非常に簡単です:

.wrap { 
    column-count: 4; 
    column-fill: balance; 
} 

しかし、はFirefoxでしか動作しません。

最新のすべてのバージョンのブラウザでこのレイアウトを達成するには、別のCSS方法がありますか?具体的には、フレックスボックスはここで助けてくれますか?

私は列として機能するために余分なdivを追加することはできませんし、JSソリューションを望んでいないことに注意してください。ここで

は均一に分布→http://jsfiddle.net/bpdtkmmt/

+0

「列が空でない」。あなたが空のスペースを埋めるために必要なものと、それらの間に '.thing'幅またはマージンを付けます。 –

+0

@ Narek-T最後の列(4番目)は、少なくとも私のために空に見えます。私はMacでChrome 47を使用しています。 – kthornbloom

+0

私のためにも、何があるべきですか?私の英語のために申し訳ありません)あなたは9項目あり、4列に分割したいと思います。ブラウザは何をする必要がありますか?あなたが最後の列を空にすることはありません8項目を配置する場合。 –

答えて

2

はい、あなたはここで-とフレキシボックスを使用することができ、それは仕事がほとんどの部分で片付ける必要がある以外の目的のレイアウトを持っているフィドルです。それは一種のハッキーです。あなたはCSSの列ルールを使用して放棄しています。バラツキが多少あるので、それ以上行/列を追加すると、値を変更する必要があります。行ごとの列数を保持するには、ラッパーの固定高さまたは高さの高さを設定する必要があります。ここから、display: flexルールを持つフレックスコンテナとしてラッパーコンテナを確立し、flex-direction: columnflex-wrap: wrapまたは略称flex-flow: column wrapのいずれかを使用して複数の列を設定します。

各列にx個の項目があることを確認するには、flex-basisルールを使用して、入力する列の割合を設定する必要があります。したがって、3つの項目を含む列にはflex-basis: 33.33%があります。 3つのアイテムからなる行が2つ、2つのアイテムからなる行が2つ必要であることを示したので、nth-childまたはnth-of-typeセレクタを使用して、10番目のエレメントから新しいフレックスベース50%を設定する必要があります。そして、もちろん、あなたがページ上で物事要素を取りたい幅のパーセンテージを設定する必要があります(4行= 25%)。すべての要素が同じサイズのあることを確認するために、あなたはフレキシボックス内のテキストを中心にしても問題のまま、しかし

を使用する必要があるとあなたがflexまたはinline-flexdisplayを設定することにより、フレックスコンテナとして物事を確立する必要がありますおよびjustify-content属性をcenterに設定して、をcolumnとします。

justify-content: center; 
flex-direction: column; 
text-align: center 

http://jsfiddle.net/hxcnoxx9/10/

このCSSはあなたの問題を解決する必要があります。

.wrap { 
    height: 180px; 
    background: linear-gradient(to right, tomato 0%, tomato 25%, slategrey 25%, slategrey 50%, tomato 50%, tomato 75%, slategrey 75%); 
    display: flex; 
    flex-direction: column; 
    flex-wrap: wrap; 
} 

.thing { 
    background: rgba(255, 255, 255, .2); 
    color: #fff; 
    width: 25%; 
    flex-basis: 33.33%; 
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .5); 
    display: inline-flex; 
    justify-content: center; 
    flex-direction: column; 
    text-align: center; 
} 

.thing:nth-child(1n+10) { 
    flex-basis: 50%; 
} 
+0

ねえ、見てくれてありがとう!私はCSSの列を放棄しても問題ありませんが、私はこの解決策に2つの問題があります。 1)最終的にいくつのアイテムがそこにあるのかわからないので、固定高さを設定することはできません.2)あなたの例で2つの '.thing' divを削除してみてください。それは3つの列になります。 – kthornbloom

+0

Alas、AFAIK AFAIK固定列数を持つflexboxソリューションでは、div/columnsの数を計算するJSソリューションがない限り、固定高さとdiv数を知る必要があります。 純粋にCSSでこれを行うことはできません。 divを削除している間に4つの列を維持したい場合は、nth-childルールの 'thing:nth-​​child(1n + 4)'を変更し、他の列には2つの項目があります。 'flex-basis'は本質的に、この場合の列の要素の高さです。 – litel

関連する問題