float:left; 対表示:インライン; vs表示:インラインブロック; vs表示:テーブルセル;


281

私の質問

  1. これらの方法のいずれかが、プロのWebデザイナーに好まれていますか?

  2. これらの方法のいずれかは、ウェブサイトを描画するときにウェブブラウザによって優先されますか?

  3. これはすべて個人的な好みですか?

  4. 他に見逃しているテクニックはありますか?

注:上記の質問は、複数列レイアウトの設計に関するものです


float:left;

http://jsfiddle.net/CDe6a/

float:左の画像

これは、列のレイアウトを作成するときにいつも使用する方法で、問題なく動作するようです。ただし、親はそれ自体で崩壊するので、clear:both;後で覚えておく必要があります。私が見つけたもう1つの欠点は、テキストを垂直に配置できないことです。

表示:インライン;

これは、親の折りたたみの問題を修正するようですが、空白が追加されます。

http://jsfiddle.net/CDe6a/1/

表示:インライン画像

HTMLから空白を削除することがこの問題を解決する最も簡単な方法のようですが、HTMLに本当にうるさい場合は望ましくありません。

http://jsfiddle.net/CDe6a/2/

HTML空白画像なし

表示:インラインブロック;

のように動作するようdisplay:inline;です。

http://jsfiddle.net/CDe6a/3/

表示:インラインブロックイメージ

表示:テーブルセル;

http://jsfiddle.net/CDe6a/4/

表示:テーブルセルイメージ

完璧に動作します。

私の考え:

レイアウトを壊す特定の例外のように、たくさんのものを見逃していると私は確信していますが、display:table-cell;最もうまく機能してfloat:left;いるようですclear:both;。私はこれについて多くの記事やブログをウェブで読んだことがあるが、どれも私が私のウェブサイトをレイアウトするときに何を使うべきかについて明確な答えを与えてくれない。


4
html5boilerplateとTwitter Bootstrapの人たちが何を使っているかを見て、それに固執する
Robert Niestroj

1
CSS-トリックでスペースを戦っについての素晴らしい記事があります:css-tricks.com/fighting-the-space-between-inline-block-elements
リーRosema

display: inlineプロパティを使用してみましたが、子要素のパディングが正しく処理されないことがわかりました。しかし、私がdisplay: inline-blockこれを使用する場合、これは自動的に処理されます。リンクを参照してください-codepen.io/prashdeep/pen/rVOyvd同じ入力を教えてください
ジルカヌ

回答:


200

あなたが尋ねたオプションのうち:

  • float:left;
    フロートをクリアするために追加のマークアップが必要なため、フロートは嫌いです。私に関する限り、floatCSS仕様ではコンセプト全体の設計が不十分でした。でも今は何もできません。しかし重要なことは、それが機能し、すべてのブラウザー(IE6 / 7を含む)で機能することです。したがって、必要に応じて使用してください。

:afterセレクターを使用してフロートをクリアする場合、クリアするための追加のマークアップは必要ない場合がありますが、IE6またはIE7をサポートする場合、これはオプションではありません。

  • display:inline;
    これは、IE6 / 7を除いて、レイアウトには使用しないでください。IE6/ 7 display:inline; zoom:1は、の壊れたサポートのフォールバックハックですinline-block

  • display:inline-block;
    これは私のお気に入りのオプションです。一部の要素をサポートするIE6 / 7には注意が必要ですが、すべてのブラウザーで一貫して適切に機能します。しかし、これを回避するためのハッキーなソリューションについては、上記を参照してください。

もう1つの大きな注意点inline-blockは、インラインアスペクトのため、要素間の空白はテキストの単語間の空白と同じように扱われるため、要素間にギャップが生じる可能性があるということです。これには回避策がありますが、どれも理想的ではありません。(最善の方法は、要素間にスペースを入れないことです)

  • display:table-cell;
    もう1つは、ブラウザーの互換性に問題があることです。古いIEはこれではまったく機能しません。しかし、他のブラウザの場合でも、and table-cellとしてスタイル設定された要素の内部にあるコンテキストで使用するように設計されていることは注目に値します。単独で使用することは意図された方法ではないため、ブラウザによって異なる扱いを受ける場合があります。tabletable-rowtable-cell

あなたが見逃したかもしれない他のテクニック?はい。

  • これは複数列レイアウト用であると言うので、知っておきたいCSS列機能があります。ただし、これは最もよくサポートされている機能ではないため(IE9でもIEでサポートされておらず、他のすべてのブラウザーで必要なベンダープレフィックス)、それを使用したくない場合があります。しかし、それは別のオプションであり、あなたは尋ねました。

  • CSS FlexBox機能もあります。これは、ボックス間でテキストが流れるようにすることを目的としています。これは、いくつかの複雑なレイアウトを可能にするエキサイティングな機能ですが、これはまだ非常に開発中です-http://html5please.com/#flexboxを参照してください

お役に立てば幸いです。


2
フロートをクリアするために追加のマークアップは必要ありません。それについての私の答えを参照してください。
リーライアン

3
最も堅牢な応答=回答。
EGHDK

2
inline-blockそれはこれらのケースのために正確に作られているので、私はいつも使用します。
Rápliアンドラーシュ

