私はフレックスボックスを使用して<li>
内のいくつかのコンテンツを垂直方向に整列させたいのですが、あまり成功していません。
私はオンラインでチェックしました、そして、チュートリアルの多くは実際に親のflex設定からalign-items:center
を取得するラッパーdivを使います、しかし私はこの追加要素を切り取ることが可能であるかどうか疑問に思います。
リスト項目の高さは動的な%になるため、この場合はフレックスボックスを使用することにしました。
* {
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>
可能であればこの回答を削除しますが、承認された回答は削除できません。
flex-direction
を(column
を使用して)垂直にすると、justify-content: center
は垂直方向の中央に配置されます。そうすれば、text-align: center
を使って水平方向に中央揃えすることもできます。
li {
display: flex;
justify-content: center;
flex-direction: column;
text-align: center;
}
これがcodepenの 実用的なデモです 。
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
)にはdisplay: flex
またはdisplay: inline-flex
が適用されていないため、あなたのul
はフレックス項目ではありません。
したがって、ul
はフレックスコンテナではなく、li
はフレックスアイテムではなく、align-self
は効果がありません。
align-items
プロパティは、フレックスコンテナに適用されること以外はalign-self
と似ています。
li
はflexコンテナなので、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>
技術的には、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仕様より
ブロックコンテナ要素内に直接含まれるテキストは、匿名インライン要素として扱われる必要があります。
Flexboxの仕様でも同様の動作が可能です。
フレックスコンテナの各インフローチャイルドはフレックスアイテムになり、フレックスコンテナ内に直接含まれる連続した各テキストランは、無名のフレックスアイテムにラップされます。
したがって、li
のテキストはフレックスアイテムです。
将来のGoogle社員のために、
最も投票された回答と2番目に多くの回答も、OPによって投稿されたこの特定の問題を解決するためのものです。しかし、あなたのケースはコンテナの中で垂直方向の通常の要素を中心に置くであるかもしれません。これは私の場合にも当てはまります。
align-self: center;
これは前述のクエリのトップ結果であり、またかなり長い間混乱していたので、ここでこれを出すだけです* Derp *
一番良い方法は flexboxをflexboxの中に入れ子にすることです 。あなたがしなければならないのは子供に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;
}
* {
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>