我通常使用orientationchangeevent 向内容添加/删除 CSS 类,然后从那里开始,而不是重新调整视口的大小。 Apple 提供了一些独立的示例代码,尽管根据记忆我认为它只包括 90° 和 0° 方向——您也需要 -90° 和 180°,如 @zyrex 评论中所示。
iPhoneOrientation sample code (developer.apple.com)
每条评论更新:
澄清一下,我不会自己调整 HTML 实体的大小,而是更改正在使用的类,并依赖 CSS 来相应地设置样式。举个简单的例子,假设我想在 body 元素上的两个类之间切换,具体取决于设备方向,我会在我的 Javascript 中做这样的事情:
window.onorientationchange = updateOrientation;
// (Might want to do this onload too)
function updateOrientation(){
var o = window.orientation, body = document.querySelector('body');
switch(o){
case 0: case 180:
body.className = 'portrait';
break;
case 90: case -90:
body.className = 'landscape';
break;
}
}
…以及默认标记中的类似内容:
<body class="portrait">
<!-- stuff here -->
... 然后是 CSS,它可以做任何需要的事情——例如body 元素的 background 的不同位置:
body {background: url('images/something.png') no-repeat}
body.portrait {background-position: 30% 50%}
body.landscape {background-position: 10% 25%}
更新 #2
您可能还需要修改元标记中的 maximum-scale 指令。移动版 Safari 在从纵向更改为横向时通常会进行缩放,而不是重新进行页面布局,这可能就是您所看到的。
maximum-scale 值可以防止这种情况发生,但您应该注意,这也意味着用户无法进行正常的捏合缩放操作。下面是标签的外观:
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
请务必在此处查看答案:
How do I reset the scale/zoom of a web app on an orientation change on the iPhone?