普段、残業なんて滅多にしない職場で働いている自分ですが、この2週間ほどは激務でした(どれぐらい激務だったかはいいません。あくまで個人的にそう思っただけで、中にはそんなの激務じゃないと言われそうなレベルの量なので)
それはともかく、その間にやっていた仕事がframesetやframeタグを使っているフレームを利用したHTMLファイルをHTML5化するというもの。しかし、知ってる人も多いと思いますが、framesetやframeタグはHTML5で廃止されてしまっています。とりあえず代替方法としてiframeタグを使うことになったのだけれども(この実装方法に突っ込まないでください。時間がなかったのでこうするしかなかった)、最初、うまい実装方法が思いつきませんでした。しかも、対応ブラウザはIE6以上と言われています(HTML5なのに、IE6以上って………)。
例えば、以下のようなコード。
<frameset rows="50,*,70" border="0" framespacing="0"> <frame src="header.html" name="header" id="header" scrolling="No" noresize> <frame src="main.html" name="main" id="main" scrolling="auto"> <frame src="footer.html" name="footer" id="footer" scrolling="No" noresize> <noframes><body>このページはフレームを使用しています</body></noframes> </frameset>
サンプルページ
ヘッダとして上部に50px、フッタとして下部に70px、そしてメインのページをその間に入れたフレームページです。ヘッダとフッタは問題ありません。問題はメインページです。動的に高さを変更しなければいけないわけですが、うまい方法が思いつきませんでした。
最初はそれぞれのiframeをtable,tr,tdタグで囲って、tableの高さを100%にし、一番上のtrの高さを50px、一番下のtrの高さを70pxにしてみました。一見、うまくいったように思えたのですが、IE10以下でダメでした・・・。
次に考えたほうほうが、#mainをdivタグで囲み、そのdiv(#main_containerとする)をbodyと同じ幅と高さと位置にして、box-sizingをborder-boxにしたうえで、padding-topを50px、padding-bottomを70pxにしたうえで、#mainの高さと横幅を100%にしたらいけるんじゃ・・・なんて思ったけど、よくよく考えるとIE7ではbox-sizing非対応だったのでできません(IE6はもともとbox-sizing:border:box;と指定した時と同じ振る舞いだったはずです)。
困ったなぁ。どうしたらいいんだ・・・。と思いながらふと思いついた。先ほどの#main_containerのtopを50pxにして、bottomを70pxにしたらどうなるんだろう・・・。と。
結果、期待通り、上部に50px、下部に70px空いた要素となりました(てっきり、どっちも指定している場合、どっちかが優先されるもんだと・・・。CSSはある程度わかってきたと思ったんだけどなぁ。CSS界隈では常識だったりするんだろうか?)
というわけで、以下が実装結果。
CSS
body,html{ height:100%; margin:0; padding:0; overflow: hidden; } iframe{ border:none } #header{ position:absolute; top:0; left:0; height:50px; width:100%; } #footer{ position:absolute; bottom:0; left:0; height:70px; width:100%; } #main_container{ position:absolute; top:50px; bottom:70px; left:0; width:100%; /*IE6用*/ _top:auto; _bottom:auto; _padding-top:50px; _padding-bottom:70px; } #main{ *position:absolute; /* IE7用 */ _position:relative; /* IE6用 */ width:100%; height:100%; }
HTML
<iframe src="header.html" name="header" id="header">header</iframe> <div id="main_container"> <iframe src="main.html" name="main" id="main">main</iframe> </div> <iframe src="footer.html" name="footer" id="footer">footer</iframe>
IE6やIE7ではうまくいかないところもあったので、何度か試行錯誤してどのブラウザでも実装することができました。同じように左・中央・右にわけたフレームページでは下記のようになります。
HTML4
<frameset cols="60,*,80" border="0" framespacing="0"> <frame src="left.html" name="left" id="left" scrolling="No" noresize> <frame src="main.html" name="main" id="main" scrolling="auto"> <frame src="right.html" name="right" id="right" scrolling="No" noresize> <noframes><body>このページはフレームを使用しています</body></noframes> </frameset>
HTML4:サンプルページ
HTML5
body,html{ height:100%; margin:0; padding:0; overflow: hidden; } iframe{ border:none } #left{ position:absolute; top:0; left:0px; width:60px; height:100%; } #right{ position:absolute; top:0; right:0; width:80px; height:100%; } #main_container{ position:absolute; left:60px; right:80px; top:0; height:100%; /*IE6用*/ _left:auto; _right:auto; _padding-left:60px; _padding-right:80px; } #main{ *position:absolute; /* IE7用 */ _position:relative; /* IE6用 */ width:100%; height:100%; }
HTML5:サンプルページ
応用として、framesetの中にframesetがあるページも下記の通り。
HTML4:サンプルページ
HTML5:サンプルページ
ただし、最後のはIE6でうまく動きませんでした。こういうページの場合は、最初に作ったframe1-html5.htmlの中の#mainのsrc属性を、二つ目に作ったframe2-html5.htmlにするほうがいいかもしれません。
コメント
フッターも(header.html)と書かれてるのはご愛嬌ですかね
ただの間違いです……。
とりあえず気づいたので、愛嬌ということにしておきます(おい)。