フレックスボックス

3つのボタンを1行に配置し、均等に間隔を空け、すべて同じ高さにして、各ボタンのテキスト量に関わらず垂直方向に中央揃えしたいとします。昔はこれを実現するにはfloatやclearfix、そして多くの推測が必要でした。フレックスボックスはこのために作られたツールです。1つのコンテナに子要素を1行にレイアウトするよう指示し、その後2つのアクシスに沿って要素をずらして、好きな位置に配置します。Webで見かけるほとんどの日常的なレイアウト、ナビゲーションバー、ツールバー、カードの行は、その下にフレックスコンテナがあります。
フレックスコンテナ
フレックスボックスは親要素に1行のコードで始まります。コンテナにdisplay: flexを設定すると、その直下の子要素が1行に並んで配置されます。そのコンテナは**フレックスコンテナ**となり、その内部の各子要素はフレックスアイテムになります。
.nav {
display: flex; /* 子要素が1行に並ぶようになります */
}アイテムは2つの方向に沿ってレイアウトされます。メインアクシスは左から右に走り、アイテムが並ぶ方向です。クロスアクシスは上から下に走り、行の向こう側です。両方のアクシスに沿ってアイテムを制御するため、今のうちに思い浮かべるのに役立ちます。メインアクシスはアイテムが置かれている線、クロスアクシスはそれを横切る方向です。
.nav {
display: flex;
}1つの宣言で、あらゆるブロックの子要素は上から下にスタックするのを止め、1行に座り始めます。この章の他のすべては、コンテナ内にあるそれらのアイテムを制御することについてです。
display: flexを置くと、その直下の子要素が1行に並びます。その親はフレックスコンテナ、子要素はフレックスアイテムです。アイテムは2つの方向に動きます。メインアクシスはそれらが座っている線、クロスアクシスはそれを横切り、両方のアクシスに沿ってアイテムを押します。 アクシスに沿った配置
アイテムが1行に並んだら、2つのプロパティでそれらを動かします。**justify-content**はメインアクシスに沿ってアイテムを間隔を空け、アイテムが座っている方向です。align-itemsはクロスアクシスに沿ってそれらを動かし、行内の上下です。
.nav {
display: flex;
justify-content: space-between; /* 行に沿ってアイテムを押し離します */
align-items: center; /* 垂直方向の中央に配置します */
}justify-contentの一般的な値はflex-start(左に詰まった)、center(中央に詰まった)、flex-end(右に詰まった)、space-between(アイテム間に隙間、端にはなし)、およびspace-around(各アイテムの両側に隙間)です。align-itemsについては、centerがもっとも使うものです。
両方向で何かを中央に配置するには、最初に学ぶ方法は、両方をcenterに設定することです。
.hero {
display: flex;
justify-content: center; /* メインアクシスに沿って中央揃え */
align-items: center; /* クロスアクシスに沿って中央揃え */
}justify-contentはメインアクシスに沿ってアイテムを間隔を空け、align-itemsはクロスアクシスに沿ってそれらを動かします。最初のもののために覚えておく値はcenter、space-between、flex-startです。両方をcenterに設定すると、内部にあるものが真中に座り、これはあなたが何度も何度も使うレイアウト方法です。 方向とラッピング
デフォルトでは、フレックスコンテナはアイテムを1行にレイアウトします。**flex-direction**で変更します。columnに設定すると、アイテムは横に並ぶのではなく、上から下にスタックします。
.sidebar {
display: flex;
flex-direction: column; /* アイテムが今は垂直にスタックします */
}行内のアイテムが余地を失うと、より薄くなります。代わりに新しい行に落とすようにするには、flex-wrap: wrapを追加します。
.card-row {
display: flex;
flex-wrap: wrap; /* フィットしないアイテムは次の行に移ります */
}アイテム間のスペースについては、gapを使用してください。外側のエッジにスペースを追加せずに、すべてのアイテムの間に一貫したギャップを追加します。
.card-row {
display: flex;
gap: 16px; /* 各アイテム間に16px */
}flex-direction: columnはアイテムを行の代わりに垂直にスタックさせます。flex-wrap: wrapは、潰される代わりに、スペースが不足したときにアイテムを新しい行に落とすようにさせます。そしてgapはアイテム間に均等なスペースを置き、エッジにはスペースを追加しないため、マージンの前に手を伸ばします。 フレキシブルなアイテムのサイジング
フレックスボックスのポイントは、アイテムがスペースを共有するために成長または縮小できることです。最も使うショートハンドは、アイテムのflex: 1で、それが成長し、利用可能なスペースの等しいシェアを取ることを伝えます。
.card {
flex: 1; /* すべてのカードが行の等しいシェアを埋めるために成長します */
}3つのカードにflex: 1を置いて1行に並べると、コンテナが3つの等しい幅に分かれます。1つのカードにflex: 2を与えると、それは他のものの2倍のスペースを取ります。その単一の数字は、アイテムがそれらの間で余りスペースをどのように分割するかです。
flex: 1の背後にはアイテムがどれだけ成長するか、どれだけ縮むか、そしてその開始サイズをコントロールする3つの個別のコントロールがあります。最初はそれらを1つずつ設定することはめったにありませんが、ショートハンドは一般的なケースをカバーします。それらがそこにあることを知るのに役立ちます。
.layout {
display: flex;
gap: 24px;
}
.sidebar {
flex: 0 0 240px; /* 固定240px、決して成長または縮小しません */
}
.main {
flex: 1; /* 残りのスペースをすべて取ります */
}固定サイドバーの横のフレキシブルなメイン列、意図の3行。このパターン、そして前のアラインドナビゲーションバーに加えて、作成するレイアウトの大きなスライスをカバーします。
flex: 1は、成長し、行の等しいシェアを取ることを伝えるため、flex: 1を持つ3つのカードは等しい幅で出てきます。1つをflex: 2にバンプし、それはスペースの2倍を取ります。その単一の数字は、フレックスアイテムがそれらの間でスペースを分割する方法です。 
