CSS Flexbox には、なぜ「justify-items」と「justify-self」プロパティがないのでしょうか? 質問する

CSS Flexbox には、なぜ「justify-items」と「justify-self」プロパティがないのでしょうか? 質問する

フレックス コンテナーの主軸と交差軸について考えてみましょう。

行フレックスコンテナに適用されるさまざまな方向とサイズ設定の用語の図 ソース:ウィキペディア

フレックス アイテムを主軸に沿って配置するには、次のプロパティが 1 つあります。

フレックス アイテムを交差軸に沿って配置するには、次の 3 つのプロパティがあります。

上の画像では、主軸は水平で、交差軸は垂直です。これらはフレックス コンテナーのデフォルトの方向です。

しかし、これらの指示は、flex-direction財産。

/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;

/* main axis is vertical, cross axis is horizontal */    
flex-direction: column;
flex-direction: column-reverse;

(交差軸は常に主軸に対して垂直です。)

軸の働きを説明する上で私が言いたいのは、どちらの方向にも特別なことは何もないように思われるということです。主軸、交差軸、どちらも重要性の点で同等であり、flex-direction簡単に切り替えることができます。

では、なぜ交差軸には 2 つの追加の配置プロパティが付与されるのでしょうか?

主軸に対して とalign-contentが1 つのプロパティに統合されるのはなぜですか?align-items

主軸にjustify-selfプロパティが設定されないのはなぜですか?


これらのプロパティが役立つシナリオ:

  • フレックスコンテナの角にフレックスアイテムを配置する
    #box3 { align-self: flex-end; justify-self: flex-end; }

  • フレックスアイテムのグループを右揃えにする(justify-content: flex-end)が、最初のアイテムを左揃えにする(justify-self: flex-start

ナビゲーション項目のグループとロゴを含むヘッダー セクションを検討してください。justify-selfロゴを左揃えにし、ナビゲーション項目を右端に配置すると、全体がさまざまな画面サイズに合わせてスムーズに調整されます (「フレックス」)。

  • 3 つの flex アイテムを並べる場合は、中央のアイテムをコンテナーの中央 ( justify-content: center) に貼り付け、隣接するアイテムをコンテナーの端 (justify-self: flex-startおよびjustify-self: flex-end) に揃えます。

隣接する項目の幅が異なる場合、値space-aroundspace-betweenonjustify-contentプロパティでは中央の項目がコンテナーの中央に配置されないことに注意してください。

#container {
  display: flex;
  justify-content: space-between;
  background-color: lightyellow;
}
.box {
  height: 50px;
  width: 75px;
  background-color: springgreen;
}
.box1 {
  width: 100px;
}
.box3 {
  width: 200px;
}
#center {
  text-align: center;
  margin-bottom: 5px;
}
#center > span {
  background-color: aqua;
  padding: 2px;
}
<div id="center">
  <span>TRUE CENTER</span>
</div>

<div id="container">
  <div class="box box1"></div>
  <div class="box box2"></div>
  <div class="box box3"></div>
</div>

<p>note that the middlebox will only be truly centered if adjacent boxes are equal width</p>

jsFiddle バージョン


本稿執筆時点ではjustify-selfjustify-itemsフレックスボックス仕様

しかし、CSS ボックス配置モジュールこれは、すべてのボックス モデルで使用するための共通の配置プロパティ セットを確立するという W3C の未完成の提案ですが、次のようになります。

ここに画像の説明を入力してください                                                                                                                                                    ソース:ウィキペディア

justify-selfとがjustify-items考慮されていることに気づくでしょう...ただし、 flexbox の場合は考慮されません


最後に、主な質問を繰り返します。

「justify-items」プロパティと「justify-self」プロパティがないのはなぜですか?

ベストアンサー1

フレックスアイテムを主軸に沿って整列させる方法

質問にあるように:

フレックス アイテムを主軸に沿って配置するには、次のプロパティが 1 つあります。justify-content

フレックス アイテムを交差軸に沿って配置するには、次の 3 つのプロパティがあります。align-contentalign-itemsそしてalign-self

