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

マックチャオ
マクドナルド 懐かしのメニュー (フレッシュマック) の続きです。価格は単品で 700 円 ?発売時期は 1991 年 12 月頃 ?チャーハンは共通でマックチャオ / エビチャオとおかずが選べるスク
FreeBSD Logo
Migrate to FreeBSD 9.1-RELEASE (PostgreSQL) に続いて JDK 1.6 を移行する機会がありました。現在用いている /usr/ports/ は、環境移行を優先
ミニストップ メニュー
ミニストップ (おかずセレクト No. 2) の 3 月頃は、すでに ミニストップ (ベルギーチョコソフト) も終わっていちご系のソフトだった気がします。出張も多く遠ざかっていましたが、ふとデータセン
vSphere Client 5.5 Install (2)
最近 VirtualBox のゲスト OS やノート PC の買い替えに伴い、Windows 8.1 Pro を試し始めています。Vista -> 7 への移行以上に大きく戸惑っていますが、これ
東急ハンズ 宜野湾コンベンションシティ店
沖縄で多店舗展開しているサンエーの新店が 宜野湾コンベンションシティ で、7/5 にオープンします。# "サンエーはイトーヨーカドーみたいな感じ" と言うと、ないちゃーは大抵理解し
立山連峰 (4)
富山出張 (No. 4 ? スターバックス コーヒー 富山環水公園店) の続きです。出張 2 日目は移動日として東京に帰りました。初日に富山空港の外に出た瞬間に気が付きましたが、正面一帯に立山連峰が見
ESXi 5.1 Install - NG (PCPU no heartbeat)
VMware ESXi 5.1 Install (Boot failed) でも思わぬエラーに出くわしましたが、さらにまたパープルな画面が出現しました。インストールが完了し、シャットダウン完了前の上記
高速船ニューくだか (5)
沖縄本島 (No. 15 – 天神矢 ふたたび) の続きです。4 年程前に初めて久高島を訪れた際の景色は 景色 (久高島) で掲載しましたが、この時は慌てて飛び乗るくらいにギリギリで最後の
ピザ (中)
沖縄出張 (No. 29 – 伊江島 -> NG) で瀬底島から伊江島を眺めた後、少し早いかと思いつつ ピザ喫茶 花人逢 に移動しました。11:00 オープンと勘違いしていて 10:
琉球泡盛 与那国 100 ml 3 本セット (3)
沖縄の友達から差し入れをいただきました。与那国島好きな私のことを知ってのプレゼント、にふぇーでーびる♪生まれて初めてのひとり旅で、初めて与那国島を訪れて早 2 年弱経ちました。今でもたまに シリーズ
Valid HTML5 Valid CSS3 Another HTML Lint