我正在构建一款 iPhone 网页应用,并希望将方向锁定为竖屏模式。这可能吗?是否有任何 WebKit 扩展可以实现这一点?
请注意,这是一个使用 HTML 和 JavaScript 为 Mobile Safari 编写的应用程序,而不是使用 Objective-C 编写的本机应用程序。
我正在构建一款 iPhone 网页应用,并希望将方向锁定为竖屏模式。这可能吗?是否有任何 WebKit 扩展可以实现这一点?
请注意,这是一个使用 HTML 和 JavaScript 为 Mobile Safari 编写的应用程序,而不是使用 Objective-C 编写的本机应用程序。
这是一个不太正式的解决方案,但至少有点用处。思路是使用CSS转换将页面内容旋转到准肖像模式。以下是用jQuery表达的JavaScript代码,可供参考:
$(document).ready(function () {
function reorient(e) {
var portrait = (window.orientation % 180 == 0);
$("body > div").css("-webkit-transform", !portrait ? "rotate(-90deg)" : "");
}
window.onorientationchange = reorient;
window.setTimeout(reorient, 0);
});
代码期望页面的全部内容都在body元素内部的一个div中,该代码将该div在横屏模式下旋转90度,使其回到纵向模式。body > div { -webkit-transition: all 1s ease-in-out; }
将其应用于您的CSS。 当设备旋转时,Safari会调整页面内容。令人着迷!
这段代码是我们的 HTML5 游戏中使用的。
$(document).ready(function () {
$(window)
.bind('orientationchange', function(){
if (window.orientation % 180 == 0){
$(document.body).css("-webkit-transform-origin", "")
.css("-webkit-transform", "");
}
else {
if ( window.orientation > 0) { //clockwise
$(document.body).css("-webkit-transform-origin", "200px 190px")
.css("-webkit-transform", "rotate(-90deg)");
}
else {
$(document.body).css("-webkit-transform-origin", "280px 190px")
.css("-webkit-transform", "rotate(90deg)");
}
}
})
.trigger('orientationchange');
});
@media (max-height: 480px) and (min-width: 480px) and (max-width: 600px) {
html{
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
transform: rotate(-90deg);
-webkit-transform-origin: left top;
-moz-transform-origin: left top;
-ms-transform-origin: left top;
-o-transform-origin: left top;
transform-origin: left top;
width: 320px; /*this is the iPhone screen width.*/
position: absolute;
top: 100%;
left: 0
}
}
Screen.lockOrientation()
可以解决这个问题,但是现在的支持度不是很普遍 (截至 2017 年 4 月):
https://www.w3.org/TR/screen-orientation/
https://developer.mozilla.org/en-US/docs/Web/API/Screen.lockOrientation
我喜欢告诉用户将手机放回竖屏模式的想法。 就像这里提到的一样:http://tech.sarathdr.com/featured/prevent-landscape-orientation-of-iphone-web-apps/ ...但是使用CSS而不是JavaScript。
var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation;
lockOrientation("landscape-primary");
function deviceOrientation() {
var body = document.body;
switch(window.orientation) {
case 90:
body.classList = '';
body.classList.add('rotation90');
break;
case -90:
body.classList = '';
body.classList.add('rotation-90');
break;
default:
body.classList = '';
body.classList.add('portrait');
break;
}
}
window.addEventListener('orientationchange', deviceOrientation);
deviceOrientation();
@media screen and (orientation: landscape) {
body {
width: 100vh;
height: 100vw;
transform-origin: 0 0;
}
}
body.rotation-90 {
transform: rotate(90deg) translateY(-100%);
}
body.rotation90 {
transform: rotate(-90deg) translateX(-100%);
}
如果有人需要的话,在咖啡中。
$(window).bind 'orientationchange', ->
if window.orientation % 180 == 0
$(document.body).css
"-webkit-transform-origin" : ''
"-webkit-transform" : ''
else
if window.orientation > 0
$(document.body).css
"-webkit-transform-origin" : "200px 190px"
"-webkit-transform" : "rotate(-90deg)"
else
$(document.body).css
"-webkit-transform-origin" : "280px 190px"
"-webkit-transform" : "rotate(90deg)"
// CSS hack to prevent layout breaking in landscape
// e.g. screens larger than 320px
html {
width: 320px;
overflow-x: hidden;
}
这个或类似的CSS解决方案,至少可以保留您想要的布局。
根本解决方案是考虑设备的能力而不是试图限制它们。如果设备不允许您适当的限制,则简单的hack是最好的选择,因为设计本质上是不完整的。越简单越好。