阻止移动网页上的设备旋转

IT技术 javascript mobile mobile-phones mobile-website
2021-01-30 20:10:33

是否可以在我的页面上检测到,例如使用 Javascript,当用户在纵向模式下使用移动设备访问它时,并在用户将手机旋转到横向时停止方向改变?我的页面上有游戏,仅针对纵向显示进行了优化,我不想让它横向显示。

6个回答

新的 API 正在开发中(目前可用)!

screen.orientation.lock();   // webkit only

screen.lockOrientation("orientation");

其中“方向”可以是以下任何一项:

Portrait-primary - 它表示屏幕处于主要纵向模式时的方向。如果设备保持在其正常位置并且该位置处于纵向,或者如果设备的正常位置处于横向并且设备顺时针旋转 90°,则屏幕被认为处于其主要纵向模式。正常位置取决于设备。

Portrait-secondary - 它表示屏幕处于辅助纵向模式时的方向。如果设备从其正常位置保持 180° 并且该位置处于纵向,或者如果设备的正常位置处于横向并且手持设备逆时针旋转 90°,则屏幕被视为处于其辅助纵向模式。正常位置取决于设备。

Landscape-primary - 它表示屏幕处于主要横向模式时的方向。如果设备处于其正常位置并且该位置处于横向,或者如果设备的正常位置处于纵向并且所持设备顺时针旋转 90°,则屏幕被认为处于其主要横向模式。正常位置取决于设备。

Landscape-secondary - 它表示屏幕处于辅助横向模式时的方向。如果手持设备与其正常位置成 180° 且该位置处于横向,或者如果设备的正常位置为纵向且手持设备逆时针旋转 90°,则屏幕被视为处于其次要横向模式。正常位置取决于设备。

肖像- 它代表肖像主要和肖像次要。

景观- 它代表景观主要和景观次要。

默认- 它代表纵向主要和横向主要取决于设备的自然方向。例如,如果面板分辨率为 1280 800,则默认为横向,如果分辨率为 800 1280,则默认为纵向。

Mozilla 建议在屏幕上添加一个 lockOrientationUniversal 以使其更具跨浏览器兼容性。

screen.lockOrientationUniversal = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation;

去这里了解更多信息(不推荐使用的 API):https : //developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation


MDN 中的现代 API 文档在这里:https : //developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation/lock

Screen.lockOrientation 已弃用。请更新您的答案。
2021-03-23 20:10:33
这个答案需要更新新规范
2021-04-01 20:10:33
API 已更改(再次)。这里显示的webkit only是现在的官方 API:w3c.github.io/screen-orientation/#examples
2021-04-05 20:10:33
这在 Android Chrome 中似乎没有效果
2021-04-11 20:10:33
Safari (iOS) 怎么样?
2021-04-12 20:10:33

在支持 JavaScript 的浏览器中,应该很容易确定屏幕是横向还是纵向模式,并使用 CSS 进行补偿为用户提供禁用此功能的选项或至少警告他们设备旋转无法正常工作可能会有所帮助。

编辑

检测浏览器方向的最简单方法是检查浏览器的宽度与浏览器的高度。这还有一个优点,即您将知道游戏是否正在以横向模式自然定向的设备上运行(如某些移动设备,如 PSP)。这比尝试禁用设备旋转更有意义。

编辑 2

Daz 展示了如何检测设备方向,但检测方向只是解决方案的一半。如果要反转自动方向更改,则需要将所有内容旋转 90° 或 270°/-90°,例如

$(window).bind('orientationchange resize', function(event){
  if (event.orientation) {
    if (event.orientation == 'landscape') {
      if (window.rotation == 90) {
        rotate(this, -90);
      } else {
        rotate(this, 90);
      }
    }
  }
});

function rotate(el, degs) {
  iedegs = degs/90;
  if (iedegs < 0) iedegs += 4;
  transform = 'rotate('+degs+'deg)';
  iefilter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+iedegs+')';
  styles = {
    transform: transform,
    '-webkit-transform': transform,
    '-moz-transform': transform,
    '-o-transform': transform,
    filter: iefilter,
    '-ms-filter': iefilter
  };
  $(el).css(styles);
}

注意:如果你想在 IE 中旋转任意角度(用于其他目的),你需要使用矩阵变换,例如

