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

らーめん 並 (きゃべつ) + トッピング (ほうれん草増) + ぎょうざ
横浜らーめん武蔵家 (きゃべつ + もやし) の続きです。写真は 12/08 の自宅近所の東綾瀬公園 (景色 (東綾瀬公園)) です。12 月に入ってもまだ銀杏の紅葉が多く見られますが、この後 4 日
Dr. コトー診療所 (自転車)
与那国島 (No. 7 – Dr. コトー診療所 Part 1) の続きです。まずは事務室の中から。おぉ。。和田さんがカメラの手入れをしていそうです。そして病室。ドラマでは窓から外が映る際
つけ麺 (中)
有楽町・銀座には私用で月に 2, 3 回は訪れていますが、タイミングが合えば 三田製麺所 有楽町店に行くことがあります。濃厚豚骨魚介スープをうたうお店は最近はめずらしくありませんが、ここのスープは本当
あぐーハンバーグセット 220g
瀬底島 (No. 3 – アンチ浜ビーチ 〜 瀬底ビーチ) の続きです。瀬底島を堪能した後は、ハンバーグとパンケーキのお店うるり に猫まっしぐらに向かいました。元々予定に組み込んでいて絶対
My Select (2013/07/14)
Season 1 (2012/10/04 – 2012/10/20) 同様、今回も本筋の業務前に別件が続いてやや長めの出張です。07/11 – 07/15 までは久しぶりに以前
VAIO Fit 13A (背面)
hp dv5 has broken again and again で 5 年 3 ヶ月程愛用してきた hp dv5 の 5 回目の故障を機に、新たにノート PC を購入することにしました。初めてノー
与那国空港 (5)
与那国島 (No. 14 – ビヤガーデン国境) の続きです。明けて 10/08 です。生まれて初めてのひとり旅も、後は帰るだけとなりました。小さな島とは言え、何回か来ないと分からないこと
JTA961
かねてから最も行きたい沖縄の離島が与那国島でした。"Dr. コトー診療所" とそのロケ地巡りや海底遺跡がその最たる理由で、共感出来る人が出て来ても必ずしも同行出来るとも限らないしと
しゃぶしゃぶ温野菜 (6)
3 月に入り暖かく感じる日も出始めて来たため、寒いうちに訪れたいと思っていた しゃぶしゃぶ温野菜 に久しぶりに行く機会が持てました。土曜日の 19:00 頃から開始したかったので、事前に予約しておきま
2013 年産ダイヤモンド麦芽の恵み 初仕込 (4)
うまい ! がすごい。クリーミー生サーバー (Part 2) の "絶対もらえるキャンペーン" が終わると、シリアルナンバーの登録画面がすぐに次のキャンペーンの告知に切り替わりまし
Valid HTML5 Valid CSS3 Another HTML Lint