Home » Program » div タグを使ったカラムの高さを揃えるスクリプト (Tag: )

Drive Network のホームページ では、CSS のみで何とか対応しましたが、まだ意図する 100% の動作ではありません。(そもそも入れ子が複雑)

とあるサービス向けにまた同様の動作を実現させたく、色々探しました。CSS3 の display: box; はあまりいい感じがしない (webkit や mozilla 向けと結局すべて個別設定が必要な点が美しくない) ので、行きついたところが jQuery のプラグインでの処理でした。

jquery.flatheights.js を始め、複数のプラグインを試しましたが、

  • padding を無視しているのか、余計な余白がついて高さが揃う
  • プラグイン側のお仕着せのクラス名や ID のセレクタが必要なタイプは汎用性に欠けるので却下

した結果、一番まともな動作で軽量だった heightLine.js を参考にしつつカスタマイズしました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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 側は

1
2
3
4
5
6
7
8
9
<div id="main">
  <div id="menu">
 
  </div>
 
  <div id="content">
 
  </div>
</div>

の様な場合、

  • menu, content の高さが Web ブラウザの縦幅に追随して広がりつつ揃う
  • 一度広げた高さは Web ブラウザの縦幅を縮めても縮小せずスクロールバーが表示

します。Web アプリケーション向けの動作を前提としていますが、静的な Web ページでも十分に使用に耐えるでしょう。

Random Select

神田カレーグランプリ 2013 (2)
欧風カレー ボンディ (神保町本店) を後にし、東京名物神田古本まつり 開催の一部でもある神田すずらん通り商店街をゆったり散歩しつつ 神田カレーグランプリ の開催場所まで移動しました。まるで神田カレー
三鷹の森ジブリ美術館 (4)
三鷹の森ジブリ美術館 は 10 年程前に一度訪れていますが、今回連休中に再び訪れる機会がありました。まずは JR 三鷹駅まで電車の旅で、南口に降りるとコミュニティバスがあると聞いていました。てっきり無
日替り定食 (沖縄ちゃんぽん)
2014/05/29, 2014/06/05 と 2 週に渡って カミングアウトバラエティ 秘密のケンミン SHOW で沖縄特集が組まれていました。普段テレビは見ないどころか自宅にテレビがないので、こ
ハンバーグ
沖縄出張 (No. 11 ? 波布食堂) 程の量ではないけど、もう少し手前 (浦添寄り) であれば 軽食の店 ルビー より きょんたろう食堂 ですよ。という話を前回の出張 2013/01 で聞いていま
ARROWS X F-10D
ARROWS X F-10D (No. 3) の続きです。電源が入らなくなりました使い始めて 8 ヶ月程で数回腰程の高さから落としてしまったことがあります。リアカバー (裏フタ) までパカッと開いてお
Drive Network Philosophy
現在の Drive Network のスタイルに リニューアル 後、SSL 証明書の提供の改善を手掛けました。提供の改善とは、Drive Network でのサービス提供の姿勢ではなく、それまでレンタ
カベール岬 (5)
久高島 (No. 1 – 安座真港 〜 到着) の続きです。久高港に降りるとすぐ坂道があり、待合所やパーラー風な建物が見えます。自転車のレンタルにみな群がるので少し待ちそうだなと思った時、
玄米 (3)
長谷園 eco かまど (三合炊き – 玄米二合 ふたたび) の続きです。1, 2 回目は、火加減・水加減の違いのためか、会心の出来とは言えませんでした。長谷園 eco かまど (三合炊き
ミニストップ メニュー
ミニストップ (ベルギーチョコレートパフェ) でベルギーチョコフェアが終わった後、2 週間程して再び訪れてみました。この日も神田錦町 1 丁目店にただベルギーチョコレートパフェを目指したのですが、おぉ
瀬底ビーチ (4)
瀬底島 (No. 1 – 172 号線散策) の続きです。前日程の雨ではありませんが小雨がパラつくこともあるこの日に、折角ですから瀬底ビーチをのぞいてみることにしました。悪天候のため営業は
Valid HTML5 Valid CSS3 Another HTML Lint