iPhone Safari在纵向→横向→纵向的切换中不会自动缩小。

38

我有一个非常简单的 HTML 页面,其中包含用于 iPhone 的这个 META 标签:

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

在使用iPhone Safari浏览器时,当页面在竖屏模式下加载时,页面宽度适合屏幕显示。 当我将iPhone旋转到横屏模式时,网页会自动调整大小以适应横向宽度。这很好,这正是我想要的。

但是,当我从横屏旋转回来时,页面没有像之前一样被重新调整为适合竖屏的宽度。它仍然保持在横向宽度上。

我希望iPhone能够像在横屏模式下那样自动将其调整回正确的宽度。 我认为这不需要方向监听器,因为它是自动完成的,我没有任何特殊的样式适用于不同模式。

为什么iPhone不能在竖屏模式下重新调整网页大小? 我该如何解决这个问题?

更新

我设法让iPhone自动缩小页面大小,但出现了一个奇怪的现象,只有在旋转偶数次后才这样做...非常奇怪。
我使用了这个META标签:

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

以下是我需要做的来使它自动调整大小:
1. 在纵向加载时 -> 看起来不错。
2. 旋转到横向 -> 调整大小以适应屏幕。
3. 旋转回纵向 -> 没有恢复调整大小。
4. 旋转到横向 -> 仍处于横向大小。
5. 旋转到纵向 -> 缩小大小以适应纵向屏幕。

有人能解释这种行为吗?
我仍然想知道如何修复此问题,感谢任何协助。

谢谢!
汤姆。


##Meta viewport 标签无法解决此问题,我尝试了列出的所有设置,它们对于修复横向到纵向的调整大小没有任何作用。我假设jQueryMobile可以解决这个问题,但目前它还存在同样的问题。 - Scott Romack
11个回答

31

这一定是 iOS 4 Safari 的一个 bug。以下是我的行为,使用了以下 meta 标签(第二个标签用于全屏显示):

<meta name="viewport" content="user-scalable=no, width=device-width"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>

在从纵向切换至横向时,页面会正确缩放,直到我使用弹出式键盘输入字段的值 - 然后它就停止了缩放。这意味着如果我在横向使用键盘,则在切换至纵向时它将过大,反之亦然。

使用以下元标记进行切换修复了它... 感谢本页面上其他答案的帮助。

<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=device-width"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>

2
这个是可行的,但会阻止用户使用捏合缩放。 - superluminary

4

我在我的3GS 3.1.3手机上遇到了同样的问题,即使我无法让它在横向模式下再次变为正确的大小。但是当我删除“height=device-height”时,页面每次都能正确缩放。因此,我的meta标签看起来像这样:

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

我希望能够使用height属性来锁定高度,但似乎它们不太兼容。


2
你好, 你说得没错,这两个不搭配。但同时,我找到了一个解决方法。也许对你也有用。设置高度的原因是为了能够通过向下滚动1像素来在页面加载时隐藏地址栏。所以现在我使用这个meta标签:<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> 并且在html页面的末尾添加了这个: <div style="height:350px"></div> - Aerodyne
当您执行以下操作时,地址栏会隐藏。高度属性不会做到这一点。 http://www.iphonemicrosites.com/tutorials/how-to-hide-the-address-bar-in-mobilesafari/我会尝试使用height:350px - 谢谢。 - Mogens Beltoft

3

您需要再添加一个东西minimum-scale=1.0,这样它就会变成:

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