すると、次のような質問が出てきます。

justify-itemsなぜおよびjustify-selfプロパティがないのですか?

一つの答えは、「それらは必要ではないから」かもしれません。

フレックスボックス仕様フレックス アイテムを主軸に沿って配置するための2 つの方法を提供します。

  1. キーワードjustify-contentプロパティ、および
  2. auto余白

コンテンツの正当化

justify-contentプロパティは、フレックス コンテナーの主軸に沿ってフレックス アイテムを配置します。

これはフレックス コンテナーに適用されますが、フレックス アイテムにのみ影響します。

配置オプションは 5 つあります。

  • flex-start~ フレックスアイテムはラインの先頭に向かって詰め込まれます。

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

  • flex-end~ フレックスアイテムはラインの最後尾に詰められます。

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

  • center~ フレックスアイテムはラインの中央に向かって詰め込まれます。

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

  • space-between~ フレックスアイテムは均等に配置され、最初のアイテムはコンテナの一方の端に揃えられ、最後のアイテムは反対側の端に揃えられます。最初のアイテムと最後のアイテムが使用する端は、flex-directionそして書き込みモードltrまたはrtl)。

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

  • space-around~space-between両端に半角スペースがあること以外は と同じです。

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


自動マージン

auto余白フレックスアイテムは、中央に配置したり、間隔を空けて配置したり、サブグループにまとめたりすることができます。

フレックス コンテナーに適用される とは異なりjustify-contentautoマージンはフレックス アイテムに適用されます。

指定された方向のすべての空き領域を消費することによって動作します。


フレックスアイテムのグループを右揃え、最初のアイテムを左揃えにする

質問からのシナリオ:

  • フレックスアイテムのグループを右揃えにする(justify-content: flex-end)が、最初のアイテムを左揃えにする(justify-self: flex-start

    ナビゲーション項目のグループとロゴを含むヘッダー セクションを検討してください。justify-selfロゴを左揃えにし、ナビゲーション項目を右端に配置すると、全体がさまざまな画面サイズに合わせてスムーズに調整されます (「フレックス」)。

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

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


その他の便利なシナリオ:

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

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

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


コーナーにフレックスアイテムを配置する

質問からのシナリオ:

  • コーナーにフレックスアイテムを配置する.box { align-self: flex-end; justify-self: flex-end; }

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


フレックスアイテムを垂直方向と水平方向に中央揃えする

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

margin: autojustify-content: centerはおよびの代替ですalign-items: center

フレックス コンテナー上の次のコードの代わりに:

.container {
    justify-content: center;
    align-items: center;
}

これをフレックスアイテムで使用できます:

.box56 {
    margin: auto;
}

この代替案は次のような場合に便利ですコンテナから溢れたフレックスアイテムを中央に配置する


フレックスアイテムを中央に配置し、2つ目のフレックスアイテムを最初のフレックスアイテムと端の間に中央に配置する

フレックス コンテナーは、空きスペースを分散することでフレックス アイテムを配置します。

したがって、均等なバランスを作り、中央のアイテムをコンテナの中央に配置し、その横に 1 つのアイテムを配置できるようにするには、カウンターバランスを導入する必要があります。

以下の例では、「実際の」項目 (ボックス 63 と 66) のバランスをとるために、非表示の 3 番目のフレックス項目 (ボックス 61 と 68) が導入されています。

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

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

もちろん、この方法は意味論的にはそれほど素晴らしいものではありません。

あるいは、実際の DOM 要素の代わりに疑似要素を使用することもできます。または、絶対位置を使用することもできます。ここでは、3 つの方法すべてについて説明します。フレックスアイテムを中央揃えと下揃えにする

注意: 上記の例は、真の中央揃えの観点から、最も外側のアイテムの高さと幅が等しい場合にのみ機能します。フレックス アイテムの長さが異なる場合は、次の例を参照してください。


隣接するアイテムのサイズが異なる場合にフレックスアイテムを中央に配置する

質問からのシナリオ:

  • 3 つの flex アイテムを並べる場合は、中央のアイテムをコンテナーの中央 ( justify-content: center) に貼り付け、隣接するアイテムをコンテナーの端 (justify-self: flex-startおよびjustify-self: flex-end) に揃えます。

    隣接するアイテムの幅が異なる場合、値space-aroundspace-betweenonjustify-contentプロパティは中央のアイテムをコンテナに対して中央に配置しないことに注意してください(デモを見る)。

前述のように、すべてのフレックス項目の幅または高さが同じでない限り ( に依存)、中央の項目を正確に中央に配置することはできません。この問題は、プロパティ (もちろん、このタスクを処理するように設計されている)flex-directionの必要性を強く示しています。justify-self

#container {
  display: flex;
  justify-content: space-between;
  background-color: lightyellow;
}
.box {
  height: 50px;
  width: 75px;
  background-color: springgreen;
}
.box1 {
  width: 100px;
}
.box3 {
  width: 200px;
}
#center {
  text-align: center;
  margin-bottom: 5px;
}
#center > span {
  background-color: aqua;
  padding: 2px;
}
<div id="center">
  <span>TRUE CENTER</span>
