CSSフロー制御:書式設定コンテキストの作成

clearまたはoverflowプロパティだけでなく、フローを制御できますdisplay:inline-blockまたはdisplay:table-cellを使用すると、前述のoverflow 完全に置き換えることができ 、要素のサイズを指定したり、追加機能を提供したりするリスクがなくなります。

この記事には普遍的なソリューションは含まれていませんが、フロー制御のための追加ツールがあなたの目に開かれています。

ブロック要素のコンテキスト形式に関する段落の完全な翻訳は次のとおりです( css仕様から )。
フローティング、絶対配置、テーブルセル( table-cell )またはテーブルヘッダー( table-caption )、インラインブロック( inline-block )、およびvisible以外のoverflow持つ要素としてvisible (値がエリアに継承される場合はカウントしない)ビュー)書式設定の新しいコンテキストを設定します

フローティング要素と絶対配置要素を使用すると、すべてが明確になると思います。 「 overflow 」もあります。 テーブルヘッダーを使用した実験では何も生じなかったことをすぐに付け加えます。

重複しないようにするため、新しいコードはどこでも使用され、元々次のスタイルコードが記述されていることを発表します。
 #sidebar{ width:30px; height:200px; background-color:#ddd; float:left; } #content{ background-color:#dcd; } #content .col{ float:left; height:50px; width:30px; text-align:center; background-color:#cdd; } #content2{ background-color:#ddc; } 

およびマークアップ:
 <div id="sidebar"> side </div> <div id="content"> <div class="col"> col1 </div> <div class="col"> col2 </div> <div class="col"> col3 </div> </div> ff <div id="content2"> more content </div> 


このコードは、ブラウザーで次のようにレンダリングされます。


1. display:inline-block


それでは、 display:inline-blockが可能なdisplay:inline-block見てみましょう。
#
firefoxとieを修正しdisplay:inline (hasLayout display:inlinedisplay:inline-blockように機能する場合)
#
余分な水平方向のスペースであるvertical-align:bottom IEの*vertical-align:0%を追加し、Operaのテキストを下げます( vertical-align:text-bottom )。
#
垂直方向のスペースは、 hasLayout 1つの要素で結合され、別の要素でfloatするときに表示されるIEのバグです。 overflow:hiddenを使用しても、 display:inline-blockとは関係なく、それがあなたにとって重要な場合でも*margin-left:-3px私はあなたの肩に解決策を探して、今のところ*margin-left:-3pxを使用します
#

残念ながら、すべてが見た目ほど良いわけではありません。 問題は 2番目のffにあり-moz-inline-block 。 ただし、この場合、 floatプロパティを持つすべての列は正常に表示されます。

display:table-cell


display:table-cell開始しましょうdisplay:table-cell
#
すべてが素晴らしく、サファリは愚かです- table書くだけです。つまり、 table-cellはまったくサポートしていません。それから、少なくともすべてのブラウザで表示するようにします。
何がありますか-
a)要素の幅はコンテンツによって決定されます
b)要素は他の要素をその水平レベルにさせない
display:inline-blockとほぼ同じdisplay:inline-block 、単に行の折り返しを追加します。 IEでこれをすべて行い、既知の欠陥をすぐに修正します。
#

この方法を使用します。 さらに、コンテナの後にテキストまたは文字列要素ではなくブロック要素がある場合、IEで改行する必要はありません。また、コンテナの幅がわかっている場合は、
1)コンテナのコンテンツではなく幅を定義するため、IEでdisplay-inlineを使用する必要はありません。
2) display-inlineシミュレートしないため、IEで改行する必要はありません。
3)幅によって有効にされるため、hasLayoutを有効にするために個別のプロパティは必要ありません

3. Float


すでに書いたように、floatは新しい書式設定コンテキストも作成します。 役に立つかどうかはわかりませんが、知っておくべきです。 それで、これはどのように現れますか? float:left .col float:leftセットはそれらをストリームから引き出し、それらのコンテナには何も含まれていないように見え、実際、#contentは幅と高さに設定されない限り表示されません。 確認するために、 .col (およびそれ以降のすべての見掛け倒し)から背景を削除しましょう。
.colからbackground-colorを削除しbackground-color
#
そして、今度は何overflow:hiddenか見てみましょうoverflow:hiddenがもたらす(つまり、 hasLayout含む)
#
table (つまり、明らかな理由で省略)
#
そして最後にfloat:left (あなたができるとright )。
#

ブラウザーはこれらの例と絶対配置のために個別のフォーマットコンテキストを作成するため、パフォーマンスを向上させるために、Javaスクリプトが操作する要素は、絶対配置されたコンテナーだけでなく、上記のいずれにも配置されると考えられます。

これらの手法を使用して、 clearおよびoverflowプロパティに固有の問題を解決し、ページを処理するブラウザーのパフォーマンスを向上させることができます。

私のサイトのCSSでのフロー制御に関する記事:フォーマットコンテキストの作成

Source: https://habr.com/ru/post/J48429/


All Articles