突然ですが。
もうFloatしたDivをいかにうまくレイアウトするか…
デザイン制約がありすぎて、僕、もう疲れたよ…パトラッシュ…
というくらいには、Floatしたカラムの高さをそろえるのが嫌いなマツモトです。
今回はちゃんと向き合うことにして、記事にしてみます。
どういうことかっていうと
こういうケース。html
<div id="Header"></div> <div id="SideMenu"></div> <div id="MainColumn"></div> <div id="Footer"></div>
css
#Header{/*css*/} #SideMenu{ float:left; height:auto; } #MainColumn{ float:right; height:auto; } /*:afterでclearFloatする時もあるよ*/ #Footer{ clear:both; }
もちろん、コンテンツがたくさんあってSideMenuの背景が足りない、とか左右逆のケースもあります。
で、これ、overflowすればheightはちゃんと伸びたように見えます。
それか、SideMenuとMainColumnの背景部分をつけない。とか、すればFooterは少なくとも蹴られますね。
今まではこれで良かった。
どっこい。どっこい
先日マツモトがやりたかったレイアウトはこれ。positionで重ねたい。
しかも、MainColumnのWidthは%指定。
FooterはWidth:100%で繰り返し。
なのでちゃんと左右にリキッドでなくてはならず、
Footerに重なった部分だけを”見せかけ上”だけ置いておくのは不可。
そろそろ、対応策をきちんと覚えておこうぜ
というわけでGoogle先生に頼らせていただくと、さっそく出てきた。
Divの高さを合わせるスクリプト(safari対応版)
さーすーがーでーすーなー!
参考にさせていただいて、
ですが、マツモトのケースではSideMenuが場合によって表示しない時があるので、
この場合は高さが取得されないことになってしまいました。
なので、アレンジさせていただいた。
SideMenuの子要素Divがあった時だけ、という条件を足して、さらにそれ以外の場合にはheightを自動でつけるように足してます。
javascript
window.onload = function(){ //高さを合わせるIDを指定 var id = new Array("SideMenu", "MainColumn"); var idHeight = new Array(); var maxHeight = 0; var sideMenu = document.getElementById("SideMenu"); if(sideMenu.getElementsByTagName('div').length > 0){//sidemenuにdivがあった時だけ //指定IDの高さを取得 for(i=0; i < id.length; i++){ idHeight[i] = document.getElementById(id[i]).offsetHeight; } //最大の高さをmaxHeightに格納 for(i=0; i < id.length-1; i++){ maxHeight = Math.max(maxHeight, idHeight[i]); } //一番高いのに最少の高さを合わせる for(i=0; i < id.length; i++){ document.getElementById(id[i]).style.minHeight = maxHeight + "px"; } }else{ document.getElementById("MainColumn").style.height = "auto";//それ以外はheightを自動に } }
これでやりたいことができましたー!
Floatした時の高さについて挙動は、理論上は正しいと理解しているけど、やっぱりもうちょっと都合つけば良いのになー。とつい愚痴ってしまいますが、今のところは良い対処ができたかなー。と思います。
もっとこうしたらスマートでしょ!
などありましたら、ぜひコメントください~。
追記 2012/05/16
しまったぜ。このままだとMainWindowがコンテンツに応じて伸びない場合があるんだぜ。
なので、修正。失礼しますた。
javascript
//document.getElementById(id[i]).style.height = maxHeight + "px"; document.getElementById(id[i]).style.minHeight = maxHeight + "px";
コメントを残す