フレックスレイアウトの互換性の問題の概要

フレックスレイアウトの互換性の問題の概要

1. W3C バージョンの flex

2009年版
フラグ: display: box; または box-{*} のプロパティ (例: box-pack)

2011年版
フラグ: display: flexbox; または flex() 関数または flex-pack プロパティ

2012年版
フラグ: display: flex/inline-flex; および flex-{*} プロパティ

2014年版
フレックスアイテムのZインデックスに新しいルールを追加しました

2015 W3C 編集者草案
大きな変化なし

PS 2015 年版は W3C 編集者草案であることに注意してください。これはあくまで草案であり、まだ改訂段階です。ブラウザ ベンダーの意見はまだ求められていません。

2. ブラウザの互換性

flex に関する W3C 仕様: http://dev.w3.org/csswg/css-flexbox-1/

ブラウザの互換性については、CanIUse を参照してください: http://caniuse.com/#feat=flexbox

CanIUse データによると、次のように要約できます。

  • IE10は2012を部分的にサポートしており、-ms-プレフィックスが必要です。
  • Android 4.1/4.2-4.3 は 2009 を部分的にサポートしており、-webkit- プレフィックスが必要です。
  • Safari7/7.1/8 は 2012 を部分的にサポートしており、-webkit- プレフィックスが必要です。
  • IOS Safari 7.0-7.1/8.1-8.3 は 2012 を部分的にサポートしており、-webkit- プレフィックスが必要です。

したがって、新しいバージョン 2012 を検討する必要があります: http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/

Android では、古いバージョン 2009 を考慮する必要があります: http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/

3. ブラウザ互換のflex構文

上記の分析は非常に明確です。互換性が必要なターゲットに対応するバージョンの構文を使用するだけです。よく使用されるレイアウト コードは次のとおりです。

/* 子要素 - 均等に分割された列 */
.flex1 {
  -webkit-box-flex: 1; /* 古い - iOS 6-、Safari 3.1-6 */
  -moz-box-flex: 1; /* 古い - Firefox 19- */
  width: 20%; /* 古い構文の場合、それ以外の場合は折りたたまれます。 */
  -webkit-flex: 1; /* クローム */
  -ms-flex: 1; /* IE 10 */
  flex: 1; /* 新機能、仕様 - Opera 12.1、Firefox 20+ */
}
/* 親要素 - 水平配置(主軸) */
.flex-h {
  display: box; /* 古い - Android 4.4- */
  display: -webkit-box; /* 古い - iOS 6-、Safari 3.1-6 */
  display: -moz-box; /* 古い - Firefox 19- (バグがあるが、ほぼ動作する) */
  display: -ms-flexbox; /* トゥイーナー - IE 10 */
  display: -webkit-flex; /* 新機能 - Chrome */
  display: flex; /* 新機能、仕様 - Opera 12.1、Firefox 20+ */
  /* バージョン 09 */
  -webkit-box-orient: 水平;
  /* バージョン 12 */
  -webkit-flex-direction: 行;
  -moz-flex-direction: 行;
  -ms-flex-direction: 行;
  -o-flex-direction: 行;
  flex-direction: 行;
}
/* 親要素 - 水平改行 */
.flex-hw{
  /* バージョン 09 */
  /*-webkit-box-lines: 複数;*/
  /* バージョン 12 */
  -webkit-flex-wrap: ラップ;
  -moz-flex-wrap: ラップ;
  -ms-flex-wrap: ラップ;
  -o-flex-wrap: ラップ;
  flex-wrap: ラップ;
}
/* 親要素 - 水平方向の中心(主軸が水平の場合にのみ機能します)*/
.flex-hc {
  /* バージョン 09 */
  -webkit-box-pack: 中央;
  /* バージョン 12 */
  中央揃え
  中央揃え
  コンテンツを中央揃えにします。
  -o-justify-content: 中央;
  コンテンツの中央揃え: 中央;
  /* その他の値は以下の通りです:
    align-items 主軸の原点方向を揃えます flex-end 主軸の延長方向を揃えます space-between 先頭と末尾に空白を残さずに等間隔で配置します space-around 先頭と末尾に空白を残して等間隔で配置します*/
}
/* 親要素 - 垂直配置(主軸) */
.flex-v {
  display: box; /* 古い - Android 4.4- */
  display: -webkit-box; /* 古い - iOS 6-、Safari 3.1-6 */
  display: -moz-box; /* 古い - Firefox 19- (バグがあるが、ほぼ動作する) */
  display: -ms-flexbox; /* トゥイーナー - IE 10 */
  display: -webkit-flex; /* 新機能 - Chrome */
  display: flex; /* 新機能、仕様 - Opera 12.1、Firefox 20+ */
  /* バージョン 09 */
  -webkit-box-orient: 垂直;
  /* バージョン 12 */
  -webkit-flex-direction: 列;
  -moz-flex-direction: 列;
  -ms-flex-direction: 列;
  -o-flex-direction: 列;
  flex-direction: 列;
}
/* 親要素 - 垂直改行 */
.flex-vw{
  /* バージョン 09 */
  /*-webkit-box-lines: 複数;*/
  /* バージョン 12 */
  -webkit-flex-wrap: ラップ;
  -moz-flex-wrap: ラップ;
  -ms-flex-wrap: ラップ;
  -o-flex-wrap: ラップ;
  flex-wrap: ラップ;
}
/* 親要素 - 垂直方向の中心(主軸が水平の場合にのみ機能します)*/
.flex-vc {
  /* バージョン 09 */
  -webkit-box-align: 中央;
  /* バージョン 12 */
  -webkit-align-items: 中央;
  -moz-align-items: 中央;
  -ms-align-items: 中央;
  -o-align-items: 中央;
  アイテムの位置を中央揃えにします。
}
/* 子要素 - 左から右(上から下)の最初の位置に表示されます。ソース ドキュメントの表示順序を変更するために使用されます。*/
.flex-1 {
  -webkit-box-ordinal-group: 1; /* 古い - iOS 6-、Safari 3.1-6 */
  -moz-box-ordinal-group: 1; /* 古い - Firefox 19- */
  -ms-flex-order: 1; /* トゥイナー - IE 10 */
  -webkit-order: 1; /* 新機能 - Chrome */
  order: 1; /* 新規、仕様 - Opera 12.1、Firefox 20+ */
}
/* 子要素 - 左から右(上から下)の 2 番目の位置に表示されます。ソース ドキュメントの表示順序を変更するために使用されます。*/
.flex-2 {
  -webkit-box-ordinal-group: 2; /* 古い - iOS 6-、Safari 3.1-6 */
  -moz-box-ordinal-group: 2; /* 古い - Firefox 19- */
  -ms-flex-order: 2; /* トゥイナー - IE 10 */
  -webkit-order: 2; /* 新機能 - Chrome */
  order: 2; /* NEW、仕様 - Opera 12.1、Firefox 20+ */
}

