クロスブラウザインラインブロック

2009年2月の寒さでRain Dohertyが書いた記事「Cross-Browser Inline-Block」の翻訳を紹介します。 この記事では、 表示プロパティをinline-blockに設定したリストアイテムのレイアウトについて説明します。 これについての記事、および結果を達成する過程で生じる困難について、およびそれらの「治療」の方法についての記事。



Inline-block表示プロパティの魅力的な値。これは多くのことを約束し、ほとんど何もしません。 非常に頻繁に、私はこのようなPSDファイルを得ました:


泣いた。

通常、この表示方法では問題は発生しません。 固定幅、固定高さ、 フロート:左および完了。 そうでない場合は、しかし! デザインは、あらゆる量のコンテンツで正しく表示されるはずです。 この場合、ブロックの1つにもう少しデータが含まれていると、グリッド全体が「破損」します。



最初の要素は次の要素よりも高いため、5番目の要素は必要に応じてその下ではなく、右端に沿って「流れます」。 一般に、テーブルの弾力性が必要ですが、正しいセマンティックレイアウトが必要です。

リスト項目で表示プロパティがinline-blockに設定されている簡単な例から始めましょう。

<ul> <li> <h4>This is awesome</h4> <img src="1450821541436477177797" alt="lobster" width="75" height="75"/> </li> ... <ul> <style> li { width: 200px; min-height: 250px; border: 1px solid #000; display: inline-block; margin: 5px; } </style> 


結果は、Firefox 3、Safari 3、およびOperaで正しいように見えます。



垂直方向の配置に問題があるようです。 実を言うと、エラーはありません。これはブラウザーの正しい動作にすぎませんが、期待する結果にはなりません。

ここで次のことが行われます。各<li>要素のベースラインは、親の<ul>要素のベースラインに揃えられます。 あなたは尋ねます、ベースラインは何ですか? 百回聞くよりも一度見た方が良い:



上の図のベースラインは、文字のベースを通る線で示されています。 inlineおよびinline-block要素のvertical-alignプロパティのデフォルト値baselineです。 これは、要素のベースラインが親のベースラインと一致することを意味します。 次の図は、このような配置の例を示しています。



ご覧のように、上の図のブロックの各ベースラインは、「これはベースラインです」というテキストのベースラインに揃えられていますが、これは<li>要素ではありません。 これは<ul>に直接配置されたテキストノードであり、 <ul>要素のベースラインの場所のインジケータとしてそこに配置されます。

最初に必要な配置オプションを取得するのは非常に簡単です。 垂直配置プロパティの最高値を設定するだけで、結果として優れたグリッドを取得できます。



しかし、これはFirefox 2、IE 6および7では機能しません。



Firefox 2を始めましょう。

Firefox 2はinline-block値をサポートしていませんが、Mozilla - displayプロパティの特定の値-moz-inline-stackを理解してます。 インラインブロックアクションに似た結果を生成します。 display:inline-blockの前に追加すると、Firefox 2は上記を無視します 。これは理解できないため、 -moz-inline-stackを使用するためです。 他のブラウザはinline-blockを使用し、理解できない-moz-inline-stackを無視します

 <style> li { width: 200px; min-height: 250px; border: 1px solid #000; display: -moz-inline-stack; display: inline-block; vertical-align: top; margin: 5px; } </style> 


残念ながら、これにより小さなバグが発生します。



正直なところ、その原因はわかりません。 幸いなことに、 <li>要素の内容全体を追加の<div>でラップすることにより、非常に単純に処理されます。

 <li> <div> <h4>This is awesome</h4> <img src="1450821541436477177797" alt="lobster" width="75" height="75"/> </div> </li> 




次にIE 7に進みましょう。また、 inline-blockをサポートしていませんが、このトリックを使用できます。これにより、 <li>要素がinline-blockの値を使用するかのように画面に表示されます 。 どうやって? 多くの操作を可能にするIEの魔法のプロパティであるhasLayoutを使用します。 要素に対してhasLayout:trueを明示的に指定したり、同様の単純な方法でそれを実行したりすることはできませんが、 zoom:1を指定してメカニズムを開始できます。

技術的には、 hasLayouttrueに設定された要素は、自身とその子をレンダリングする役割を果たします。 これをmin-heightwidthと組み合わせて、 表示に非常に近い結果を取得します:block 。 それは魔法の粉のようで、表示するときに現れるすべての問題が消えます。

<li>要素にzoom:1および* display:inline (アスタリスク IE 6およびIE 7のハック)を追加すると、IE 7にinline-blockのように表示するように指示します

 <style> li { width: 200px; min-height: 250px; border: 1px solid #000; display: -moz-inline-stack; display: inline-block; vertical-align: top; margin: 5px; zoom: 1; *display: inline; } </style> 




ほぼ完了。 IE 6のみが残ります。



IE 6はmin-heightをサポートしていませんが、代わりにheightプロパティへの誤った参照を使用できます。 _heightアンダースコアに注意)を250pxに設定し、目的の高さのすべての<li>要素を取得します。 内容が指定された値を超える場合、コンテナを単純に引き伸ばします。 他のすべてのブラウザーは_heightを無視します

最終的なCSSとHTMLは次のようになります。

 <style> li { width: 200px; min-height: 250px; border: 1px solid #000; display: -moz-inline-stack; display: inline-block; vertical-align: top; margin: 5px; zoom: 1; *display: inline; _height: 250px; } </style> <li> <div> <h4>This is awesome</h4> <img src="1450821541436477177797" alt="lobster" width="75" height="75"/> </div> </li> 

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


All Articles