1
display:inline-blockが作成する空白を削除するための適切な方法は、コンテナー要素でfont-sizeを0に設定し、インライン要素自体に必要なものを設定することです。これにより、html内の空白を削除する必要がなくなります
AlexMorley-Finch 2014

1
@ AlexMorley-Finch:確かに、それは1つの優れたソリューションです。ただし、emsでフォントサイズを使用している場合は機能しないことに注意してください。つまり、すべてのケースに適したソリューションとは限りません。この点をカバーする私が別に投稿したこの回答、および空白の問題に対処するための他のオプションもご覧ください。
Spudley、2014

34

私は通常、折りたたみ親の問題解決するために使用float: left;および追加overflow: auto;ます(これが機能する理由については、overflow: auto明示的な高さを指定しない場合、スクロールバーを追加する代わりに親を展開し、overflow: hidden同様に機能します)。私が持っていた垂直方向の配置の必要性のほとんどは、メニューバーの1行のテキストに対するものでline-heightプロパティを使用して解決できます。本当にブロック要素を垂直方向に配置する必要がある場合は、親と垂直方向に配置されたアイテムに明示的な高さを設定し、絶対位置、上位50%、負のマージンを配置します。

私が使用しない理由display: table-cellは、サイトの幅で処理できるよりも多くのアイテムがある場合にオーバーフローする方法です。table-cellはユーザーに水平スクロールを強制しますが、floatはオーバーフローメニューをラップし、水平スクロールを必要とせずに引き続き使用できるようにします。

float:leftとoverflow:autoの最も優れた点は、IE6に戻るまでハックせずに動作することです。

ここに画像の説明を入力してください


この優れた点は、多くの人気のあるチュートリアルでは言及されていません。いくつかの質問:これは実際に別のブラウザーでテストされていますか?navとcontentなどの2つのブロックの間にセパレーターを描画するためにどの方法を選択しますか?私が尋ねる理由は、上記のdivの高さが異なる場合は難しいためです。
Shital Shah、2013

@ShitalShah:「これ」の意味がよくわかりませんが、私は無数の水平メニューを実装しており、フロートの左とオーバーフローは、IMOが多くの異なるブラウザーに水平メニューを実装する最もクリーンで信頼できる方法です。新着。セパレータを追加するために、私は通常、左ボーダーを使用します(または、古いブラウザを気にする必要がない場合は、CSS3ボーダー画像を使用することもできます。私はあなたが高さの違いによってあなたが何を意味しているのかよく理解していません。
Lie Ryan

これは、クリアリングについて多くをクリアし、オーバーフローがこれを行うことができることを知りませんでした。Imは、コンテンツを追加する:afterメソッドに使用します: "。" および可視性:非表示。これをありがとう
Nils_e 2015

9

私はそれがあなたがそれを必要とするものに依存すると思います:

  1. 3列のレイアウトを取得するためだけに必要な場合は、を使用することをお勧めしますfloat

  2. メニューに必要な場合は、を使用できますinline-block。空白の問題については、Chris Coyierがここhttp://css-tricks.com/fighting-the-space-between-inline-block-elements/で説明しているように、いくつかのトリックを使用できます

  3. 幅が指定されたボックス内で均等に広がる必要がある複数の選択肢のオプションを作成する必要がある場合は、私が好みdisplay: tableます。これは一部のブラウザーでは正しく機能しないため、ブラウザーのサポートによって異なります。

最後に、最善の方法はを使用することflexboxです。この仕様は何度か変更されたため、まだ安定していません。しかし、それが確定したら、これが私が考える最良の方法になるでしょう。


+1は、Chris Coyierの記事へのリンクです。彼のリストへの追加の1つは、YUIのPure CSSグリッドが使用する方法です:github.com/yui/pure/blob/master/src/grids/css/grids-core.css
Web_Designer

4

floatも便利ですが、インラインブロックを好みます。テーブルセルが古いIEで正しくレンダリングされません(インラインブロックもレンダリングされませんがzoom: 1; *display: inline、私が頻繁に使用するハックがあります)。親よりも高さが低い子がある場合、フロートはそれらを上に持ってきますが、インラインブロックは時々台無しになります。

もちろん、IEでない限り、ブラウザはすべてを正しく解釈します。たとえば、テーブルセルの概念など、IEで問題が発生しないことを常に確認する必要があります。

すべての現実において、はい、それは個人的な好みに要約されます。

空白を取り除くために使用できるテクニックの1つfont-sizeは、親に0を設定し、それからfont-size子に返却することですが、それは面倒で大雑把です。


「IEが正常に動作しないことを常に確認する必要がある」場合は、常にがっかりします。へへ。(一方で、サポートしたいIEの各バージョンでコードが機能しないことを常に確認する必要があると彼は言っています)
Spudley

4

参考までに、Spudleyの回答に追加するためにposition: absolute、列幅がわかっている場合は、マージンを使用することもできます。

私にとって、メソッドを選択する際の主な問題は、列全体の高さ(同じ高さ)を埋めるために列が必要かどうかであり、table-cellが最も簡単な方法です(古いブラウザーをあまり気にしない場合)。


0

私が好むinline-blockが、floatインラインブロックは、他の多くのケースではうまく機能している間、フロートが少ない行を書いて、より良い作業、我々は1が右へ左1に固執すべき要素を持っている特別な時に、まだHTML elemenetsを一緒に入れて便利な方法です。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.