デバイスを回転させたときにiOS用Safariで横向き表示に移行しないようにすることはできますか?
iOS Safariには「orentationchange」イベントがあります。これをインターセプトし、次のようにデフォルトの動作を無効にしようとしました。
<html>
<head>
<script type="text/javascript">
function changeOrientation(event) {
alert("Rotate");
event.preventDefault();
}
</script>
</head>
<body onorientationchange="changeOrientation(event);">
PAGE CONTENT
</body>
</html>
しかし、iPhoneでページをテストすると、デバイスを回転させるとアラートが表示されますが、ビューは横向きに切り替わります。 event.preventDefault()は回転を停止しないようです。
この動作をブロックする方法はありますか?
Mobile Safariで特定の方向を強制する方法はありません。ユーザーがデバイスを回転させると常に自動回転します。
おそらく、サポートされていない向きについて何かを表示して、向きがサポートされておらず、Webアプリを使用するためにデバイスを元に戻す必要があることをユーザーに知らせることができます。
Jonathan Snook はこの問題を回避します。彼のスライドでは こちら で、ポートレートにロックする方法を示しています(スライド54と55を参照)。
これらのスライドのJSコード:
window.addEventListener('orientationchange', function () {
if (window.orientation == -90) {
document.getElementById('orient').className = 'orientright';
}
if (window.orientation == 90) {
document.getElementById('orient').className = 'orientleft';
}
if (window.orientation == 0) {
document.getElementById('orient').className = '';
}
}, true);
およびCSS:
.orientleft #Shell {
-webkit-transform: rotate(-90deg);
-webkit-transform-Origin:160px 160px;
}
.orientright #Shell {
-webkit-transform: rotate(90deg);
-webkit-transform-Origin:230px 230px;
}
IPhoneでlandscapeでこれを機能させようとしましたが、100%正しく見えませんでした。ただし、次のjQueryianコードに近づきました。これはonready関数内にあります。また、これは「ホームスクリーンに保存された」コンテキスト内にあり、トランスフォームの起源の位置を変更したと思います。
$(window).bind('orientationchange', function(e, onready){
if(onready){
$(document.body).addClass('portrait-onready');
}
if (Math.abs(window.orientation) != 90){
$(document.body).addClass('portrait');
}
else {
$(document.body).removeClass('portrait').removeClass('portrait-onready');
}
});
$(window).trigger('orientationchange', true); // fire the orientation change event at the start, to make sure
そしてCSS:
.portrait {
-webkit-transform: rotate(90deg);
-webkit-transform-Origin: 200px 190px;
}
.portrait-onready {
-webkit-transform: rotate(90deg);
-webkit-transform-Origin: 165px 150px;
}
希望する結果に誰かが近づくのに役立つことを願っています...
この機能を実装するための spec が提案されています。
また、追加情報については this Chromium bug を参照してください(WebKitまたはChromiumで実装されるかどうかはまだ不明です)。
方向の変更が有効になるのを防ぐことはできませんが、他の回答で述べられているように、変更なしをエミュレートできます。
最初にデバイスの向きまたは向きを検出し、JavaScriptを使用して、ラッピング要素にクラス名を追加します(この例ではbodyタグを使用します)。
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();
次に、デバイスが横向きの場合、CSSを使用してボディの幅をビューポートの高さに設定し、ボディの高さをビューポートの幅に設定します。そして、私たちがそこにいる間に変換Originを設定しましょう。
@media screen and (orientation: landscape) {
body {
width: 100vh;
height: 100vw;
transform-Origin: 0 0;
}
}
ここで、body要素の向きを変更し、スライドさせて(位置を変えて)配置します。
body.rotation-90 {
transform: rotate(90deg) translateY(-100%);
}
body.rotation90 {
transform: rotate(-90deg) translateX(-100%);
}
たぶん新しい未来に...
2015年5月に関しては、
それを行う実験的な機能があります。ただし、Firefox 18以降、IE11以降、およびChrome 38+。
ただし、OperaまたはSafariではまだ動作しません。
https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation#Browser_compatibility
互換性のあるブラウザの現在のコードは次のとおりです。
var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation;
lockOrientation("landscape-primary");
次の解決策は、2016年6月の時点でiPhone4、5、6、および6+で機能しているようです。
<script>
/**
* we are locking mobile devices orientation to portrait mode only
*/
var devWidth, devHeight;
window.addEventListener('load', function() {
devWidth = screen.width;
devHeight = screen.height;
});
window.addEventListener('orientationchange', function () {
if (devWidth < 768 && (window.orientation === 90 || window.orientation == -90)) {
document.body.style.width = devWidth + 'px';
document.body.style.height = devHeight + 'px';
document.body.style.transform = 'rotate(90deg)';
document.body.style.transformOrigin = ''+(devHeight/2)+'px '+(devHeight/2)+'px';
} else {
document.body.removeAttribute('style');
}
}, true);
</script>
医療調査のために画面に表示しているデータの一貫したビューを提供する必要がある場合、デバイスの画面の回転は許可されません。ポートレートで動作するようにアプリケーションを設計します。したがって、使用するための最善の解決策は、ブラウザを介して実行できないロックするか、方向が修正されるまでアプリケーションを使用できないことを示すエラー/メッセージを表示することです。