Alternative Design Project

ADP: floatレイアウトでつまづかないためのTips

2004年07月09日 01:14 | コメント(12) | トラックバック(2)

IE7対応もかねて改訂(2006年9月12日)。

CSSのfloatを使ってよくあるレイアウトを実現する。出来上がりサンプル参照。ソースはサンプルファイル本体を参照してくだされ。

floatを使ってレイアウトに挑戦といっても、実際やろうとするといろんなところでつまづく。けっきょく、floatを使う場合はいつも行き当たりばったりになってしまい、CSSなんて嫌いだ!ということになりかねないので、どういうことに気をつけるべきかをチェックしていく。なので題して「floatレイアウトで(できるだけ)つまづかないためのTips」。

対象は、WindowsのIE, Mozilla, Operaの最近のやつ。使用するHTMLはXHTML 1.0 Strict、XML宣言あり。よって、IE6では後方互換モードになり、IE7やMozillaやOperaでは標準準拠モードになる。つまり、あくまで標準準拠なやりかたでやってIE6にも対応させる。転用するときは、ゆるいほうにかえてもいいっす。

できるだけ、特定のブラウザを狙い撃ちですーってすぐわかってしまうような汚いhackは使わないようにする。

よくあるレイアウトとして、以下のものを考えてみた。

幅は780ピクセル固定
全体をセンタリング
上段にタイトル(id="title")
中段はメニュー(id="menu")と本文(id="main")、メニューは左
メニューの幅は240ピクセル固定
メニューと本文の間は10ピクセル分
下段にフッター(id="footer")

応用範囲を広げるため、すべてにdivをかませる。

よくあるレイアウトの例(再掲、2.1KB)

以下Tips。

1. はじめにデフォルトスタイルシートの影響を減らすため、すべての要素のmarginとpaddingを0にしておく。

* {
	margin: 0;
	padding: 0;
}

ブラウザによって、いろいろデフォルトスタイルが違うので、はじめに0にあわせておき、使う要素に応じてあとで個別に変更する。

2. セレクタに対してwidthとpaddingを同時に指定しない。

これは、Windows IE6(後方互換モード)対策。

#title {
	width: 780px;
	height: 100px;
	background-color: #c2c2c2;
}
h1 {
	padding: 8px;
}

横幅をピクセルで固定したいときにはwidthとpadding (left or right) を同時に指定しない。これを覚えておくとトラブルに巻き込まれることがグッと減る。余白が欲しいときには、それよりも下位の要素にpaddingかmarginを指定する。どうしようもなければdivをもう一度かましてそれに指定する。

3. ピクセル単位であわせなければならない場所にはborderを使わない。

これも、Windows IE6・IE7対策。これを覚えておくとトラブルに巻き込まれることがグッと減る。borderを使いたいときには、横着せず背景画像を用意すること。見た目もよくなるし。詳しくは、ADP: ピクセル単位で合わせるところではborderを使わない(IE7でも!)を参照。

4. センタリング。

これは、IE6(後方互換モード)用にモロバレhackをかます。

body {
	text-align: center;
}
body div {
	text-align: left;
	margin: 0 auto;
}

5. menuとmainにfloat: leftとwidthを指定する。

HTMLソース上menuが先で、見た目上menuを左に持っていきたい場合。それぞれにwidthを設定する(必須)。2.で書いたとおり、padding (left or right)はmenuやmainには指定せず、その下位の要素に対して指定する。

6. footerにclear: bothを指定する。

フッターを作るため。ここでも、widthを指定しておく(IE6対策)。

7. containerをつくらないとうまくセンタリングされない。

menuとmainは、containerのようなdiv要素に含ませないとうまくセンタリングされない。

8. containerにfooterを入れる。

footerまでcontainerに入れないとcontainerの高さが確保されない。けっきょく

<div id="container">
 <div id="menu"></div>
 <div id="main"></div>
 <div id="footer"></div>
</div>

なかんじにmenu, main, footerをcontainerに含ませる。

9. 先にfloat: leftをしたボックスのmargin-leftや、先にfloat: rightをしたボックスのmargin-rightは指定しない(2004年12月9日書き換え)。

IE6ではまる。詳しくは、ADP: フロートとマージンを参照のこと。余白が必要な場合は、ボックスの中の要素にmarginかpaddingを指定する。

10. title, menu, main, footerに上margin、下marginを指定しない。

上下のマージン関係で大量にバグが潜んでいる。余白が必要な場合は、paddingを指定する。

なお、menuのほうがmainより長い場合を参考としてあげる。背景を指定する際には、containerに指定する。そうすればメニューと本文のどちらが長くなっても安心だ。

トラックバック(2)

トラックバックURL: http://adp.daa.jp/cgi/mt2/mt-tb.cgi/249

なんとか修正(あだしの): 2004年07月30日 00:51
floatレイアウトでつまづかないためのTips 参考になったのがADPのこの...
Movable Typeのカラムいじり〓構造を把握せよ(-絶対作れる!萌えアニメ- 銀の月 動画計画): 2005年02月03日 13:01
ええと、この話は2カラム化に限った話じゃないんですけど、もとつきせんせいが知りた...

コメント(12)

Momomo: 2004年07月09日 01:47

CSSのfloatレイアウト徹底攻略とかいうタイトルにした方がインパクトがあってよかったかも。

アサノ: 2004年07月10日 14:18

ちょっちブロギの方を position から float に移行(?)しようかなあ。

Momomo: 2004年07月10日 18:03

Movable Type 3.0も出てきたんで、そろそろfloatかなあ、という皆様のために特集(?)組んでます。自分もそう考えているひとりだったりしますが。

えく: 2005年04月08日 23:31

 ボックスにwidthを指定しなければならない理由は何ですか?

Momomo: 2005年04月09日 00:37

ご質問ありがとうございます。ボックスにwidthを指定しなければならない理由は、http://altba.com/bakera/hatomaru.aspx/ebi/topic/472 らへんの話題だと認識しています。

kuma: 2005年06月24日 00:42

大変参考になりました。
唐突ですが、質問があります。「containerにfooterを入れないとMozillaではまる。」とはどういうことでしょうか?
「container」の外に「footer」を置いても、問題なく表示されるのですが。

辰見 根音: 2005年12月16日 11:49

ようやく正解が見つかった気がします。単純な2カラム
のレイアウトでも、IE用には完璧でもMZ系だと重なり
合ってしまったり…と、今週は散々でした。ですが、こ
のサイトでの勧めに従って、基準BOXからの相対配置
レイアウトは止めて、フロート配置レイアウトに切り替え
ようと思います。これで、少しマシなものが出来上がる
でしょう!?とまれ、ありがとうございました。 m(_ _)m

い: 2006年03月02日 10:59

containerに背景色を指定すれば理由がわかると思います。
>>「containerにfooterを入れないとMozillaではまる。」

gemini: 2006年03月04日 07:48

CSSでなやんでたずれが解決。ありがとうございました。

刹那: 2006年08月19日 16:06

cssで一番苦戦していたfloatが分かりやすく説明されていて、とても参考になりました。これからも頑張って更新を続けて下さい。

とろやん: 2006年10月11日 21:16

ちょうどMozilla系のfloatではまっていたところ、大変助かりました。ありがとうございました。

堀しのる: 2006年10月12日 01:43

xml宣言をするとIE6.0で互換モードになってしまい、レイアウト崩れるのにずっとなやんでましたが、なんのことはない、ものすごく簡単なhackで解決できたんですね、助かりました。ありがとうございます

コメントの内容確認のため、反映されるまで時間がかかる場合があります。e-mailはサイトに掲載されません。

このページの先頭へ