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

すだちおろし冷かけ
うどん 丸香 (まるか) に続いてオフィス近辺に最近目に付く 丸亀製麺 に挑戦しました。JR 御茶ノ水駅そばのお茶の水ビルディング地下でも見掛けたことがあるので、有名なのかなと後で調べれば、全国展開ど
ノルウェー産 サーモンフライ (2)
My Select "日本一シリーズ" 第 6 弾は再び御茶ノ水の老舗、日本一美味しい豚の生姜焼き 同様 20 年来通い続けている キッチン カロリー です。改めて店の看板を見ると
豆腐そば (2)
まだ初めて沖縄出張で訪れた当初に一度連れて行ってもらったことがある、これも地元では有名な 高江洲そば ですが、前々回の出張時までの 6 年近くは好んで訪れませんでした。まだ沖縄そば自体に慣れていない時
ロマンスロード (3)
久高島 (No. 2 – カベール岬) の続きです。カベール岬から南下すると、小さな看板が見えて来ました。"ロマンスロード" の下に書いてある Romansu Road
魚介カレー (2)
2013/11 に 欧風カレー ボンディ (神保町本店) を訪れてからはしばらく過酷な日々が続いたので足が遠のいていました。年末最終営業日にも訪れましたが、その際はいつもながらのチキンカレーで、食べた
クリーミー生サーバー (11)
うまい ! がすごい。クリーミー生サーバー (Part 3) の続きです。まずはオーソドックスに、ザ・プレミアム・モルツ 350ml 缶を用意しました。飲み口を開けて本体向かって右側に向け、配管チュー
らーめん 並 (きゃべつ) + トッピング (ほうれん草増) + ぎょうざ
横浜らーめん武蔵家 (きゃべつ + もやし) の続きです。写真は 12/08 の自宅近所の東綾瀬公園 (景色 (東綾瀬公園)) です。12 月に入ってもまだ銀杏の紅葉が多く見られますが、この後 4 日
玉友 甕仕込 13 年古酒 (2)
沖縄本島 (No. 6 – 打ち上げ) でお世話になったメンバー宅で、前日に誕生日プレゼントをいただいていました。この後には別のメンバーから 松藤 限定古酒 43 度 もプレゼントしていた
飲み比べ ビアぐらすセット
年末年始の休暇に、ようやく先日いただいた贈り物をゆっくり試すことが出来ました。ビール好きと知っての心遣いだと思いますが、想い起こせば 20 代前半はビールはほぼ飲みませんでした。ダイニングバーでカクテ
京の抹茶パフェ (2)
沖縄本島 (No. 17 – 宮良そば ふたたび) の続きです。mati-cafe (季節の京のお昼ごはん) で初めて訪れた 2011/12 以来 2 年半程経って久しぶりに訪れる機会が出
Valid HTML5 Valid CSS3 Another HTML Lint