フレックスボックス内でテキストを垂直に揃えるにはどうすればいいですか? 質問する

フレックスボックス内でテキストを垂直に揃えるにはどうすればいいですか? 質問する

フレックスボックスを使用して、内部のコンテンツを垂直方向に揃えたいのです<li>が、うまくいきません。

オンラインで調べたところ、多くのチュートリアルでは実際にalign-items:center親の flex 設定から取得するラッパー 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>

ベストアンサー1

を使用する代わりにを使用しalign-self: centerます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ため、 はフレックス アイテムではありません。uldisplay: flexdisplay: inline-flex

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

align-itemsプロパティは と似ていますが、フレックス コンテナーalign-selfに適用される点が異なります。

liフレックス コンテナーなので、align-items子要素を垂直方向に中央揃えするために使用できます。

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

codepenデモ


align-items技術的には、その方法と仕組みは次のとおりですalign-self...

プロパティalign-items(コンテナ上) は、align-self(アイテム上) のデフォルト値を設定します。つまり、align-items: centerすべてのフレックス アイテムが に設定されることになります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 匿名インラインボックス

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

flexbox 仕様でも同様の動作が規定されています。

4. フレックスアイテム

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

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

おすすめ記事