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

Facebook, WordPress Logo
twitter や facebook のいいね ! ボタンを埋め込みたい場合、それぞれから提供されるタグでそのまま Valid とされることは経験上ほぼありません。(特に Another HTML L
コントロールパネル (更新後)
今回は Windows の話ですが、Firefox を 13.0.1 の最新版に更新した後、ふと気が付くと YouTube の動画が再生出来なくなる現象に出くわしました。INTERNET Watch
Ti picchio
最近 facebook で 以前の職場 のメンバーを登録し始めました。もう 10 年以上会っていない人達がコツコツ集まってくるにつれ、"やっぱり久しぶりに会いたいよね" ということ
魚河岸フライ定食 (2014/01/14)
記事では 築地食堂 源ちゃん (海老かき揚げとお刺身定食) から 1 ヵ月空いていますが、3 日後にまた訪れています。この日は 2013 年最後の出勤日で、取引先の方がご挨拶に来た後、ランチに同行いた
丸焼きチキン (2)
久高島 (No. 6 – ふたたび) の続きです。以前から 沖縄県産やんばる若鶏の丸焼き専門店ブエノチキン浦添 を試してみたいと思いつつも機会がなく、去年予約まで入れたものの 沖縄本島 (
玉取崎展望台 (5)
石垣島 (No. 3 – こてっぺん) の続きです。翌日 05/05 は終日島内の目星を付けた個所をひたすら周遊する日に当てていました。ホテルでの朝食後、まずは玉取崎展望台へ向けて移動を開
東崎展望台 (2)
与那国島 (No. 11 – 海底遺跡) の続きです。朝食は滞在している 旅の館 阿檀 でいただいています。その際 "昨日はどこを周りましたか ?" という話になり、西
千年の響き 43 度 (1)
沖縄滞在中以外は普段あまり泡盛を飲むことはありませんが、昨年いただいた 千年の響き は特にもう一度飲んでみたい泡盛のうちの 1 つです。少なくとも私は居酒屋では見かけたことはありませんでした。右上の
FreeBSD Logo
Migrate to FreeBSD 9.1-RELEASE (JDK 1.6) に続いて idnconv (idnkit) を移行しました。idnconv は国際化ドメイン名のエンコード・デコードを
BACAR OKINAWA (1)
昨年のゴールデンウィークは シリーズ (石垣島) の通り石垣島・黒島を堪能しましたが、今年は本島でのんびりすることにしました。沖縄出張 (No. 30 ? 花人逢) で自分にはかなり好みのピザに出会っ
Valid HTML5 Valid CSS3 Another HTML Lint