フレックスボックス内のテキストを垂直に配置するにはどうすればよいですか?


424

flexboxを使用して一部のコンテンツを垂直方向に整列させたいのですが、うまくいき<li>ません。

オンラインで確認しましたが、多くのチュートリアルでは、実際align-items:centerには親のフレックス設定から取得するラッパーdivを使用していますが、この追加の要素を切り取ることはできないのでしょうか。

リストアイテムの高さが動的になるため、このインスタンスではflexboxを使用することにしました%

* {
  padding: 0;
  margin: 0;
}

html,
body {
  height: 100%;
}

ul {
  height: 100%;
}

li {
  display: flex;
  justify-content: center;
  align-self: center;
  background: silver;
  width: 100%;
  height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>

回答:


544

align-self: centeruse を使用する代わりにalign-items: center

を変更しflex-directionたり使用したりする必要はありませんtext-align

すべてが機能するように、1つの調整を加えたコードを次に示します。

ul {
  height: 100%;
}

li {
  display: flex;
  justify-content: center;
  /* align-self: center;    <---- REMOVE */
  align-items: center;   /* <---- NEW    */
  background: silver;
  width: 100%;
  height: 20%; 
}

このalign-selfプロパティはフレックスアイテムに適用されます。あなたは除きliフレックス項目ではありませんので、その親- ul-持っていないdisplay: flexか、display: inline-flex適用されます。

したがって、はulフレックスコンテナでliはなく、はフレックスアイテムでalign-selfはなく、効果はありません。

align-itemsプロパティはに似てalign-self、それが適用される以外、フレックスコンテナ

以来liフレックスコンテナで、align-items縦に子要素をセンタリングするために使用することができます。

codepenデモ


技術的には、ここに方法align-itemsalign-self働きがあります...

align-items(容器上の)プロパティは、デフォルト値の設定align-self(の項目に)。したがって、align-items: centerすべてのflexアイテムがに設定されることを意味しalign-self: centerます。

ただしalign-self、個々のアイテムのを調整することで、このデフォルトを上書きできます。

たとえば、高さが等しい列が必要な場合は、コンテナがに設定されalign-items: stretchます。ただし、1つのアイテムを上部に固定する必要があるため、に設定されていalign-self: flex-startます。


テキストはどのようにフレックスアイテムですか?

一部の人々は、テキストの実行がどのように不思議に思うかもしれません...

<li>This is the text</li>

の子要素ですli

その理由は、インラインレベルの要素によって明示的にラップされていないテキストは、インラインボックスによってアルゴリズムによってラップされるためです。これにより、匿名のインライン要素と親の子になります。

CSS仕様から:

9.2.2.1匿名インラインボックス

ブロックコンテナー要素内に直接含まれるテキストは、匿名のインライン要素として扱う必要があります。

フレックスボックス仕様は、同様の動作を提供します。

4.フレックスアイテム

フレックスコンテナーのインフローの各子はフレックスアイテムになり、フレックスコンテナー内に直接含まれる連続するテキストの各ランは、匿名のフレックスアイテムにラップされます。

したがって、のテキストliはフレックスアイテムです。


2
好きalign-items: baselineです。別のユニコード文字などから来る異なる高さのために良い
qräbnö

1
匿名インラインボックスの概念について説明し、リンクしていただきありがとうございます。試行錯誤によって達成できる効果の一部が、その方法で機能する理由を明確にするのに役立ちます。
squarecandy

39

最も投票された答えは、コンテンツ(テキスト)が要素内にラップされていた、OPによって投稿されたこの特定の問題を解決するためのinline-blockものです。場合によっては、通常の要素をコンテナの垂直方向の中央に配置することもありますが、これは私の場合にも適用されるため、必要なのは次のとおりです。

align-self: center;

25

最善の方法は、フレックスボックスをフレックスボックス内にネストすることです。あなたがしなければならないすべては子供を与えることalign-items: centerです。これにより、親の内側でテキストが垂直方向に配置されます。

// Assuming a horizontally centered row of items for the parent but it doesn't have to be
.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  display: flex;
  align-items: center;
}

完璧な中央揃えのテキストが必要な場合。text-align:center単独では機能しません。align-items: centerそれと一緒に使用してください。
Tzwenni

8

結果

ここに画像の説明を入力してください

HTML

<ul class="list">
  <li>This is the text</li>
  <li>This is another text</li>
  <li>This is another another text</li>
</ul>

align-items代わりに使用しalign-self、私もに追加flex-directionしましたcolumn

CSS

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

html,
body {
  height: 100%;
}

.list {
  display: flex;
  justify-content: center;
  flex-direction: column;  /* <--- I added this */
  align-items: center;   /* <--- Change here */
  height: 100px;
  width: 100%;
  background: silver;
}

.list li {  
  background: gold;
  height: 20%; 
}

1

* {
  padding: 0;
  margin: 0;
}

html,
body {
  height: 100%;
}

ul {
  height: 100%;
}

li {
 display: flex;
 justify-content: center;
 align-items: center;
 background: silver;
 width: 100%;
 height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>


0

* {
  padding: 0;
  margin: 0;
}
html, body {
  height: 100%;
}
ul {
  height: 100%;
}
li {
  display: flex;
  justify-content: center;
  align-items:center;
  background: silver;
  width: 100%;
  height: 20%;
}
<ul>
  <li>This is the text</li>
</ul>


コードのみの回答はあまり有用ではありません...コメントや、何をしたのか、なぜ機能するのかを説明してください。
random_user_name

0

を使用しdisplay: flexて、HTML要素の垂直方向の配置を制御できます。

.box {
  height: 100px;
  display: flex;
  align-items: center; /* Vertical */
  justify-content: center; /* Horizontal */
  border:2px solid black;
}

.box div {
  width: 100px;
  height: 20px;
  border:1px solid;
}
<div class="box">
  <div>Hello</div>
  <p>World</p>
</div>


-6

ullitableとに変更できますtable-cell。次に、vertical-alignあなたのために働くでしょう:

ul {
    height: 20%;
    width: 100%;
    display: table;
}

li {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    background: silver;
    width: 100%; 
}

http://codepen.io/anon/pen/pckvK


そこに別のリストアイテムを追加するまでうまくいきます。
ジョージ

1
真実...しかし、それは決して言及されなかった
LcSalazar 2014

高さをliではなくulに切り替えましたか?各李の高さは動的になるので、これは私が恐れることなく使用できるものではありません
スタイラー2014

@LcSalazarアイテムを1つだけにするつもりであれば、通常はリストを使用しません。これがdivの目的です。
Ben Visness 2014

2
もう一度言いますが、これは完璧なシナリオだとは言っていません。質問にそのまま答えるソリューションを投稿しました。この情報が、他の誰かがそれを読んで、別のシナリオを持つときに役立つことを願っています...
LcSalazar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.