检测视口方向,如果方向是纵向显示警告消息,通知用户说明

IT技术 javascript jquery mobile viewport device-orientation
2021-01-31 18:05:33

我正在建立一个专门为移动设备设计的网站。特别是有一页最好在横向模式下查看。

有没有办法检测访问该页面的用户是否在纵向模式下查看它,如果是,则显示一条消息,通知用户该页面最好在横向模式下查看?如果用户已经在横向模式下查看它,则不会出现任何消​​息。

所以基本上,我希望网站检测视口方向,如果方向是Portrait,然后显示一条警告消息,建议用户最好在横向模式下查看此页面

6个回答
if(window.innerHeight > window.innerWidth){
    alert("Please use Landscape!");
}

jQuery Mobile 有一个处理此属性更改的事件...如果您想在稍后有人轮换时发出警告 - orientationchange

此外,经过一些谷歌搜索后,请查看window.orientation(我相信这是以度数来衡量的......)

编辑:在移动设备上,如果您打开键盘,则上述操作可能会失败,因此可以使用screen.availHeightand screen.availWidth,即使在键盘打开后也能提供适当的高度和宽度。

if(screen.availHeight > screen.availWidth){
    alert("Please use Landscape!");
}
它不起作用,因为如果显示键盘, window.innerHeight < window.innerWidth 为真,但您处于纵向模式。
2021-03-15 18:05:33
我把问题复杂化了。这很棒。很简单。
2021-03-23 18:05:33
不,不幸的是没有。但是,以下脚本确实有效: if(window.innerHeight > window.innerWidth){ alert("请横向查看"); }
2021-03-25 18:05:33
2021-03-30 18:05:33
在许多设备上,当显示键盘时,availableWidth 将大于高度,错误地给出横向方向。
2021-04-03 18:05:33

您也可以使用window.matchMedia,我使用并喜欢它,因为它与 CSS 语法非常相似:

if (window.matchMedia("(orientation: portrait)").matches) {
   // you're in PORTRAIT mode
}

if (window.matchMedia("(orientation: landscape)").matches) {
   // you're in LANDSCAPE mode
}

在 iPad 2 上测试。

在 Firefox for Android 中,只有在我的 DOM 就绪事件之后才能正常工作。
2021-03-13 18:05:33
不过对该功能的支持有点弱:caniuse.com/#feat=matchmedia
2021-03-19 18:05:33
现在对此的支持要强得多。现在这似乎是一个比公认的更可靠的答案。
2021-03-26 18:05:33
请注意此(链接)解决方案stackoverflow.com/questions/8883163/...
2021-04-07 18:05:33
这是现在的正确答案。此功能完全支持所有相关浏览器。
2021-04-07 18:05:33

大卫沃尔什有一个更好的、切中要害的方法。

// Listen for orientation changes
window.addEventListener("orientationchange", function() {
  // Announce the new orientation number
  alert(window.orientation);
}, false);

在这些更改期间,window.orientation 属性可能会更改。值 0 表示纵向视图,-90 表示设备横向旋转到右侧,而 90 表示设备横向旋转到左侧。

http://davidwalsh.name/orientation-change

iOS 不支持方向
2021-03-11 18:05:33
在此链接上:notes.matthewgifford.com /... 作者展示了来自不同制造商的不同设备对横向和纵向的不同解释。因此,您不能真正依赖不同的报告值。
2021-03-13 18:05:33
在 Nexus 10 上,我不知道其他 Android 10" 平板电脑,这些值是向后的。即当设备处于横向而不是纵向时返回 0。tobyodavies 上面的回答似乎适用于我的所有设备我测试过
2021-03-31 18:05:33
方向 0 被指定为设备的“自然”方向,因此取决于供应商。可以是人像也可以是风景...
2021-04-03 18:05:33
这不是设备检测方向模式的好解决方案。因为它们的返回值取决于自然的设备方向。例如,三星 7 英寸平板电脑纵向视图返回 90,但在纵向视图的 nexus 4 上,它们返回 0。
2021-04-07 18:05:33

您可以使用 CSS3 :

@media screen and (orientation:landscape)
{
   body
   {
      background: red;
   }
}
与javascript无关。OP 需要 javascript 解决方案。
2021-03-20 18:05:33
对我的最佳答案,因为您不需要改变方向的听众。虽然我将它与 Modernizr 结合起来检测它是否是一个触摸设备,因为它在台式机或笔记本电脑屏幕上没有意义。对于具有触摸功能的此类屏幕仍然不行......
2021-03-23 18:05:33
此 CSS 检查的支持情况如何?
2021-03-28 18:05:33
我不知道,但我没有找到不支持它的手机。在旧的 Android 上它似乎也坏了,当键盘出现时,有时会触发媒体查询。
2021-03-31 18:05:33
不,他想显示一条消息,你可以使用 display:none 然后 display:block 来显示一些东西。
2021-04-08 18:05:33

有几种方法可以做到,例如:

  • 检查window.orientation
  • 对比innerHeight对比innerWidth

您可以采用以下方法之一。


检查设备是否处于纵向模式

function isPortrait() {
    return window.innerHeight > window.innerWidth;
}

检查设备是否处于横向模式

function isLandscape() {
    return (window.orientation === 90 || window.orientation === -90);
}

示例用法

if (isPortrait()) {
    alert("This page is best viewed in landscape mode");
}

如何检测方向变化?

$(document).ready(function() {
    $(window).on('orientationchange', function(event) {
        console.log(orientation);
    });
});