技術ブログ
2021年12月14日
[jQuery]
jQueryで高さの取得が安定しないときに確認する項目
jQueryで高さを取得しようとしたら、どうもへんな隙間が空いてしまう。
リロードするたびに取得する高さの値が異なる、といったときに確認してほしいポイントのご紹介です。
結論から言うと・・・原因は画像です。
例えばサイトに固定ヘッダを用意して、コンテンツは固定ヘッダ分高さを開けたい。なんてことありますよね。
高さ固定だったらCSSで指定すればよいですが、レスポンシブ全盛の昨今、PCとスマホで高さが異なるなんて日常茶飯事です。
高さを取得するのにjQueryでheight、innerHeight、outerHeightなどのメソッドを使います。
var hoge = $('header').height(); //コンテンツの高さを取得
var hoge = $('header').innerHeight(); //paddingを含めた高さ
var hoge = $('header').outerHeight(); //borderを含めた高さ
高さの取得方法は本筋ではないので今回は端折りますが、
$(function() {
$('#wrapper').css('top', $('header').innerHeight());
});
今回ひっかかったのがこんな感じのコードでして、#wrapperのtopプロパティをheaderの高さに合わせる、という内容になります。
これを実行したところ、何回リロードしても意味不明な高さが取得され、この値どこから取得してるんだ???という状態になりました。
実はこれは、headerの中にある画像が原因でした。
どの時点で表示するか
jQueryで読み込み完了後に実行する方法として、大きく分けて以下のパターンがあります。
$(function() {〜});
$(window).on('load', function() {〜});
2つの違いは、DOMが読み込まれた直後に実行するか、ブラウザに表示された直後に実行するか、の違いになります。
私はうろ覚えで$(function() {〜});は画像も読み込まれた後に実行と記憶していたのですが、実際はloadでないと高さ等は取得できないようです。
どうも高さの値がおかしい、という場合はチェックしてみてください。
※ $(window).load(function () { 〜 }); という書き方は非推奨。ver3.0以降では存在すらしないとのこと。
※ $(document).ready(function(){ 〜 }); という書き方は $(function() {〜}); と同じ意味。
最終的にきちんと取得できるようになった書き方は以下の通り。
$(window).on('load', function() {
$('#wrapper').css('top', $('header').innerHeight());
});
参考:
この記事を書いた人
おおつき@TTI
Webディレクター、Webコンサルタント、Webコーダー、日曜プログラマー、他色々やってます。
気になったら
まずはご相談を
あなたの悩みのために専門家がチームを組み、課題解決に取り組みます。
まずはお気軽にお問い合わせください。
日本全国どこでも対応します。