Home » Program » div タグを使ったカラムの高さを揃えるスクリプト (Tag: )

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 ページでも十分に使用に耐えるでしょう。

Random Select

2013 年産ダイヤモンド麦芽の恵み 初仕込 (4)
うまい ! がすごい。クリーミー生サーバー (Part 2) の "絶対もらえるキャンペーン" が終わると、シリアルナンバーの登録画面がすぐに次のキャンペーンの告知に切り替わりまし
FreeBSD Logo
FreeBSD Brute Force Attack Counter Tool (No. 1) の続きです。ハッシュリファレンスを多用しています。理解している前提で書いているので予めご了承ください。処
トロピカルビーチ (4)
沖縄出張時の最近の定宿 ホテル ノア からは徒歩 10 分程度の距離ですので、土曜日に トロピカルビーチ にふらっと散歩に行きました。実はこのビーチには一度来たことがあります。初めての沖縄出張は確か
クリーミー生サーバー (6)
うまい ! がすごい。クリーミー生サーバー (Part 2) の続きです。正確には覚えていませんが、キャンペーン終了翌日の 2013/08/26 から 1 ヶ月程経過してようやく届きました。中々の大ぶ
真壁ちなー (4)
2012/11 の末にプライベートで沖縄を訪れた際、久しぶりに南部でゆったりした時間を取ることが出来たので、茶処 真壁ちなー を訪れたことがあります。南部ではかなり有名なお食事処の様です。糸満に近付く
五目焼きそば 大盛 (2)
とちぎや (五目焼きそば) の後はついに麺類に手を出そうかと思いつつも、久しぶりの五目焼きそばがうれしかったので今度は大盛にしてみようか迷いつつ再び訪れると、今日のサービス定食 "蒸し豚の特
日替そば (ニラカナそば + 定食)
うちなぁ料理と古酒家 ニライカナイ (ソーキそば定食) でメニューが多少変わっていたので、日を空けずに訪れました。実は 1 週間程前にも訪れましたが、その際はおかわり無料のじゅうしぃが切れて白ご飯だけ
JTA961
かねてから最も行きたい沖縄の離島が与那国島でした。"Dr. コトー診療所" とそのロケ地巡りや海底遺跡がその最たる理由で、共感出来る人が出て来ても必ずしも同行出来るとも限らないしと
41B0208 (1)
Drive Network Rack Gallery 2012 (Part 3) から約 6 ヶ月程経過しましたが、12 月は大きな変更がありました。共有サーバ ビジネスセレクトでは、お客様のデータ領
株式会社エーティーワークス 富山本社
Drive Network ではすでに以下の記事でもご紹介している通り、株式会社エーティーワークス の radserv シリーズを大量投入しています。2012/04/19 Drive Network
Valid HTML5 Valid CSS3 Another HTML Lint