jQueryで高さの調整

コンテンツ量が少なく、footerが上にきてしまっている

というときjQueryを使ってきちんと下部に表示するようなスクリプトを書いてみた。

htmlはdiv#header、div#main、div#footerという構成を前提にします。

これら3つの高さがウィンドウサイズより小さかった時に、#mainの大きさを指定するっていうこと。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
jQuery(document).ready(function(){
  var winHeight = jQuery(window).height();
  var headHeight = jQuery('#header').height();
  var mainHeight = jQuery('#main').height();
  var footHeight = jQuery('#footer').height();
 
  var fullHeight=mainHeight+headHeight+footHeight;
 
  if (fullHeight <= winHeight) {
   var wrapHeight = winHeight-headHeight-footHeight;
   jQuery(function() {
    jQuery('#main').height(wrapHeight);
   });
  }
});
</script>

うむ。

どうして「$」じゃないかって?

それは、「エラーになった」からです。

コンフリクトっていうんでしょうか。

他のプラグインではいけてるっぽいんですが。

でも、まー、うまくいってるから良しとします。

1つの手段として、有効であれば・・・

Tags:

8 Responses to “jQueryで高さの調整”

  1. nao Says:

    はじめまして、これからjQueryを勉強してみたいと思っている初心者ですが、とても参考になりました。

    大変面白いです!

    ブックマークに入れました。よろしくお願いします。

  2. nagai Says:

    nao様

    ありがとうございます。

    私もまだ勉強中なのですが、

    読んでくださっている方がいらっしゃると励みになります。

    今後も、ボチボチとやっていきますので、よろしくお願いいたします!

  3. FMJP Says:

    はじめまして。jQueryをかじり始めたものですが、ちょっと気になる点を。
    .height()でのheightの取得は余白(margin/height)が含まれないので
    .outerHeight({margin: true})で取得し、spaceHeightという変数を作った後、
    wrapHeightから引いてやると、余白も考慮できて尚良いかと思われます。
    あと、if文の比較演算子は以下(<=)ではなく未満(<)で良いかと。
    一見にしかずと言うことでコードをどうぞ。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    jQuery(function(){
      var winHeight = jQuery(window).height();
      var headHeight = jQuery("#header").outerHeight({margin: true});
      var mainHeight = jQuery("#main").outerHeight({margin: true});
      var footHeight = jQuery("#footer").outerHeight({margin: true});

      var spaceHeight = mainHeight - jQuery("#main").height();
      var fullHeight = mainHeight + headHeight + footHeight;
     
      if (fullHeight < winHeight) {
        var wrapHeight = winHeight - headHeight - footHeight - spaceHeight;
        jQuery("#main").height(wrapHeight);
      }
    });
  4. nao Says:

    何事も、色々調べて実現していくのは大変だと思います。
    今後も参考にさせてください。楽しみにしています。

  5. nagai Says:

    FMJP様
    初めまして。
    お返事が遅くなってもうしわけございません。

    そうなんですね!outerHeight({margin:true})っていうんがあるんですね。
    何にもわからず、全くお恥ずかしい・・・・

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <script type="text/javascript">
    jQuery(document).ready(function(){
        var winHeight = jQuery(window).height();
        function resizeHeight(e) {
            var headHeight = jQuery('#header').outerHeight({margin:true});
            var mainHeight = jQuery('#main').outerHeight({margin:true});
            var footHeight = jQuery('#footer').outerHeight({margin:true});
           
            var spaceHeight = mainHeight – jQuery('#main').height();
            var fullHeight=mainHeight+headHeight+footHeight;
            if (fullHeight < winHeight) {
                var wrapHeight = winHeight-headHeight-footHeight-spaceHeight;
                jQuery(function() {
                    jQuery('#page').height(wrapHeight);
                });
            }
        }
    jQuery(window).bind("load",resizeHeight);
    jQuery(window).bind("resize",resizeHeight);
    });
    </script>

    ってな具合が本来はいいんでしょうかね??

    ああ、私も、もっとプログラム脳が欲しいです。
    勉強になります!

  6. FMJP Says:

    ダブルクオテーションと小なりがエスケープされちゃいましたね。
    それはいいとして、余白を考慮しなくて良いなら.height()でいいんですが、
    #header等にpaddingやmarginが1px以上設定されているとその分fullHeightの値が小さくなり、
    結果wrapHeightが無駄に大きくなってしまう(きっちりハマらない)、というわけです。

    比較演算子のところは、未満(<)でなければ処理を行う必要がないので、
    以下(<=)では無駄な処理を行わせてしまうことになります。

    あと、jQuery(function(){}はjQuery(document).ready(function(){}の省略形です。
    jQuery('#main').height(wrapHeight);を囲っている部分は不要かと。

    最後に、.bind()でresizeHeight関数を呼び出した時
    var winHeight = jQuery(window).height();が外にあるので、
    正しく動作しないと思いますよ。最大化した場合にwinHeightが更新されないため。
    逆の場合はelse{jQuery('#main').height('auto');}を追加すればOKです。

  7. nagai Says:

    FMJP様
    たびたび、ありがとうございます。
    >var winHeight = jQuery(window).height();が外にあるので、
    確かに、そうですね!外にある・・・リサイズしても、結局最初にロードした時の高さ、ってことですよね??

    しっかりやらんといけんです・・・

    感謝です。

    >ダブルクオテーションと小なりがエスケープされちゃいましたね。
    これは、私が見やすくしようと思ってコードビュー的なものにしたのが原因です。
    ごめんなさい。

  8. FMJP Says:

    >リサイズしても、結局最初にロードした時の高さ
    その通りです。

    コメント6
    >逆の場合はelse{jQuery(‘#main’).height(‘auto’);}を追加すればOKです。
    これについて、IEはフリーズし、Operaでは思った動作をしません。
    そんなわけで、この一文は撤回します。

    この記事でjQueryを勉強する機会ができましたから、
    こちらこそ感謝します。現在、自サイトを構築中なので完成したらお知らせします。
    また交流しましょう。

Leave a Reply