15

目標:

address barmin-body のサイズを動的に変更してコンテンツを押し上げることができるように、デバイスの最大ビューポートの高さを見つけます。これには、のスペースが含まれます。

問題:

モバイル ブラウザーは、向きの状態を異なる方法で処理し、向きの変更時に異なる方法で DOM プロパティを更新します。

JavaScript を使用してブラウザーで Android フォンの回転を検出する

Android フォンの場合、screen.widthまたはscreen.heightデバイスの回転に合わせて更新することもできます。

|==============================================================================|
|     Device     | Events Fired      | orientation | innerWidth | screen.width |
|==============================================================================|
| iPad 2         | resize            | 0           | 1024       | 768          |
| (to landscape) | orientationchange | 90          | 1024       | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPad 2         | resize            | 90          | 768        | 768          |
| (to portrait)  | orientationchange | 0           | 768        | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 0           | 480        | 320          |
| (to landscape) | orientationchange | 90          | 480        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 90          | 320        | 320          |
| (to portrait)  | orientationchange | 0           | 320        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 90          | 320        | 320          |
| (to landscape) | resize            | 90          | 569        | 569          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 0           | 569        | 569          |
| (to portrait)  | resize            | 0           | 320        | 320          |

このため、デバイスの最大高さを返す単一の関数を使用してデバイスの最大高さを返すことは、デバイスの範囲で決して一定ではないことは明らかです。

私が発見したその他の問題により、これら 2 つの機能がうまく動作しません。

  • window.devicePixelRatioで除算すると、このプロパティは一貫性のない高さを返す場合がありwindow.outerHeightます。
  • 向きの変更後に DOM 要素に更新の機会を与えるには、遅延window.setTimeout(function() {}, time)を使用する必要があります。
  • window.outerHeightiOS デバイスの向きの変更では更新されません。フォールバックとして使用screen.availHeightすると、下部のナビゲーション バーが全体の高さとして含まれます。
  • #header, #content,#footer構造体を使用すると、 が動的に更新されたときに#content{min-height}を押し下げるためにを動的に再計算する必要があります。#footerbody

解決策:

まず、DIV 構造を見てみましょう。

<style>
#header,#content,#footer{width:100%;}
</style>

<body>
<div id="header"></div>
<div id="content"></div>
<div id="footer"></div>
</body>

デバイスが独自にスケーリングするのを防ぎたい:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />

ビューポートの最大高さを返し、iOS のアドレス バーを非表示にする機能を持たせるには、助けが必要です。

<script src="iOS.js" type="text/javascript"></script>

http://iosjs.com/

次に、デバイスが向きの変更をサポートしているかどうかを検出し、サイズ変更をフォールバックとして使用します。

var iOS = (navigator.userAgent.match(/(iPad|iPhone|iPod)/i) ? true : false);
var android = (navigator.userAgent.match(/Android/i) ? true : false);
var supportsOrientationChange = "onorientationchange" in window;
var orientationEvent = supportsOrientationChange ? "orientationchange" : "resize"; 

獣の腹:

function updateOrientation()
{
    var orientation = (window.orientation);

    if(android)
    {
        window.setTimeout(function() {
            window.scrollTo(0,0);
            var size = window.outerHeight/window.devicePixelRatio;
            $('body').css('min-height', size + 'px');
            var headerHeight = $('#header').height();
            var footerHeight = $('#footer').height();
            var contentHeight = size - (headerHeight+footerHeight);
            $('#content').css('min-height', contentHeight + 'px');
            window.scrollTo(0,1);
        }, 200);
    }

    if(iOS)
    {
        window.setTimeout(function(){
            window.scrollTo(0,0);
            var size = iOS_getViewportSize();
            var headerHeight = $('#header').height();
            var footerHeight = $('#footer').height();
            var contentHeight = size.height - (headerHeight+footerHeight);
            $('#content').css('min-height', contentHeight + 'px');
            window.scrollTo(0,1);
        }, 0);
    }
}

ページの読み込みと向きのイベントのイベント リスナーを追加します。

if(iOS)
{
    iOS_addEventListener(window, "load", iOS_handleWindowLoad);
    iOS_addEventListener(window, "orientationchange", iOS_handleOrientationChange);
    iOS_addEventListener(window, "resize", iOS_handleReize);
}
addEventListener("load", function() 
{
    updateOrientation();
}, false);
addEventListener(orientationEvent, function() {
    updateOrientation();
}, false);

証拠はプリンにあります:

iPhone 4 & 4s ポートレート & ランドスケープ

iPhone 4 & 4s ポートレート iPhone 4 & 4s 横向き


Android ポートレート & ランドスケープ

Android のポートレート Android ランドスケープ


ここでの目標は、このソリューションを縮小または改善することです。

4

3 に答える 3

1

これは、読み込み時とウィンドウのサイズ変更時にブラウザの幅と高さをドキュメント本文に追加する簡単なソリューションです。

jQuery.event.add(window, "load", resize);
jQuery.event.add(window, "resize", resize);

  function resize() 
    {
      var h = jQuery(window).height();
      var w = jQuery(window).width();
      jQuery("body").css({"width": w, "height": h});
    }
于 2013-09-04T08:51:57.177 に答える
0

向きの変化を単独で監視する自己呼び出しクロージャーを試すことができます。このようなもの:

(function () {

    var CurrentHeight;

    (function CheckForOrientationChange() {

        //var NewHeight = window.screen.availHeight / window.devicePixelRatio;
        //var NewHeight = $(window).height();    

        var NewHeight = $('#WidthCheck').width();

        if (CurrentHeight && CurrentHeight!== NewHeight ) {

            alert(NewHeight); // change here
        }

        CurrentHeight = NewHeight;

        setTimeout(CheckForOrientationChange, 1000);

    })();

})();

これをドキュメント準備機能にドロップするだけです。今のところ、毎秒チェックしていますが、その間隔を短くすることができます。jsfiddle はここにあり、ブラウザーのサイズを変更してモバイル ブラウザーの変更をシミュレートすることでテストできます。その後、アクションを処理するようにコードを適応させることができます。

于 2012-10-01T01:46:09.357 に答える
0

iOS シミュレーターで返される期待値。現時点では Android をテストできません。

var supportsOrientationChange = "onorientationchange" in window;
var orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";

window.onload = updateOrientation();

window.addEventListener(orientationEvent, function() {
    updateOrientation();
}, false);

function updateOrientation(){
    switch(window.orientation){
    case 0:
    alert(window.outerHeight); // Returns '356' with browser chrome
    break;

    case -90:
    alert('Landscape right');
    break;

    case 90:
    alert(window.outerHeight); // Returns '208' w browser chrome
    break;

    case 180:
    //alert('Portrait view - upside down');
    break;
    }
    var orientation = (window.orientation);
}

(注: このコードはブラウザではテストされません。)

于 2012-10-04T14:11:59.337 に答える