2017-03-20 10 views
1

異なるサイズのコンテナ内に同じサイズのアイテム(数は異なる場合があります)のフローグリッドを表示するコンポーネントを作成しようとしています。私はできるだけ大きく(その比率を維持しながら)大きなアイテムを入れ、内部にうまく収めておいてできるだけ容器をいっぱいにしたいと思います。css flex - アイテムのサイズを最大化しながら異なるサイズのコンテナを保持しています

ハードコードされた縮尺の値でスニペットを作成しましたが、私の質問は - 縮尺を自動的に行うことができますか? 少なくとも、どのような方法で計算を行うことを提案できますか?

私が考えることができる唯一のことは、さまざまなスケールを試して最終的な面積を測定することですが、それは非常にエレガントではありません。ここで

おかげ

function set_state(cls, scl) { 
 
    document.getElementById("cont").className = cls; 
 

 
    [].slice.call(document.getElementsByClassName("it")) 
 
    .map((e) => { 
 
     e.style.width = 50 * scl + 'px'; 
 
     e.style.height = 70 * scl + 'px'; 
 
    }); 
 

 
}
#cont { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    align-content: center; 
 
    align-items: center; 
 
    justify-content: center; 
 
    background-color: #00ff00; 
 
} 
 

 
.it { 
 
    width: 50px; 
 
    height: 70px; 
 
    margin: 10px; 
 
    background-color: #b33; 
 
} 
 

 
.shape1 { 
 
    width: 300px; 
 
    height: 200px; 
 
} 
 
.shape2 { 
 
    width: 200px; 
 
    height: 400px; 
 
} 
 
.shape3 { 
 
    width: 300px; 
 
    height: 500px; 
 
} 
 
.shape4 { 
 
    width: 290px; 
 
    height: 280px; 
 
} 
 
.shape5 { 
 
    width: 210px; 
 
    height: 380px; 
 
}
No Scale 
 
<button onClick='set_state("shape1", 1)'>shape 1</button> 
 
<button onClick='set_state("shape2", 1)'>shape 2</button> 
 
<button onClick='set_state("shape3", 1)'>shape 3</button> 
 
<button onClick='set_state("shape4", 1)'>shape 4</button> 
 
<button onClick='set_state("shape5", 1)'>shape 5</button> 
 

 
<br/><br/> 
 
Scale 
 
<button onClick='set_state("shape1", .8)'>shape 1</button> 
 
<button onClick='set_state("shape2", .92)'>shape 2</button> 
 
<button onClick='set_state("shape3", 1.45)'>shape 3</button> 
 
<button onClick='set_state("shape4", 1)'>shape 4</button> 
 
<button onClick='set_state("shape5", 1)'>shape 5</button> 
 

 
<br/><br/><br/><br/> 
 

 
<div id="cont" class="shape5"> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
</div>

答えて

1

flex : x x x;max-widthmin-widthとCSSのデモ+ textareaのようにサイズを変更することができます包装容器です。

javascriptで設定した内容と似ています。設定する

値はflex-basismax/min-width擬似要素の垂直paddingあります。

比率は擬似要素を介して設定されます。

#cont { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    margin: 1em; 
 
    padding: 15px; 
 
    justify-content:center; 
 
} 
 

 
.it { 
 
    background: tomato; 
 
    margin:1em; 
 
    flex:1 0 15%; 
 
    max-width:15%; 
 
    min-width:100px; 
 
} 
 
.it:before { 
 
    content:''; 
 
    display:block;; 
 
    padding-top:100%; 
 
} 
 
/* demo purpose */ 
 
.resize { 
 
    resize: both; 
 
    border: solid; 
 
    overflow: scroll; 
 
    text-align:center; 
 
}
<div class="resize"> 
 
<h1> to run in full page mode to test behavior</h1> 
 
    <div id="cont"> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    <div class="it">&nbsp;</div> 
 
    </div> 
 
</div>

私は質問:)

+0

遅い返事申し訳ありませんを理解している場合... ...残念ながら、それは私が達成しようとしたものではありません。私の目標は、内部のアイテムを可能な限り大きくしながら、使用可能なスペースを埋めるようなレスポンシブなレイアウトを作成することです...あなたの答えをありがとう。 – xims

+1

@ximsフレックス:1;児童への最小幅はラッピングをしなければならないが、比率は保持されない。すべての行が異なる高さを持つ可能性があり、最後の行が完全にそれを埋めるためにいくつかの最後の項目を拡張します。私は、比率がどこにあるか疑問に部分的に誤解していると思う。 :) http://codepen.io/anon/pen/GWxooj –

+0

ここに私のcodepenは、それよりも見やすくなっています - http://codepen.io/xim/pen/VpXMGXそれはアイテムが保管されていることが重要です同じ比率。そして、問題は、行の中のいくつのアイテムが最大限のカバレッジを与えるかわからないということです。おそらく、それを確認することはできません。ありがとうございました! – xims

関連する問題