2
我正在使用ExtJs(sencha touch),它看起来不错。
Ext.setup({
  tabletStartupScreen: 'images/tablet_startup_768x1004.png',
  phoneStartupScreen: 'images/phone_startup_320x460.png',
  tabletIcon: 'images/tablet_icon_72x72.png',
  phoneIcon: 'images/phone_icon_72x72.png',
  icon: 'images/icon_72x72.png',
  statusBarStyle: 'black',
  glossOnIcon: true,
  fullscreen: true,
  onReady: function() {
    var viewport = null;                                                                                
    var metas = document.getElementsByTagName('meta');                                                  
    for(var i = 0, length = metas.length; i < length; ++i){                                             
      var meta = metas[i];                                                                              
      // already Extjs addedMetaTags                                                                    
      if(meta.name == 'viewport'){                                                                      
        viewport = Ext.get(meta);                                                                       
        break;                                                                                          
      }                                                                                                 
    }                                                                                                   
    if(null == viewport){                                                                               
      viewport = Ext.get(document.createElement('meta'));                                               
    }                                                                                                   

    if(window.navigator.standalone){                                                                    
      // IMPORTANT!!! not set to height=device-height when iphone standalone mode was ignored "scale" settings           
      viewport.set({                                                                                    
        name: 'viewport',                                                                               
        content: 'width=device-width, initial-scale=0.1, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'
      });                                                                                               
    } else {                                                                                            
      // IMPORTANT!!! set to height=device-height when !standalone mode; behav window.innerHeight = fullscreen size
      viewport.set({                                                                                    
        name: 'viewport',                                                                               
        content: 'height=device-height, width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'
      });                                                                                               
    } 
  }
});

其他与...兼容的设备

var watcher = {
  handlers: [],
  dimentions: {width:0, height: 0},
  fullscreenize: false,
  orientLandscape: function (){
    return 90 === Math.abs(window.orientation);
  },
  orientPortrait: function (){
    return !this.orientLandscape();
  },
  width: function (){
    return this.dimentions.width;
  },
  height: function (){
    return this.dimentions.height;
  },
  changeDimentions: function (evt){
    var self = this;
    (function (){
      if(self.fullscreenize){
        window.scrollTo(0, 1);
      }

      self.dimentions = Ext.Element.getViewSize();
      self.fireOnchange();
    }).defer(100);
  },
  init: function (){
    if('onorientationchange' in window){
      Event.observe(window, 'orientationchange', this.changeDimentions.bind(this));
    } else {
      Event.observe(window, 'resize', this.changeDimentions.bind(this));
    }
    Event.observe(window, 'load', this.changeDimentions.bind(this));
  },
  fullScreen: function (){
    this.fullscreenize = true;
    var self = this;
    document.observe('dom:loaded', function (){
      (function (){
        window.scrollTo(0, 1);

        self.changeDimentions();
      }).defer(100);
    });
  },
  fireOnchange: function(){
    var self = this;
    self.handlers.each(function (handler){
      handler.apply(null, [self]);
    });
  },
  onchange: function (handler){
    this.handlers.push(handler);
  }
};
watcher.init();
watcher.fullScreen();

aComponent = Ext.extend(Ext.Component, {
  initComponent: function (){
    watcher.onchange(this.fullscreen.bind(this));
  },
  fullscreen: function (){
    var height = watcher.height();
    var width = watcher.width();

    this.menu.setHeight(40);
    this.mainPanel.onResize(height - 40, width);
  }
});

1

只需将视口指令设置为...

<meta name="viewport" content="height=device-height, width=device-width, minimum-scale=1.0, user-scalable=yes|no" />

...不需要使用JavaScript,用户仍然可以自由缩放页面。


1

我也遇到了“回到竖屏时不进行缩放”的问题。

但是我已经解决了它,方法如下:

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

对于基本的缩放,我在3G上使用iOS 4时,需要在更改方向时进行调整。

最初我使用了"minimum-scale=1.0",但当我看到这里的建议后,将其替换为"initial-scale=1.0"后,它就可以正常工作了。


1
我们在 JQuery Mobile 1.3.0 中也遇到了同样的问题,我们使用了以下方法解决:
在 css 中:
body { /* IOS page orientation change resize issue*/  
  -webkit-text-size-adjust: none ; 
}

如果标题/页脚仍然无法正确调整大小(可选)

$(window).resize(function() { 
   $("div[data-role=header]").width($(window).width());
   $("div[data-role=footer]").width($(window).width());
});

1
尝试这个:

<meta name="viewport" content="width=1024" />


0
你是在使用 XHTML 而不是 HTML 吗?
试试这个方法,确保你正确地关闭了第一个 meta 标签。
<meta name="viewport" content ="user-scalable=no, width=device-width"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>

0

我在我的iPhone 5上也遇到了同样的问题。答案非常简单。

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

这将始终以正确的方式显示页面,并提供可扩展性。


这会导致iOS和Android之间的不一致。Android可以正确地调整横向视图的大小,而iOS则不能。 - fauverism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接