互換性を高めるには、一般的な flex ではなく、コンテナーに対して flex-h/flex-v を宣言する必要があります。

/* 親要素 - フレックスコンテナ */
.flex {
  display: box; /* 古い - Android 4.4- */
  display: -webkit-box; /* 古い - iOS 6-、Safari 3.1-6 */
  display: -moz-box; /* 古い - Firefox 19- (バグがあるが、ほぼ動作する) */
  display: -ms-flexbox; /* トゥイーナー - IE 10 */
  display: -webkit-flex; /* 新機能 - Chrome */
  display: flex; /* 新機能、仕様 - Opera 12.1、Firefox 20+ */
}

したがって、Android 互換性が必要な場合 (2009 バージョンの構文) は flex-h/flex-v を使用してコンテナが flex モードを使用するように宣言し、Android 互換性が不要な場合は flex を使用してコンテナを設定することをお勧めします (2012 バージョンの構文)。

注: 上記のコードはすべてのハイエンドブラウザと完全に互換性があるわけではありませんが、他の既存のコードよりも互換性があります。具体的な互換性テストの結果については、デモをご覧ください。

4.フレックスレイアウトデモ

オンラインテスト: デモ

テスト結果:

  • Android 4.2.2は行折り返しをサポートしていません
  • Android 4.2.2 では疑似要素の位置のパフォーマンスが一定ではありません
  • iOS Safari 7.1のパフォーマンスは、Chrome 28、Chrome 43、Firefoxのパフォーマンスと一致しています。
  • もっとテスト結果を教えて下さい。ありがとうございます。

注: テスト結果から、フレックスレイアウトは疑似要素をスペースを割り当てる要素として扱うことがわかります (ドキュメントでは、疑似要素に position: fixed/absolute; を設定するとこの状況を回避できると記載されているようですが、この記事ではまだ検証していません)。ただし、疑似要素は装飾効果のみを持ち、レイアウトに影響を与えないことを一般的に期待しているため、これは私たちの期待と一致しません。したがって、フレックス レイアウトで疑似要素を使用する場合は特に注意し、できるだけ多くのブラウザー互換性テストを実行するか、代わりにフロート レイアウトを使用してください。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。

>>:  MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明

推薦する

DockerにMySQL 8.0をインストールする方法

環境: MacOS_Cetalina_10.15.1、Mysql8.0.18、Docker_2.0....

Vue ソング プログレス バーのサンプル コード

なお、これはvue-cliで作成したプロジェクトではありません。vue.jsを参照して記述したHTM...

リクエスト IP の最後のセグメントに基づいてトラフィックを分割するように Nginx を構成する方法

これは主に、場所パラメータのif判断の設定ジャンプです。迂回により、サーバーの負荷と圧力を軽減できま...

クラスタrpmを使用してMySQLをインストールするための詳細な手順

MySQLデータベースをインストールするa) MySQL ソースインストールパッケージをダウンロード...

Vue での mixin の応用について議論する

Mixin は、再利用可能な機能を Vue コンポーネント間で分散する非常に柔軟な方法を提供します。...

TypeScript デコレータ定義

目次1. コンセプト1.1 定義1.2 デコレータファクトリー1.3 デコレータの組み合わせ1.4 ...

Reactのref属性を深く理解する方法

目次概要1. Refsオブジェクトの作成1.1 React.createRef() 1.2React...

中国語ウェブコンテンツを紹介する10の経験

<br /> テキスト、シンボル、リンクの 3 つの側面に焦点を当て、主に中国語で、私の...

Nginx ソースコードのコンパイルとインストールのプロセス記録

rpm パッケージのインストールは比較的簡単なので、ここでは説明しません。ほとんどのオープンソース ...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...

DockerHubを自分で構築する方法

先ほど使用したDocker HubはDockerによって提供されています。独自のDockerを構築す...

docker-compose を使用して mongodb と mysql を構築する詳細なプロセス

docker-compose で mongodb と mysql を構築する詳細な方法を見てみましょ...

MySQLとOracleのメタデータ抽出例分析

目次序文メタデータとは参照文書アドレスまずはMySQLについてお話しましょうOracleについて話し...

複数の無関係なテーブルからデータをクエリし、MySQL でページングする方法

MySQL 複数の無関係なテーブルクエリデータとページング機能要件主キーと外部キーの関連付けがない ...

JavaScript parseInt() と Number() の違いのケーススタディ

学習目標: parseInt() と Number() という 2 つの関数は、文字列をデータ型に変...