前回の記事で、CSS レイアウトの従来のレイアウト方法は、主に表示属性 + 位置属性 + フロート属性に依存するボックス モデルに基づいていることがわかりました。このボックス モデルは、一部の複雑なレイアウトでは解決がより困難になるため、新しいレイアウト方法が登場しました。
2009 年、W3C は、さまざまなページ レイアウトを簡単、完全、レスポンシブに実現できる新しいソリューション、Flexbox レイアウト (エラスティック レイアウト) を提案しました。フレックス レイアウト モデルは、ブロック モデルとインライン モデルのレイアウト計算がブロックとインラインのフロー方向に依存するという点で、ブロック モデル レイアウトやインライン モデル レイアウトとは異なります。
そして React Native も Flex レイアウトを使用するため、Flex を学習することはクライアントの開発に大きな利益をもたらします。
Flexbox のレイアウトはフレックスの方向に依存します。簡単に言えば、Flexbox は単純なプロパティではなく、レイアウト モジュールです。 Flex レイアウトを使用する要素は Flex コンテナ (フレックス コンテナ) と呼ばれ、そのすべての子要素 (フレックス アイテム) は自動的にコンテナ メンバーになります。
Flexbox レイアウトは、Android 開発における LinearLayout レイアウトに非常に似ていますが、LinearLayout よりも強力です。 LinearLayoutと同様に、Flexboxにも主軸(メイン軸)と副軸(クロス軸)の2方向のレイアウトがあり、簡単に言うとLinearLayoutの水平レイアウトと垂直レイアウトとして理解できます。主軸の開始位置(境界線との交点)をメインスタート、終了位置をメインエンド、交差軸の開始位置をクロススタート、終了位置をクロスエンドといいます。デフォルトでは、項目は主軸に沿って配置されます。 1 つのアイテムが占める主軸のスペースをメイン サイズと呼び、1 つのアイテムが占める横軸のスペースをクロス サイズと呼びます。
属性は、フレックス コンテナ属性とフレックス アイテム属性に分かれています。親コンテナと子要素に対応します。
以下はフレックスコンテナのプロパティ
flex-direction プロパティは、主軸の方向 (つまり、項目の配置方向) を決定します。 LinearLayout のverticalまたはhorizontalと似ています。
flex-direction: row | row-reverse | column | column-reverse
4 つの値から選択できます:
デフォルトでは、サブ要素はドキュメント フローの順序で配置され、order 属性は配置の順序を制御できます。負の値が最初に、正の値が後に続きます。災害を小さいものから大きいものへと順番に並べています。フレックス ボックスが LinearLayout よりも強力である理由は、一部のプロパティの方が強力であるためであり、順序もその 1 つであるためです。
デフォルトでは、Flex には LinearLayout と同様に行の折り返しがありませんが、flex-wrap 属性は行の折り返しをサポートできます。これも LinearLayout より優れており、次の 3 つの値があります:
rrree
flex-flow プロパティは、flex-direction プロパティと flex-wrap プロパティの略称で、デフォルト値は row nowrap です。
flex-wrap: nowrap | wrap | wrap-reverse;
justify-content プロパティは、主軸上の項目の配置を定義します。
flex-flow: <flex-direction> || <flex-wrap>;
align-items プロパティ
justify-content: flex-start | flex-end | center | space-between | space-around;
align-content プロパティ
りー
以下几个属性设置在子元素上。
flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。一张图看懂。跟 LinearLayout中的 weight属性一样。
.item { flex-grow: <number>; /* default 0 */}
如果所有项目的 flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的 flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
.item { flex-shrink: <number>; /* default 1 */}
如果所有项目的 flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。
flex-basis属性定义了在分配多余空间之前,子元素占据的 main size主轴空间,浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为 auto,即子元素的本来大小。
.item { flex-basis: <length> | auto; /* default auto */}
flex属性是 flex-grow, flex-shrink和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
align-self属性允许单个子元素有与其他子元素不一样的对齐方式,可覆盖 align-items属性。默认值为 auto,表示继承父元素的 align-items属性,如果没有父元素,则等同于 stretch。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch;}
该属性可能取6个值,除了 auto,其他都与 align-items属性完全一致。
属性基本都讲完了,下面进入实战。百度前端学院的其中一个任务:
效果图
分析:
效果图和 代码
可以看到, Flex box布局方式相比传统的盒模型布局方式要快速很多,对于一些复杂的页面也可以很快速的开发。而且由于 React Native的支持并使用,相信会有跟多开发者使用这种布局方式进行开发。