暇だからCSSのセットアップでも載せとく。
CSSレイアウトで問題になるのは、ブラウザごとにバグがあって、それに対応するのにどうするかっていうのが一番困る。でも、ブラウザごとにっていっても、実際に問題があるのは、ネスケ4とかIE4とかMacIEとの本当に古いブラウザと、バグの多いけどまだちょっと使っている人がいるIE5、IE5.5、まだまだこれからも高いシェアを続けていくIE6と、かなりましになったけどまだちょっと問題のあるIE7を、なんとかすればいい。逆に言えば、これら以外のブラウザには、フツーに何の仕掛けもなしに、きちんと表示される必要がある。FirefoxとかOperaは、かなりきちんと表示してくれるから。
要するに問題なのはIEばっかりなんだけれど、FirefoxやOperaできちんと表示されていれば、IEでボロボロになってても、大して心配はない。一定の流れでバグ回避をしていけば、ほとんどきちんと表示されるようになる。だから、コーディング中は、IEを無視して、Firefoxできちんと表示されるように作るのが、第一ステップ。でも、CSSの対応具合で、実現できないのもあるから、その点は注意するとして。
というわけでFirefoxできちんと表示されるようになったんだけど、IEではいぜん、ボロボロのまま。フツーにCSSを書いているつもりなんだけど、全然ちゃんと表示されない。そんな時、IEで起こっている問題は、大体決まってる。IEのCSSバグの問題点は、大体以下の通り
滅茶苦茶一杯おかしいところがあるけど、1個ずつつぶしていけば大体直る。
それに、問題があるのは、IEの各バージョンだけなので、各ブラウザにのみ読み込ませるスタイルシートファイルを作って、そいつに、バグ対処を書いていく。自分がいつも使ってるのはこんな感じ。

オレンジのファイルにバグ対処の指定をかきこんでく。
例外として、ie67ってのは、IE6 / 7の両方に読み込まれるので、こんな感じで、このファイル内で、IE6向けにはスターハックで書く。それぞれのバグ対処についてだけれど、まず、
については、IE6以下において、問題のある要素にheight:0を指定すれば直る。これは有名なholly hackという方法で、IEは、widthかheightが指定されていると、問題無くなることがほとんど。全部にwidthを指定するのは現実的でないので、height:0を指定する。IE7の互換モードと、IE6以前では、heightに少ない値を指定しても、内容によって要素の高さが拡大されるため、height:0を指定しても、何も問題ない。これを、1個1個確認していくのはめんどい。そこで、background,borderが指定されている全てのブロック要素に、height:0を指定する。IE7の場合は、*{zoom:1}を指定すれば直る。理由はIE7のズーム機能でバグるを参照。
については、width,heightを指定してある要素にpaddingやborderを指定すると、高さや幅が変わるため、このようなCSSの指定を行わないか、行った場合は、各スタイルシートにそれを補正する記述をする。
については、IE6以下であれば、親要素のtext-alignによって、ブロック要素の左右位置も変わるため、それでなんとかする。
については、そうなっちゃった要素のマージンを1/2にした値を指定する。
については、どうにもできないため、表示が変わるものとあきらめるか、background-imageの指定で同様の効果を得られるように変更する。
については、IE5など使ってる人ほとんどいないと、あきらめるか、どうしても嫌な場合は、スペーサ入れるとかの方法に変更する。というか、フツーそんなに気にしない。
については、widthかheight / min-heightが指定された要素については、margin相殺が発生しなくなってしまうため、そもそもmarginの相殺にあまり頼らないようにするとか。
それ以外のバグも腐るほどあるけど、まーこれで大体直るような感じだと思いますきっと。
ちなみにこのBlogのCSSは、仕事じゃねーんでIE5 / 5.5ではあんまり完璧に再現でないけど、こんな感じです。
いろんなバグ対処にするには、以下のサイトが参考になりまーす
mia 2007/7/25 (10:15)
初めてお邪魔いたしました。
まさしくIEで途方に暮れております。
情報が大変参考になり感謝しております。
ありがとうございました。
またお邪魔させてください。
Takazudo 2007/7/30 (08:56)
miaさん はじめまして、Takazudoです。
お役に立てた用で何よりです。
最近思ったのですが、IE用CSSは、将来ほかのブラウザで読み込んでしまう可能性が無きにしも非ずなので、一応、中にかくセレクタは、全て* html .hogehogeという形式で書いておくと良いかもです。