7

幅が 590px のモバイル ページがあります。したがって、ビューポートを次のように設定します。

<meta name = "viewport" content = "width = 590">

縦向きまたは横向きのいずれかで最初にページにアクセスすると、問題なく表示されます。ページは幅を正確に埋めます。しかし、向きを変えてもビューポートは変わりません。縦向きから横向きにすると、ビューポートは 590px よりも広くなり、その逆も同様です。

Galaxy S2でのみテスト済み

4

7 に答える 7

6

これは、私が抱えていた問題とまったく同じように聞こえます。統合された答えを見つけることができなかったので、1つをつなぎ合わせなければなりませんでした。

まず、縦向きと横向きで異なるように見える CSS は、独自の @media タグに入れる必要がありました。異なる部分だけでなく、クラス全体を各 @media セレクターに正しく配置することが重要です。両方のビューに共通の CSS を上部に配置できます。私のデバイスの幅は 580 で表示されていたので、カットオフを 600 に設定しました。

    // All CSS that is common to both

@media all and (min-device-width:601px)and (orientation:landscape){
    // All CSS for Landscape and Desktop
}
@media only screen and (max-device-width:600px)and (orientation:portrait){
    // All CSS for Portrait view
}

次にビューポートの設定です。このコードを標準として各ページ ヘッドに挿入しました (サイズは私の携帯電話の縦サイズです)。JavaScriptが後でアクセスできるように、そこにメタが必要です。

<meta name="viewport" id="viewport" content="width=480, initial-scale=0.25, maximum-scale=1.0;" />

最後に、ページが電話の回転を検出したときに、Javascript を使用してビューポート設定を書き直す必要がありました (Vinayak.B Original Articleのおかげで) 。

    //Code to display on mobiles
    //========================================

    var swidth = window.screen.width;
    //These were the values of my website CSS container for portrait and landscape
    var vpwidth = 480;
    var vlwidth = 960;

    updateOrientation();

    window.addEventListener('orientationchange', updateOrientation, false);

    function updateOrientation() {


      var viewport = document.querySelector("meta[name=viewport]");

      switch (window.orientation) {
        case 0: //portrait
          //set the viewport attributes to whatever you want!
            viewport.setAttribute('content', 'width=' + vpwidth + ', initial-scale=0.25, maximum-scale=1.0;')
          break;
        case 90: case -90: //landscape
          //set the viewport attributes to whatever you want!
            viewport.setAttribute('content', 'width=' + vlwidth + ', initial-scale=0.25, maximum-scale=1.0;')
          break;
        default:
          //set the viewport attributes to whatever you want!
            viewport.setAttribute('content', 'width=' + vpwidth + ', initial-scale=0.25, maximum-scale=1.0;')
          break;
      }
        //alert(swidth + ' lead to an initial width of ' + vpwidth + ' and a rotate width of ' + vlwidth);
    }

何時間も試してみた結果、これでうまくいきました。何らかの理由で私の電話では、initial-scale=1 が台無しになりましたが、0.25 は機能しましたか?! うまくいくか、少なくとも良い出発点になることを願っています。

于 2012-07-13T15:17:56.333 に答える
2

device-width を使用:

<meta name = "viewport" content = "width=device-width">

これにより、向きの変更が処理されます。

于 2012-04-19T21:20:38.327 に答える
1

同じ問題がありましたが、これが私の解決策でした。

向きの変更後にページを再読み込みし、新しい向きに基づいてビューポート変数を設定します。

