[CSS雑談](IE)Internet Explorer 5〜6の頃こんな事あったよね
2024/11/27 (水) - 20:00 CSS
Web 2.0が称されていた2000年代初頭。Web制作界隈でもtable要素を使ったテーブルレイアウトからセマンティックなHTMLとCSSレイアウトへ移行していた時期でもあり、PCのブラウザは群雄割拠の時代でもありました。まだGoogle Chromeもスマートフォンもない頃です。その当時は以下のブラウザが主流でした。
- Internet Explorer(Windows IE5.0〜6.0 / Mac IE5.x)
- Mozilla FIrefox
- Safari
- Opera
その中でも問題だったのがIE5〜6(Internet Explorer)でした。IEはW3CのWeb仕様に準拠していないうえに、独自実装やバグが多く他のブラウザと表示や挙動の差を埋めるのに苦労したとかしないとか(当時は8割近くがIEユーザだったので無視はできなかった)。今日はそんな思い出話。
ボックスモデルの解釈
当時のIEはボックスモデルの解釈がおかしいという不具合が有り、(X)HTMLのドキュメント宣言やxml宣言の有無でレンダリングモードが変わるなどの挙動がありました。今でいうbox-sizing
のcontent-box or border-box
みたいなものですね。もちろん当時はbox-sizing
のような便利なプロパティはまだありません。
- モダンブラウザでの解釈(
box-sizing:content-box
) - widthやheightを指定した時、paddingとborderを含めない
- IE(後方互換モード)での解釈(
box-sizing:border-box
) - widthやheightを指定した時、paddingとborderを含める
これにより、IEとモダンブラウザで大きさが変わりレイアウト崩れが起きる…なんてことがありました。回避法としてはpaddingやborderを指定する要素にはwidthやheightを指定しないことでした。
floatを使ったレイアウトテクニック
tableでレイアウトしていた頃は、レイアウトカラムをtable要素で組んでいましたが、CSSレイアウトになってからは回り込み目的のfloatプロパティでWebページの大枠のレイアウトを作るようになりました。まだflexやgridなんて無い頃です。一方floatを使うと回り込み解除(clear)する必要があります。回り込み解除のために任意の場所に無駄にHTMLを追加するのはバッドノウハウだったので、親要素で回り込みを解除するclearfixと呼ばれるテクニックが登場します。
HTML
<div class="parent">
<div class="left">左カラム</div>
<div class="right">右カラム</div>
</div>
CSS
/*親ボックス要素*/
.parent{
width: 100%; /*←(1)*/
}
.parent::after{ /*←(2)*/
display: block;
clear: both;
content: "";
}
/* MacIE用 */
/*\*//*/
display: inline-table; /*←(3)*/
/* */
/*左レイアウト要素*/
.left{
float: left;
width: 20%;
}
/*右レイアウト要素*/
.right{
float: right;
width: 75%;
}
(1)で親要素にwidthプロパティで何かしらの値(auto以外)を指定することです。WinIE5〜7ではこれだけでfloatを解除できます(※IE5.0を無視していいのであれば、親要素にzoom:1;
というプロパティを指定するだけでもいけた)。IEには独自のhasLayoutという概念がありまして、それが影響していました。
(2)次にモダンブラウザ向けに、after疑似要素を使って無理やり回り込みを解除します。IE5〜7では疑似要素に対応していない為使えません。
(3)MacIEでは、(1)(2)の方法が使えないので、ホーリーハック・バックスラッシュハックと呼ばれるCSSハックを使ってMacIEだけにdisplay: inline-table;
を読ませてfloatを解除します。
marginが2倍キャンペーン
ブロック要素に、floatと同じ方向に左右marginを指定するとIEだけ値が2倍になってレイアウトが崩れる…というバグがありました。
.left{
width: 200px;
float: left;
margin-left: 10px; /* ←IEだけ20pxになる */
display: inline; /* ←これを指定するだけで直る */
}
対象のセレクタにdisplay: inline
を指定するだけで直る上に、他のブラウザでも影響を受けないので重宝していました。
.top{
margin-bottom: 50px;
}
.bottom{
margin-top: 100px;
}
また上下に要素があり、それぞれにmarginがある場合本来は相殺されるのが正しいです。上記の例であれば要素間の隙間は100pxになります。しかしIEでは相殺されず150pxになってしまいます。
font-size固定(px/pt)にするとブラウザでフォントサイズ変更できない
IEではフォントサイズを[最小][小][中][大][最大]と変更できました。しかしfont-size
プロパティでpxなどを指定するとフォントサイズが変更できない仕様でした。ユーザビリティの観点からフォントサイズを変更できるようにすることが要件だったため、emや%で指定することが必須でした(remはまだ無かった)。
親要素で%やemで指定すると、子要素でもフォントサイズを継承してしまうため、一体この要素は何px相当のフォントサイズなのか?一見して分かりづらいので設計は要注意です。
CSS2セレクタや半透明PNGが使えない
Windows版のIE5〜6ではアルファチャンネルを含むフルカラーPNG画像が使えずデザインに影響が出ることがありました。その場合はCSSハックやPolyfillをつかい、無理やり対応させたりそもそも半透明PNGを使わないという選択肢に迫られました。
一方でMacOS版のIE5では、半透明PNGが使えたんですね…。これはWindows版のIEがTridentというブラウザエンジンなのに対し、MacOS版のIE5はTasmanというブラウザエンジンで全く別物だったことに起因します。これに付随してWindows版のIE5〜6ではCSSの「子供セレクタ div>p{}
」「隣接セレクタ div+p{}
」が使えないのに対し、MacOS版のIE5では使えたという中途半端な状態となっていました。
語りたいことはたくさんあるけれど…
IEはCSSに限らずJavaScriptの実装や動作においても仕様が異なっておりエンジニアの人は苦労しました。その実装の差を埋めるためのフレームワーク、jQueryが登場したのはWeb制作の世界を大きく変えました。IE7〜IE11もといMicrosoft Edge(EdgeHTML版)も面倒なCSSやJSのバグが多くて、長い間苦しめられました。
次回、ガラケーHTML制作苦労話 i-mode,EZwebブラウザ編…ッ!(覚えていたら)
おしまい♥
タグ:Webブラウザ
おすすめ記事
- CSSで背景がぼけるすりガラスを再現
- transitionでheight:autoを動かす2つの方法。
- スクロールして要素が見えたら画像がワイプのアニメーションで表示するやつ
- Youtubeショート動画を埋め込みレスポンシブ対応する
- CSSでスクロールバーの色を変更する
トラックバック & ピンバック
- この記事へのトラックバックURI:
- https://weblog.walk-life.me/ie5-6bug/trackback/