</div>

<div id="container">
  <div class="box box1"></div>
  <div class="box box2"></div>
  <div class="box box3"></div>
</div>

<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>

この問題を解決するには、次の 2 つの方法があります。

解決策1: 絶対位置指定

フレックスボックスの仕様では、フレックスアイテムの絶対配置これにより、兄弟アイテムのサイズに関係なく、中央のアイテムが完全に中央に配置されます。

ただし、絶対位置で配置されたすべての要素と同様に、アイテムは文書フローつまり、コンテナ内のスペースを占有せず、兄弟要素と重ね合わせることができます。

以下の例では、中央の項目が絶対位置で中央に配置され、外側の項目はインフローのままです。ただし、同じレイアウトを逆の方法で実現することもできます。つまり、中央の項目を中央に配置しjustify-content: center、外側の項目を絶対位置に配置します。

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

解決策 2: ネストされた Flex コンテナ (絶対配置なし)

.container {
  display: flex;
}
.box {
  flex: 1;
  display: flex;
  justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto;  }

/* non-essential */
.box {
  align-items: center;
  border: 1px solid #ccc;
  background-color: lightgreen;
  height: 40px;
}
<div class="container">
  <div class="box box71"><span>71 short</span></div>
  <div class="box box72"><span>72 centered</span></div>
  <div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>

仕組みは次のとおりです:

  • 最上位の div ( .container) は flex コンテナーです。
  • 各子 div ( .box) はフレックス アイテムになりました。
  • 各アイテムは、コンテナスペースを均等に分配するために.box与えられます。flex: 1
  • これで、アイテムは行内のすべてのスペースを占め、幅が均等になりました。
  • 各項目を (ネストされた) フレックス コンテナーにして、 を追加しますjustify-content: center
  • これで、各span要素は中央に配置されたフレックス アイテムになりました。
  • フレックスautoマージンを使用して、外側の要素をspan左右にシフトします。

justify-contentマージンのみを使わずに使用することもできますauto

しかし、マージンは常に優先されるjustify-contentため、ここでは機能しますauto。仕様から:

8.1.auto余白に合わせて配置する

および による位置合わせの前にjustify-contentalign-self正の空きスペースはその次元の自動マージンに分配されます。


justify-content: スペース-同じ (概念)

戻ってjustify-contentちょっと、もう一つの選択肢のアイデアをご紹介します。

  • space-samespace-between~とのハイブリッドですspace-around。フレックス項目は均等間隔で配置されます ( と同様space-between)。ただし、両端に半角スペースがある ( と同様space-around) のではなく、両端に全角スペースがあります。

このレイアウトは次のように実現できます。::beforeそして::afterフレックス コンテナ上の疑似要素。

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

(クレジット:オリオルコードについては、翻訳:ラベル用)

更新:space-evenlyブラウザは上記を実現する の実装を開始しました。詳細については、この投稿を参照してください。フレックスアイテム間の均等スペース


遊び場(上記のすべての例のコードが含まれています)

おすすめ記事