rads = degs * Math.PI / 180;
m11 = m22 = Math.cos(rads);
m21 = Math.sin(rads);
m12 = -m21;
iefilter = "progid:DXImageTransform.Microsoft.Matrix("
  + "M11 = " + m11 + ", "
  + "M12 = " + m12 + ", "
  + "M21 = " + m21 + ", "
  + "M22 = " + m22 + ", sizingMethod = 'auto expand')";
styles['filter'] = styles['-ms-filter'] = iefilter;

— 或使用CSS Sandpaper此外,这将旋转样式应用于 window 对象,我从未实际测试过,也不知道是否有效。您可能需要将样式应用于文档元素。

无论如何,我仍然建议简单地显示一条消息,要求用户以纵向模式玩游戏。

你错过了在闭括号$(window).bind功能,必须在一个额外的支架rotation()功能
2021-03-13 20:10:33
我有一个 React 应用程序。我想在移动设备上保持纵向视图。是否有可能得到一个直接的答案?
2021-03-21 20:10:33
@NK我认为对于不同的设备,这个值实际上是不同的。而且,事实上,它甚至没有被称为window.rotation我能找到的所有参考资料都是window.orientation. 我要么打错了字,要么可用的 API 与 7 年前不同。当我有空闲时间时,将不得不解决这个问题并修改代码。
2021-03-23 20:10:33
“window.rotation == 90”是机器特定的代码吗?
2021-04-08 20:10:33

似乎很奇怪没有人提出 CSS 媒体查询解决方案:

@media screen and (orientation: portrait) {
  ...
}

以及使用特定样式表的选项:

<link rel="stylesheet" type="text/css" href="css/style_p.css" media="screen and (orientation: portrait)">

MDN:https : //developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries#orientation

这不会只是在其他方向隐藏 UI 吗?理想情况下,UI 将保持在首选方向,但不会隐藏
2021-03-29 20:10:33
这只会将style_p.css样式表用于纵向,您不应该为主要样式添加它。
2021-04-02 20:10:33
媒体查询似乎是要走的路
2021-04-08 20:10:33

使移动浏览器以纵向或横向显示的简单 Javascript 代码..

(即使您必须在两个 DIV 中输入两次 html 代码(每个模式一个),可以说这比使用 javascript 更改样式表加载速度更快......

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Mobile Device</title>
<script type="text/javascript">
// Detect whether device supports orientationchange event, otherwise fall back to
// the resize event.
var supportsOrientationChange = "onorientationchange" in window,
    orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";

window.addEventListener(orientationEvent, function() {
    if(window.orientation==0)
    {
      document.getElementById('portrait').style.display = '';
      document.getElementById('landscape').style.display = 'none';
    }
    else if(window.orientation==90)
    {
      document.getElementById('portrait').style.display = 'none';
      document.getElementById('landscape').style.display = '';
    }
}, false);
</script>
<meta name="HandheldFriendly" content="true" />
<meta name="viewport" content="width=device-width, height=device-height, user-scalable=no" />
</head>
<body>
<div id="portrait" style="width:100%;height:100%;font-size:20px;">Portrait</div>
<div id="landscape" style="width:100%;height:100%;font-size:20px;">Landscape</div>

<script type="text/javascript">
if(window.orientation==0)
{
  document.getElementById('portrait').style.display = '';
  document.getElementById('landscape').style.display = 'none';
}
else if(window.orientation==90)
{
  document.getElementById('portrait').style.display = 'none';
  document.getElementById('landscape').style.display = '';
}
</script>
</body>
</html>

已在 Android HTC Sense 和 Apple iPad 上测试并运行。

使用新的 CSS3 功能,您可以将页面旋转到与它们旋转的方向相反的方向。抱歉,不支持 IE7。:(。

var rotate = 0 - window.orientation;
setAttribute("transform:rotate("+rotate+"deg);-ms-transform:rotate("+rotate+"deg);-webkit-transform:rotate("+rotate+"deg)", "style");
你将如何将其实现为代码?(在 index.html 文件中)
2021-03-14 20:10:33
@KarlMorrison 在 JavaScript 中
2021-03-22 20:10:33
呵呵我真的很喜欢这个修复的邪恶:)
2021-04-01 20:10:33