Drive Network のホームページ では、CSS のみで何とか対応しましたが、まだ意図する 100% の動作ではありません。(そもそも入れ子が複雑)
とあるサービス向けにまた同様の動作を実現させたく、色々探しました。CSS3 の display: box; はあまりいい感じがしない (webkit や mozilla 向けと結局すべて個別設定が必要な点が美しくない) ので、行きついたところが jQuery のプラグインでの処理でした。
jquery.flatheights.js を始め、複数のプラグインを試しましたが、
- padding を無視しているのか、余計な余白がついて高さが揃う
- プラグイン側のお仕着せのクラス名や ID のセレクタが必要なタイプは汎用性に欠けるので却下
した結果、一番まともな動作で軽量だった heightLine.js を参考にしつつカスタマイズしました。
function ChangeHeight(tag, id) { var obj0 = document.getElementsByTagName ? document.getElementsByTagName(tag) : document.all.tags(tag); var obj = []; for (var i = 0; i < obj0.length; i++) { if (obj0[i].id == id) { obj.push(obj0[i]); break; } } ChangeBox = function() { for (var i = 0; i < obj.length; i++) { var max = 0; var cn = obj[i].childNodes; for (var h = 0; h < cn.length; h++) { if (cn[h] && cn[h].nodeType == 1) { cn[h].style.height = 'auto'; max = (max > cn[h].offsetHeight) ? max : cn[h].offsetHeight; } } for (var h = 0; h < cn.length; h++) { if (cn[h].style) { var style = cn[h].currentStyle || document.defaultView.getComputedStyle(cn[h], ''); var height = max; if (style.paddingTop) { height -= style.paddingTop.replace('px', ''); } if (style.paddingBottom) { height -= style.paddingBottom.replace('px', ''); } if (style.borderTopWidth && style.borderTopWidth != 'medium') { height -= style.borderTopWidth.replace('px', ''); } if (style.borderBottomWidth && style.borderBottomWidth != 'medium') { height -= style.borderBottomWidth.replace('px', ''); } cn[h].style.height = height + 'px'; } } } } ChangeBox(); window.onresize = ChangeBox; }
呼び出す時は例えば ChangeHeight(‘div’, ‘main’); とします。HTML 側は
<div id="main"> <div id="menu"> </div> <div id="content"> </div> </div>
の様な場合、
- menu, content の高さが Web ブラウザの縦幅に追随して広がりつつ揃う
- 一度広げた高さは Web ブラウザの縦幅を縮めても縮小せずスクロールバーが表示
します。Web アプリケーション向けの動作を前提としていますが、静的な Web ページでも十分に使用に耐えるでしょう。