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

松屋銀座 2013/03
有楽町から銀座に向けて移動中に、松屋銀座 の外観が気になることがあります。常時ではありませんが、現在の白くて落ち着く外観に突如広告の様なイメージがポップアップされているのです。これは偶然昨年夏に見掛け
銀座わしたショップ 2014/06/13 (8)
銀座わしたショップ 2014/06/13 (三線自動演奏機) の続きです。1F は食料品を含めた物販がメインなので、改めて眺めてみることにしました。1F の入口左手側は冷蔵食品が並んでいて、最近興味が
三鷹の森ジブリ美術館 (4)
三鷹の森ジブリ美術館 は 10 年程前に一度訪れていますが、今回連休中に再び訪れる機会がありました。まずは JR 三鷹駅まで電車の旅で、南口に降りるとコミュニティバスがあると聞いていました。てっきり無
偽アカウント (例)
ここ最近 Facebook で知らない女性から何件か申請 (友達リクエスト) がありました。もちろんまるで知りません。過去にも何度かありましたが、ここ最近申請があるケースの特徴は、Facebook に
ミニストップ メニュー
コンビニエンスストアのミニストップは、昔から店内でフードメニューが食べられたりデザートもあって、ハンバーガー業界で例えるとモスバーガーの様な独自路線を行くコンビニだと感じていました。今まで自分の生活圏
FreeBSD Logo
現在 専有レンタルサーバ ビジネスプレミアム で主に使用している radserv XG1+ の BIOS, RAID BIOS のバージョンアップの検証中に dd コマンドによる書き込み結果も測定しま
かつ丼 (1)
日本一美味しいサバの塩焼き でも書きましたが、銀座にサテライトオフィスを設けてそちらに勤務していたことがありました。5 – 6 年程前になります。その際に開拓したリーズナブルなお店の 1
タコス (2)
沖縄本島 (No. 43 – ステーキハウス四季) の続きです。到着初日のランチは、元々初体験 2 連続のハシゴランチを計画していました。2 店目は、ここも以前から気になっていたタコス専門
猫丸庵カレー (1)
沖縄本島 (No. 53 – 猫丸庵 Part 2) の続きです。猫たちとたわむれながら静かに待っていると、ついに出て来ました。私が辛いカレーを良く食べていることを知ってか、スパイスも付け
伊江島 (6)
沖縄本島 (No. 4 – 瀬底大橋) の続きです。出発して 15 分弱で肉眼でもはっきりと伊江島が迫ってくるのが分かります。普通に写真を撮っている様に見えるかもしれませんが、風がものすご
Valid HTML5 Valid CSS3 Another HTML Lint