2017-12-19 7 views
4

フレックスボックスを使用してリストアイテムを列に表示しています。アイテムは、特定の高さの後に列を追加し、列を水平に中央に配置し、各列のリストアイテムを左揃えにする必要があります。私はmax-heightを使用してリストの高さを制限し、flex-flow: column wrapはラッピングカラムを作成し、align-content: centerはカラムを中央に配置します。フレックスカラムは、ラップされたときにのみ中心になります。

私はmulti-columnソリューションがより明白かもしれないことを認識していますが、column-widthまたはcolumn-countを定義したくないので、私はflexboxソリューションを選択しました。アイテムが複数の列に折り返す場合

通報
列は水平方向にのみ集中しています。列が1つだけの場合、列は中央に配置されません。 Windows 10 HomeとMacOS Sierraの両方でChrome 63でこの動作が確認されています。 Firefoxでは、それは私が意図した方法(以下のスクリーンショット)に見えます。

何か不足していますか?
どのようにして列を常にブラウザの横方向に中央に配置することができますか?

.filter_drop { 
 
    display: flex; 
 
    flex-flow: column wrap; 
 
    align-content: center; 
 
    list-style: none; 
 
    margin: 0; 
 
    padding: 0; 
 
    max-height: 7em; 
 
    border-bottom: 1px solid black; 
 
} 
 

 
.filter_drop li { 
 
    margin: 0 1em 0 0; 
 
    line-height: 1.2; 
 
}
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two </li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
    <li>Five</li> 
 
    <li>Six</li> 
 
    <li>Seven</li> 
 
    <li>Eight </li> 
 
    <li>Nine</li> 
 
    <li>Ten</li> 
 
    <li>Eleven</li> 
 
    <li>Twelve</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
    <li>Five</li> 
 
    <li>Six</li> 
 
    <li>Seven</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
</ul>

View on JSFiddle


クローム63:
Chrome Layout

Firefoxの57:
Firefox Layout

+1

興味のある方/ Oの固定幅を割り当てるwは、_left align_の修正があります:https://jsfiddle.net/gznyyegn/ ...あなたが好きなら、これを回答として投稿することができます。 'translate'はさらに別のFlexboxのバグを克服するために必要です:https://stackoverflow.com/questions/33891709/when-flexbox-items-wrap-in-column-mode-container-does-not-grow-its-width – LGSon

+0

ありがとう@LGSon。興味深いアイデアだが、私は仕事に集中することができなかった(https://jsfiddle.net/gznyyegn/3/)。たぶんあなたはリンクしている問題のために? – showdev

+0

はい、そういうわけではありませんが、要素のうちの1つで幅の広いテキストをチェックしていませんが、完全に動的に動作しないことがわかります。それは、バグを修正したエッジ(バージョン16、フォールスクリエイターアップデート)の監督で働いています:) – LGSon

答えて

1

align-contentは、フレックスコンテナに複数の行がある場合にのみ機能します。

align-itemsまたはalign-selfが必要です。

ここで完全な説明です:

.filter_drop { 
 
    display: flex; 
 
    flex-flow: column wrap; 
 
    align-content: center; 
 
    align-items: center; /* NEW */ 
 
    list-style: none; 
 
    margin: 0; 
 
    padding: 0; 
 
    max-height: 7em; 
 
    border-bottom: 1px solid black; 
 
} 
 

 
.filter_drop li { 
 
    margin: 0 1em 0 0; 
 
    line-height: 1.2; 
 
}
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two </li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
    <li>Five</li> 
 
    <li>Six</li> 
 
    <li>Seven</li> 
 
    <li>Eight </li> 
 
    <li>Nine</li> 
 
    <li>Ten</li> 
 
    <li>Eleven</li> 
 
    <li>Twelve</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
    <li>Five</li> 
 
    <li>Six</li> 
 
    <li>Seven</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
    <li>Four</li> 
 
</ul> 
 
<ul class="filter_drop"> 
 
    <li>One</li> 
 
    <li>Two</li> 
 
    <li>Three</li> 
 
</ul>

+0

それは助けているようです。しかし、私はリストの項目を左にテキストで整列させ、各列を左揃えにします。申し訳ありませんが、私はそれを言及すべきでした。 – showdev

+0

FFイメージは私が欲しいものです。列は中央揃えされていますが、各列内の項目は左詰めです。私はmult vs single-line flexboxについてリンクした記事を読んでいます。多分、私がしようとしているのは、フレックスボックスの仕組みではない。しかしそれはFFで動作するのは奇妙です... – showdev

+2

私は理解しています。ボックスがその列に中央揃えされている理由は、ボックスを中心にして内容をシュリンクラップするためです。すべてのテキストを左揃えにするには、各ボックスの幅を同じにする必要があります。そして、すべてのボックスが同じ長さになるように*と*を配置します。 https://jsfiddle.net/78mb4zna/4/ –

関連する問題