window.onorientationchange = function() {
  /*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
    left, or landscape mode with the screen turned to the right. */
  var orientation = window.orientation;
  switch(orientation) {
    case 0:
        var current = $('body').attr('class');
        if(current != 'ps-active'){
            location.reload();
        }

        break; 

    case 90:
        var current = $('body').attr('class');
        if(current != 'ps-active'){
            location.reload();
        }
        break;

    case -90: 
        var current = $('body').attr('class');
        if(current != 'ps-active'){
            location.reload();
        }
        break;
  }
}


 $(document).ready(function() {
window.onload = function() {
  /*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
    left, or landscape mode with the screen turned to the right. */
  var orientation = window.orientation;
  switch(orientation) {
    case 0:

        viewport = document.querySelector("meta[name=viewport]");
        viewport.setAttribute('content', 'width=device-width; initial-scale=0.2; maximum-scale=1.0; user-scalable=yes;');
        $('.container').show();
        break; 

    case 90:
        viewport = document.querySelector("meta[name=viewport]");
        viewport.setAttribute('content', 'width=device-width; initial-scale=0.4; maximum-scale=1.0; user-scalable=yes;');
        $('.container').show();
        break;

    case -90: 
        viewport = document.querySelector("meta[name=viewport]");
        viewport.setAttribute('content', 'width=device-width; initial-scale=0.4; maximum-scale=1.0; user-scalable=yes;');
        $('.container').show();
        break;
    default:
        $('.container').show();
        break;
  }
}
于 2012-09-12T02:53:51.810 に答える
1

これが私にとってはうまくいきました(iOS SafariとChromeの両方でテスト済み)。

ビューポートをポートレート モードで 400px、ランドスケープ モードで 600px に強制したかったのです。

var resize = function() {
    $('body').removeClass('landscape').removeClass('portrait').addClass(orientation).css('width', $(window).width() + 'px');
}

var orientation = null;

var onOrientationChange = function () {
    switch(window.orientation) {  
        case -90:
        case 90:
            orientation = 'landscape';
        break; 
        default:
            orientation = 'portrait';
        break;
    }

    if(screen.width < 768) {
        if(orientation == 'landscape') {
            var scale = Math.round(screen.height / 600 * 10) / 10;
            $('#meta-viewport').attr('content', 'width=600px, initial-scale='+scale+', maximum-scale='+scale+', minimum-scale='+scale+', user-scalable=no'); // landscape mobile
        } else {
            var scale = Math.round(screen.width / 400 * 10) / 10;
            $('#meta-viewport').attr('content', 'width=400px, initial-scale='+scale+', maximum-scale='+scale+', minimum-scale='+scale+', user-scalable=no'); // portrait mobile
        }
    } else if(screen.width >= 768 && screen.width < 1200) {
        var scale = Math.round(screen.width / 960 * 10) / 10;
        $('#meta-viewport').attr('content', 'width=960px, initial-scale='+scale+', maximum-scale='+scale+', minimum-scale='+scale+', user-scalable=no');
    } else if(screen.width >= 1200) {
        $('#meta-viewport').attr('content', 'width=device-width, user-scalable=yes');
    }

    resize();
}

$(document).ready(function() {
    $(window).resize(resize);
    $(window).bind('orientationchange', onOrientationChange);
    onOrientationChange();
});

それが役に立てば幸い!

于 2013-09-17T09:12:59.323 に答える
0

私のテストでは、matchMedia関数はAndroidで非常にうまく機能します。

var mql = window.matchMedia("(orientation: landscape)");
if (mql.matches) {
  /* The device is currently in landscape orientation */
}
else {
  /* The device is currently in portrait orientation */
}
于 2013-03-19T05:33:50.790 に答える
-1

JS を使用して、Galaxy の向きの変更のみをピックアップできると確信しています。 以下のスニペットを試してください


関連記事より:javascriptを使用したAndroidでの向きの変更

function orientation_changed ()
{
    if ( is_portrait() )
    {
        //do something
    }
    else if ( is_landscape() )
    {
        // do something else
    }
    clearTimeout(window.t);
    delete window.t;
}

window.t = undefined;
window.onorientationchange = function (event)
{
    window.t = setTimeout('orientation_changed();', 250);
}

function is_landscape()
{
    var uagent = navigator.userAgent.toLowerCase();
    if ( uagent.search('ipad') > -1 )
    {
        var r = ( window.orientation == 90 || window.orientation == -90 );
    }
    else
    {
        var r = ( screen.width > screen.height );
    }
    return r;
}
于 2012-04-19T21:36:29.277 に答える