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

クリスマスツリー 2012
銀座・有楽町は最低でも 1 ヶ月に 2, 3 回は訪れるスポットです。クリスマス付近になると恒例の 「ミキモト ジャンボクリスマスツリー」点灯中です。カメラも解像度もまちまちなので統一感がありませんが
ベリサイン セキュア・サーバ ID 月額提供開始
2012/11/01 より Drive Network では従来よりお取扱いしていた SSL 証明書 "セキュア・サーバ ID" を月額費用 5,250 円のみでご利用いただけるサ
ワイルドハンバーグ 300g (1)
いきなり ! ステーキ (ワイルドステーキ 300g) でデビューした いきなり ! ステーキ で、今度はランチメニューのワイルドハンバーグを試すべく再び小川町店を訪れましたが、まだ 13 時過ぎで何
新開発 ! 超クリーミー泡サーバー (1)
2013 年産ダイヤモンド麦芽の恵み 初仕込 ザ・プレミアム・モルツ (Part 2) の "絶対もらえるキャンペーン" 終了後のキャンペーンはまるで興味が持てなかったので、しばら
対応後
調査した結果では Windows 7 に限らない様ですが、何のきっかけかは特定していませんが突然 flv ファイルのサムネイル表示 (縮小版表示) が RealPlayer のアイコンに代わってされな
iPhone 6 Plus (Gold)
iPhone 6 Plus (プロセス強制終了) の続きです。iPhone 6 Plus で受信確認が出来たドコモメールで、まずは会社用の私のメールアドレスに送信してみました。Subject: tes
牛カルビ丼 大盛 (1)
吉野家 (ロース豚丼 十勝仕立て) で数回豚丼を試しつつも、同じくらいに気になる 牛カルビ丼 もコツコツ試しました。最寄駅そばの吉野家はあまり見かけない先会計タイプで、会計・商品受け渡し・下げ台が 1
つけ麺 大盛 + チャーシュー 2 倍
出張の少し前に Facebook で 麺処 鍵 〜KAGI〜 に数人で同時にチェックインしているのを見て知りました。チェックインするとトッピングが 1 品無料になるとか。それはともかく、てだこ RAM
BACAR OKINAWA (1)
昨年のゴールデンウィークは シリーズ (石垣島) の通り石垣島・黒島を堪能しましたが、今年は本島でのんびりすることにしました。沖縄出張 (No. 30 ? 花人逢) で自分にはかなり好みのピザに出会っ
カベール岬 (5)
久高島 (No. 1 – 安座真港 〜 到着) の続きです。久高港に降りるとすぐ坂道があり、待合所やパーラー風な建物が見えます。自転車のレンタルにみな群がるので少し待ちそうだなと思った時、
Valid HTML5 Valid CSS3 Another HTML Lint