表示プロパティを掘り下げる:表示の2つの値
公開: 2022-03-10display
プロパティの値であり、あまり注目されないプロパティの主力製品です。 レイチェルアンドリューは、短いシリーズでよりよく見ていきます。 フレックスまたはグリッドレイアウトは、 display: flex
またはdisplay: grid
を宣言することから始まります。 これらのレイアウトメソッドは、CSS display
プロパティの値です。 このプロパティについては、 flex
やgrid
の値に集中するのではなく、あまり話さない傾向がありますが、 display
とその定義方法について理解しておくと、使用するときに生活がはるかに楽になる興味深いことがいくつかあります。レイアウト用のCSS。
この記事では、短いシリーズの最初の記事で、 display
の値がレベル3仕様で定義されている方法を見ていきます。 これは、以前のバージョンのCSSでdisplay
を定義した方法に対する変更です。 長年CSSをやっている私たちにとっては、最初は珍しいように思えるかもしれませんが、これらの変更は、要素のdisplay
の値を変更したときに何が起こっているのかを説明するのに本当に役立つと思います。
ブロックおよびインライン要素
CSSを初めて使用する人に最初に教えることの1つは、ブロック要素とインライン要素の概念です。 ページ上のいくつかの要素がdisplay: block
であり、このために特定の機能があることを説明します。 それらはインライン方向に伸び、利用可能な限り多くのスペースを占有します。 彼らは新しい行に割り込む。 それらに幅、高さ、マージン、およびパディングを与えることができ、これらのプロパティはページ上の他の要素をそれらから遠ざけます。
また、いくつかの要素がdisplay: inline
。 インライン要素は、文中の単語のようなものです。 それらは改行せず、代わりにそれらの間に空白の文字を予約します。 余白とパディングを追加すると、これは表示されますが、他の要素が押し出されることはありません。
ブロック要素とインライン要素の動作はCSSの基本であり、適切にマークアップされたHTMLドキュメントはデフォルトで読み取り可能です。 このレイアウトは、「ブロックおよびインラインレイアウト」または「通常のフロー」と呼ばれます。これは、要素に対して他に何もしなかった場合に要素がレイアウトされる方法であるためです。
display
の内側と外側の値
ブロック要素とインライン要素は理解していますが、アイテムをdisplay: grid
? これは完全に違うものですか? display: grid
を指定したコンポーネントを見ると、レイアウトの親要素に関しては、 block level
要素のように動作します。 要素は伸びて、インラインディメンションで使用可能な限り多くのスペースを占有し、新しい行から開始します。 レイアウトの他の部分と一緒に動作するという点では、 block
要素と同じように動作します。 display: block
しますか?
私たちが持っていることがわかります。 Display仕様のレベル3では、 display
の値は2つのキーワードとして定義されています。 これらのキーワードは、表示の外側の値を定義します。これは、 inline
またはblock
になり、したがって、要素が他の要素と一緒にレイアウトでどのように動作するかを定義します。 また、要素の内部値、つまりその要素の直接の子がどのように動作するかを定義します。
つまり、 display: grid
と言うとき、実際に言っているのはdisplay: block grid
です。 ブロックレベルのグリッドコンテナを求めています。 すべてのブロック属性を持つ要素—高さと幅、マージンとパディングを指定でき、コンテナを満たすために伸びます。 ただし、そのコンテナの子にはグリッドの内部値が与えられているため、 grid
アイテムになります。 これらのグリッドアイテムの動作はCSSグリッド仕様で定義されています。 display
仕様は、これが使用するレイアウト方法であることをブラウザーに通知する方法を提供します。
display
についてのこの考え方は非常に役立つと思います。 さまざまなレイアウト方法で何をしているのかを直接説明しています。 display: inline flex
を指定する場合、何を期待しますか? うまくいけば、フレックスアイテムである子を持つインライン要素として動作するボックス。
この新しい方法でのdisplay
について考えることで、他にもいくつかのことがきちんと説明されています。この記事の残りの部分で、これらのいくつかを見ていきます。
私たちは常に通常の流れに戻っています
これらの内側と外側の表示プロパティについて考えるとき、表示の値をまったくいじらないとどうなるかを考えると役立つ場合があります。 HTMLを記述してブラウザで表示すると、ブロックおよびインラインレイアウト、つまり通常のフローが得られます。 要素は、 block
要素またはinline
要素として表示されます。
以下の例には、 div
をdisplay: flex
(2つの直接の子)がflexアイテムになり、画像がコンテンツと並んでいます。 ただし、コンテンツに表示されている場合は、通常のフローで再び表示されている見出しと段落があります。 メディアオブジェクトの直接の子はフレックスアイテムになりました。 フレックスアイテムの表示値を変更しない限り、子は通常のフローに戻ります。 フレックスコンテナ自体はブロックボックスであり、境界線がその親の端まで伸びていることがわかります。
このプロセスで作業する場合、ページ上の要素が、それと戦い、すべてを配置しようとするのではなく、この読みやすい通常のフローレイアウトでレイアウトされるという事実は、CSSの方がはるかに簡単です。 また、ドキュメントの順序を操作しているため、アクセシビリティの問題に陥る可能性も低くなります。これは、スクリーンリーダーやドキュメントをタブで移動する人が行っていることとまったく同じです。
flow-root
とinline-block
の説明
inline-block
の価値は、CSSをしばらくやっている私たちの多くにもよく知られているようです。 この値は、 inline
要素のブロック動作の一部を取得する方法です。 たとえば、 inline-block
要素は幅と高さを持つことができます。 display: inline-block
を持つ要素も、 Bロック形式のコンテンツ( BFC )を作成するという点で興味深い動作をします。
BFCは、レイアウトに関していくつかの便利なことを行います。たとえば、フロートが含まれています。 ブロックフォーマットコンテキストの詳細については、以前の記事「CSSレイアウトとブロックフォーマットコンテキストについて」を参照してください。 したがって、 display: inline-block
と言うと、BFCを確立するインラインボックスが表示されます。
ご存知のとおり(ブロックフォーマットコンテキストに関する上記の記事を読んだ場合)、BFCを明示的に作成する新しい値のdisplayがあります。 これはflow-root
の値です。 この値は、インライン要素ではなく、ブロック上にBFCを作成します。
-
display: inline-block
は、インラインボックスにBFCを提供します。 -
display: flow-root
は、ブロックボックスにBFCを提供します。
あなたはおそらくそれが少し混乱していると思っているでしょう:なぜここに2つの完全に異なるキーワードがあるのですか、そして前に話していた2つの値の構文はどうなりましたか? これは、 display
について説明する必要がある次のこと、つまり、CSSにはdisplay
プロパティの観点から処理する必要のある履歴があるという事実にきちんとつながります。
表示のレガシー値
CSS2仕様では、 display
プロパティの次の値について詳しく説明しています。
-
inline
-
block
-
inline-block
-
list-item
-
none
-
table
-
inline-table
また、この記事では扱っていないtable-cell
などのさまざまなテーブル内部プロパティも定義されています。
次に、フレックスとグリッドレイアウトをサポートするために、これらの表示用の値をいくつか追加しました。
-
grid
-
inline-grid
-
flex
-
inline-flex
注:この仕様では、Ruby仕様で読むことができるRubyテキストをサポートするためにruby
とinline-ruby
も定義しています。
これらはすべてdisplay
プロパティの単一の値であり、CSSレイアウトをこのように説明するために仕様が更新される前に定義されています。 CSSについて非常に重要なことは、Webを壊すことを回避しないという事実です。 単純に物事を変えることはできません。 誰もがこの新しい2値構文を使用する必要があると突然判断することはできません。したがって、開発者が戻って修正しない限り、単一値構文を使用して構築されたすべてのWebサイトは機能しなくなります。
この問題を考えながら、CSSの設計におけるこの間違いのリストを楽しむことができます。これは、多くの場合、将来を見据えて水晶玉を使わずに設計されたものとして、間違いが少ないものです。 ただし、実際にはWebを壊すことはできません。そのため、現在ブラウザは表示用に1つの値のセットをサポートしており、仕様は表示用に2つの値に移行しています。
これを回避する方法は、これらの単一の値すべてを含む、表示用のレガシー値と短い値を指定することです。 これは、単一の値と新しい2つのキーワード値の間でマッピングを定義できることを意味します。 これにより、次の値の表が得られます。
単一の値 | 2つのキーワード値 | 説明 |
---|---|---|
block | block flow | 通常のフローインナーを備えたブロックボックス |
flow-root | block flow-root | BFCを定義するブロックボックス |
inline | inline flow | 通常のフローインナーを備えたインラインボックス |
inline-block | inline flow-root | BFCを定義するインラインボックス |
list-item | block flow list-item | 通常のフローインナーと追加のマーカーボックスを備えたブロックボックス |
flex | block flex | 内側のフレックスレイアウトのブロックボックス |
inline-flex | inline flex | 内側のフレックスレイアウトのインラインボックス |
grid | block grid | 内部グリッドレイアウトのブロックボックス |
inline-grid | inline grid | 内部グリッドレイアウトのインラインボックス |
table | block table | 内部テーブルレイアウトのブロックボックス |
inline-table | inline table | 内側のテーブルレイアウトのインラインボックス |
これがどのように機能するかを説明するために、グリッドコンテナについて考えることができます。 2つの値の世界では、次のブロックレベルのグリッドコンテナを作成します。
.container { display: block grid; }
ただし、legacyキーワードは、以下が同じことを行うことを意味します。
.container { display: grid; }
代わりに、インライングリッドコンテナが必要な場合は、2つの値の世界で次を使用します。
.container { display: inline grid; }
また、レガシー値を使用する場合:
.container { display: inline-grid; }
これで、この会話が始まった場所に戻って、 display: inline-block
。 表を見ると、これが2つの値の世界でdisplay: inline flow-root
として定義されていることがわかります。 これで、 display: flow-root
と一致します。これは、2つの値の世界ではdisplay: block flow-root
になります。 これらのものがどのように定義されているかを少し整理して明確にします。 必要に応じて、CSSのリファクタリング。
2値構文のブラウザサポート
現在のところ、ブラウザはdisplay
プロパティの2値構文をサポートしていません。 Firefoxの実装バグはここにあります。 実装(発生した場合)には、基本的に、レガシー値を2値バージョンにエイリアスすることが含まれます。 したがって、コードでこれらの2つの値のバージョンを実際に使用できるようになるまでには、しばらく時間がかかる可能性があります。 ただし、それは実際にはこの記事のポイントではありません。 代わりに、2値モデルに照らして表示の値を見ると、何が起こっているのかを説明するのに役立つと思います。
CSSでボックスのレイアウトを定義するときは、レイアウト内の他のすべてのボックスとの関係でこのボックスがどのように動作するかという観点から、このボックスに何が起こるかを定義します。 また、そのボックスの子がどのように動作するかを定義しています。 レガシーキーワードがそれらの値にマップされるため、値を2つの別個のものとして明示的に宣言できるようになるずっと前に、このように考えることができます。これは、 display
の値を変更したときに何が起こるかを理解するのに役立ちます。