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

ビーフカレー・チキンカレー・魚介ミックスカレー
先日 11/02 – 11/04 の連休に沖縄の友達が東京旅行に来ていて、11/03 は案内も兼ねて同行させてくれました。普段は沖縄で会っていますが、私にとっては慣れ過ぎた JR 御茶ノ水
豚骨醤油 青ネギラーメン (1)
先日、愛知の友達の投稿でネギ入れ放題のラーメンを見てスイッチが入ってしまい、オフィス周辺で調べてはみたものの、調べた限りはカレーとラーメンの聖地 "神保町" でも見当たりません。小
青い空と海のビール (1)
夏季限定醸造生ビール 夏いちばん や アサヒオリオン 沖縄だより を試していた頃、コンビニエンスストアで 青い空と海のビール « ヘリオス酒造株式会社 を見かける様になりました。Weize
radserv ope 25
今回はメモリが 4GB (2GB x 2) で納品された機器 radserv XG1+ (Q9000) を、8GB (4GB x 2) に構成変更しました。本体背面の銀色のネジ 2 本を外し、本体上の
絆道 (2)
2014/04 頃から facebook 沖縄ユーザーグループ に自ら投稿する様になり、翌 5 月中旬にはとても気の合う友達が出来ました。非公開のグループを作成して沖縄に関すること以外でも語り合う中で
遠隔地バックアップ開始のお知らせ
2012/08/01 より Drive Network では従来の東京データセンター内でのバックアップに加え、富山データセンターにさらにバックアップする運用を開始しました。Drive Network
しょうぶ沼公園 (2)
8 ヶ月ぶりの沖縄旅行の翌週は、自宅近所の しょうぶ沼公園 を散策しました。ちょうど しょうぶまつり が開催されていた時期で、今までも開催自体は知っていましたが訪れたことはありませんでした。お祭り広場
2014 イチハナリアートプロジェクト (2)
沖縄本島 (No. 32 – アラハビーチ 〜 海中道路) の続きです。今回の沖縄入り前に、すでに 2014 イチハナリアートプロジェクト を訪れた人の記事や投稿を、来年タイミングが合えば
WS-C2960S-48TS-L (1)
Cisco Catalyst 2960S Command (crypto key generate rsa) では、SSH を有効にする際に対話式で進みました。非対話モードで実行する場合は modul
豚骨野菜 辛味噌ラーメン + まかない丼
哲麺 (豚骨野菜ラーメン 醤油) からほぼ 2 ヶ月ぶりに訪れました。普段から 50 円で替玉食べ放題のため、毎回 3 玉は替玉しますが開店 4 周年記念で今月は無料で食べ放題だそうです。無料であれば
Valid HTML5 Valid CSS3 Another HTML Lint