jQueryを使用してブラウザービューポートのサイズを決定し、ページのサイズが変更された場合にこれを再検出するにはどうすればよいですか?このスペースにIFRAMEサイズを作成する必要があります(各マージンに少し入ります)。
知らない人のために、ブラウザのビューポートはドキュメント/ページのサイズではありません。スクロール前のウィンドウの表示サイズです。
jQueryを使用してブラウザービューポートのサイズを決定し、ページのサイズが変更された場合にこれを再検出するにはどうすればよいですか?このスペースにIFRAMEサイズを作成する必要があります(各マージンに少し入ります)。
知らない人のために、ブラウザのビューポートはドキュメント/ページのサイズではありません。スクロール前のウィンドウの表示サイズです。
回答:
ビューポートの幅と高さを取得するには:
var viewportWidth = $(window).width();
var viewportHeight = $(window).height();
ページのサイズ変更イベント:
$(window).resize(function() {
});
DOCTYPE
宣言が含まれていることを確認してください<!DOCTYPE html>
。
1.主な質問への回答
スクリプト$(window).height()
は適切に機能します(ビューポートの高さを表示し、スクロールする高さのドキュメントは表示しません)が、ドキュメントにdoctypeタグを正しく配置する必要があります。たとえば、次のdoctype:
HTML 5の場合:
<!DOCTYPE html>
過渡的なHTML4の場合:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
おそらく、一部のブラウザで想定されているデフォルトのdoctype $(window).height()
は、ブラウザの高さではなく、ドキュメントの高さを取ります。doctype仕様を使用すると、問題は十分に解決され、pepsは「スクロールオーバーフローを非表示にしてから元に戻す」ことを回避できると確信しています。 t将来のプログラマーの使用のためにコードにそれを文書化します。
2.補足のヒント、脇に注意してください。 さらに、スクリプトを実行している場合、プログラマーがライブラリを使用するのに役立つテストを考案できます。
$(document).ready(function(){
if(typeof $=='undefined') {
alert("PROGRAMMER'S Error: you haven't called JQuery library");
} else if (typeof $.ui=='undefined') {
alert("PROGRAMMER'S Error: you haven't installed the UI Jquery library");
}
if(document.doctype==null || screen.height < parseInt($(window).height()) ) {
alert("ERROR, check your doctype, the calculated heights are not what you might expect");
}
});
編集:パート2について、「追加のヒント、メモしてください」:昨日のコメント(2014-09-04)の@Machielは、完全に正しかった:$のチェックは、Jqueryの準備ができたイベント内に含めることはできません。彼が指摘したように、私たちは$がすでに定義されていると仮定しています。それを指摘してくれてありがとう、そしてあなたがスクリプトでそれを使用したのであれば、読者の皆さんがこれを修正してください。私の提案は次のとおりです:ライブラリに、ライブラリを初期化する「install_script()」関数を配置します(ready()の宣言を含む、このようなinit関数内に$への参照を置きます)およびそのような「install_script()」関数の始まり、$が定義されているかどうかを確認しますが、JQueryから独立しているため、ライブラリはJQueryがまだ定義されていないときに「自己診断」できます。CDNからJQueryを自動的に作成するのではなく、この方法を使用します。これらは、他のプログラマーを助けるための小さなメモです。ライブラリを作成する人々は、潜在的なプログラマーの過ちに対するフィードバックをより豊かにする必要があると思います。たとえば、Google Apisはエラーメッセージを理解するために、別のマニュアルが必要です。あなたが行ってマニュアルや仕様を検索する必要がないいくつかの小さな間違いについて外部のドキュメントが必要になるのはばかげています。ライブラリは自己文書化されている必要があります。私は、6か月後も犯す可能性のあるミスを処理してコードを記述しますが、それでもクリーンで反復性のないコードになり、既に記述された、防止する未来の開発者のミスを犯します。ライブラリを作成する人々は、潜在的なプログラマーの過ちに対するフィードバックをより豊かにする必要があると思います。たとえば、Google Apisはエラーメッセージを理解するために、別のマニュアルが必要です。あなたが行ってマニュアルや仕様を検索する必要がないいくつかの小さな間違いについて外部のドキュメントが必要になるのはばかげています。ライブラリは自己文書化されている必要があります。私は、6か月後も犯す可能性のあるミスを処理してコードを記述しますが、それでもクリーンで反復性のないコードになり、既に記述された、防止する未来の開発者のミスを犯します。ライブラリを作成する人々は、潜在的なプログラマーの過ちに対するフィードバックをより豊かにする必要があると思います。たとえば、Google Apisはエラーメッセージを理解するために、別のマニュアルが必要です。あなたが行ってマニュアルや仕様を検索する必要がないいくつかの小さな間違いについて外部のドキュメントが必要になるのはばかげています。ライブラリは自己文書化されている必要があります。私は、6か月後も犯す可能性のあるミスを処理してコードを記述しますが、それでもクリーンで反復性のないコードになり、既に記述された、防止する未来の開発者のミスを犯します。マニュアルや仕様を検索する必要があります。ライブラリは自己文書化されている必要があります。私は、6か月後も犯す可能性のあるミスを処理してコードを記述しますが、それでもクリーンで反復性のないコードになり、既に記述された、防止する未来の開発者のミスを犯します。マニュアルや仕様を検索する必要があります。ライブラリは自己文書化されている必要があります。私は、6か月後も犯す可能性のあるミスを処理してコードを記述しますが、それでもクリーンで反復性のないコードになり、既に記述された、防止する未来の開発者のミスを犯します。
$
使用して$
を呼び出した後、の可用性を確認するのは少し奇妙です$(document).ready(function() { } );
。jQueryが使用可能かどうかを確認するのは良いことですが、現時点ではまだ手遅れです。
$(window).resize()を使用して、ビューポートのサイズが変更されたかどうかを検出できます。
jQueryには、スクロールバーが存在する場合に、viewport [1]の正しい幅と高さを一貫して検出する機能はありません。
Modernizrライブラリ、具体的にはJavaScriptのメディアクエリを開くmq関数を使用するソリューションを見つけました。
これが私の解決策です:
// A function for detecting the viewport minimum width.
// You could use a similar function for minimum height if you wish.
var min_width;
if (Modernizr.mq('(min-width: 0px)')) {
// Browsers that support media queries
min_width = function (width) {
return Modernizr.mq('(min-width: ' + width + ')');
};
}
else {
// Fallback for browsers that does not support media queries
min_width = function (width) {
return $(window).width() >= width;
};
}
var resize = function() {
if (min_width('768px')) {
// Do some magic
}
};
$(window).resize(resize);
resize();
私の答えはおそらくiframeを100%ビューポートの幅に両側にマージンを付けてサイズ変更するのに役立ちませんが、ブラウザのJavaScriptビューポートの幅と高さの計算の一貫性に不満を抱いているWeb開発者に安心感を与えることを願っています。
多分これはiframeに関して役立つかもしれません:
$('iframe').css('width', '100%').wrap('<div style="margin:2em"></div>');
[1] $(window).width()および$(window).height()を使用して、一部のブラウザーでは正しく、他のブラウザーでは正しくない数値を取得できます。これらのブラウザーでは、window.innerWidthとwindow.innerHeightを使用して正しい幅と高さを取得できますが、ユーザーエージェントのスニッフィングに依存しているため、この方法はお勧めしません。
通常、ブラウザによっては、ウィンドウの幅と高さの一部としてスクロールバーが含まれているかどうかに一貫性がありません。
注:$(window).width()とwindow.innerWidthはどちらも、同じブラウザーを使用するオペレーティングシステムによって異なります。参照:https : //github.com/eddiemachado/bones/issues/468#issuecomment-23626238
function showViewPortSize(display) {
if (display) {
var height = window.innerHeight;
var width = window.innerWidth;
jQuery('body')
.prepend('<div id="viewportsize" style="z-index:9999;position:fixed;bottom:0px;left:0px;color:#fff;background:#000;padding:10px">Height: ' + height + '<br>Width: ' + width + '</div>');
jQuery(window)
.resize(function() {
height = window.innerHeight;
width = window.innerWidth;
jQuery('#viewportsize')
.html('Height: ' + height + '<br>Width: ' + width);
});
}
}
$(document)
.ready(function() {
showViewPortSize(true);
});
ロード時およびサイズ変更時のビューポートのサイズを取得するには(SimaWB応答に基づく):
function getViewport() {
var viewportWidth = $(window).width();
var viewportHeight = $(window).height();
$('#viewport').html('Viewport: '+viewportWidth+' x '+viewportHeight+' px');
}
getViewport();
$(window).resize(function() {
getViewport()
});