HTML5 Screen Orientation API实现横屏或竖屏

媒体查询允许网站根据智能手机和平板的方向来调整布局。但有时候你希网站锁定到一个特定的方向,横屏或竖屏,此时,原生应用的格式是可以被指定的。APP只在预设格式下显示—独立于实际的设备方向。通过使用HTML5的 Screen Orientation API, 可以在JavaScript定义屏幕方向。

为一个文档定义屏幕方向

通过screen.orientation属性的lock()方法可以调整屏幕方向,其默认值是any,这允许设备根据其物理方向来应用任何方向。值”natural”将在设备的自然方向上显示网站,因设备而异。智能手机通常使用横屏,平板则使用竖屏。

screen.orientation.lock("natural");

上面的示例中,为设备设置自然方向。
当然,Screen Orientation API也允许你定义一个独立的方向,其有四个值可以选择,这已经包含了移动设备所有可能的方向。这四个值分别是: “portrait-primary”, “portrait-secondary”, “landscape-primary”和 “landscape-secondary”。

上图显示了所有四个值的方向: “portrait-primary”, “portrait-secondary”, “landscape-primary”和 “landscape-secondary”。
对于智能手机,值portrait-primary和值natural是一样的,并等同于默认方向。值portrait-secondary将横屏模式旋转180°,所以设置成设别的自然模式时,网站看起来几乎时颠倒的。

screen.orientation.lock("portrait-primary");
同样,landscape-secondary和landscape-primary不同之处是前者将屏幕旋转了180°。
你也可以不用secondary和primary,仅适用landscape和portrait作为关键字,这将允许设备在两种方向模(portrait-primary、 portrait-secondary或landscape-primary、 landscape-secondary)式下显示。

如果想删除定义的方向,可以调用unlock()方法。

screen.orientation.unlock();
仅用于全屏模式
通过screen.orientation定义屏幕的方向有两个要求,第一:lock()方法仅在浏览器已经通过requestFullscreen()切换到全屏模式时起作用;第二:和第一点相关,由于全屏模式需要用户的许可,而不是自动切换,这同样适用于Screen Orientation API。
因此,对于点击事件,应该绑定这两种方法。

document.getElementById("button").addEventListener("click", function() {
  document.documentElement.requestFullScreen();
  screen.orientation.lock("portrait-primary");
 }, false);

调用lock()方法之前开启全屏模式是非常重要的,正如上面的例子。结束全屏模式将释放锁定的方向。
如果你在浏览器中打开了一个新文档,例如,当点击一个链接时,定义的方向将随着全屏模式同时结束。Screen Orientation API仅对当前文档有效。

读取Orientation

不能总是预先确定方向,有时你仅想知道智能手机和平板的方向。这种情况下,可以使用Screen Orientation API读取方向,类型属性值是显示定位的关键字之一。

alert(screen.orientation.type);

使用angle属性还可以显示方向的角度

alert(screen.orientation.angle);

角度为0等同于自然方向,大部分智能手机的自然方向是portrait-primary;90°等同于landscape-primary;180°等同portrait-secondary;270°等同landscape-secondary。不同的设备,angle代表不同的关键字。
为了获取方向值,浏览器需要运行在全屏模式下。
通过change事件改变屏幕方向也是可以的,只需要调用addEventListener()为orientation属性注册change事件并添加一个函数(作为事件处理程序)。

screen.orientation.addEventListener("change", function(e) {
  alert(screen.orientation.type + " " + screen.orientation.angle);
}, false);

每一次屏幕方向的改变都会触发弹框,显示当前的方向关键字和角度。

浏览器支持
Screen Orientation API在Chrome 38+ and Opera 25+不需要私有前缀,但 API仅能在移动设备上起作用。你可以使用一个if语句判断浏览器是否支持API

if ("orientation" in screen) {
  …
}
Screen Orientation API是很新的API,API的早期发展阶段使用不同的方法名。例如:使用lockOrientation()而不是lock(),使用unlockOrientation()而不是unlock(),不应该在Chrome and Opera使用这些旧的方法名。
IE 11+和Firefox 33+也支持Screen Orientation API,但需要对应的私有前缀

screen.msLockOrientation.lock("portrait-primary");
screen.mozLockOrientation.lock("portrait-primary");

在IE 11+和Firefox 33+中,检测方向变化的事件名也不同,你应该使用带对应前缀的orientationchange,而不是change.
当使用Screen Orientation API时,还需要记住一件事:由于要Fullscreen API一起使用才能起作用,所以不应该使用它来设计网站之类的。对于需要全屏模式的浏览器游戏或其他应用程序,它能有更好的效果。

时间: 2024-08-02 14:40:47

HTML5 Screen Orientation API实现横屏或竖屏的相关文章

【ANDROID游戏开发之九】(细节处理)触屏事件中的BUG解决方案以及禁止横屏和竖屏切换!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/315.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

使用JavaScript判断手机浏览器是横屏还是竖屏问题_javascript技巧

//判断手机横竖屏状态: function hengshuping(){ if(window.orientation==180||window.orientation==0){ alert("竖屏状态!") } if(window.orientation==90||window.orientation==-90){ alert("横屏状态!") } } window.addEventListener("onorientationchange" i

基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码_jquery

其实主要是通过window.orientation实现,下面看下代码吧 复制代码 代码如下: function orient() {if (window.orientation == 90 || window.orientation == -90) {//ipad.iphone竖屏:Andriod横屏$("body").attr("class", "landscape");orientation = 'landscape';return fals

android dialog弹出速度慢 在平板横屏和竖屏下 反应速度不一样

问题描述 android dialog弹出速度慢 在平板横屏和竖屏下 反应速度不一样 在小米平板上进行开发,listview 的item布局中有删除按钮和详情按钮,我在adapter中写点击事件弹出提示是否删除,但是在平板横屏下反应没问题,很流畅.但切换成竖屏时就会偶尔有延迟,会卡顿. 解决方案 也可能和你的布局有关系,弹出时,会导致布局调整,由于布局布置不合理,导致调整布局时卡顿 解决方案二: 那为什么在横屏下是没问题呢? 解决方案三: public void onBackPressed()

Android--锁定横屏、竖屏、去标题全屏

xml文件中设置: 要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:Android:screenOrientation,属性取值landscape为固定横屏.portrait为固定纵屏幕. [html] view plain copy  print? <!-- android:screenOrientation="portrait" 竖屏    android:screenOrientation="landscap

Android开发11——手机横屏和竖屏与android:configChanges

目前大多数手机都支持重力感应随之而来的就是屏幕方向改变的问题.对应普通开发者来说屏幕的随意改变也会带来困扰.在Google自带的doc里可以看到,如果设备的配置(Resources.Configuration中进行了定义)发生改变,那么所有用户界面上的东西都需要进行更新以适应新的配置.因为Activity是与用户交互的最主要的机制,它包含了处理配置改变的专门支持.除非你特殊指定,否则当配置发生改变(比如屏幕方向.语言.输入设备等等的改变)时你当前的activity都将被销毁,这销毁是通过一个正常

Android判断屏幕是横屏或是竖屏的简单实现方法_Android

本文所述为一个Android的常用技巧代码,主要用于判断手机屏幕是横向或是竖向的,在判断屏幕水平或垂直后你可以对程序做出相应的响应,该实例代码只是判断是否为竖屏,若判断正确返回true,否则返回false. 具体的程序代码如下: package com.lurencun.cfuture09.androidkit.util.ui; import android.content.Context; import android.content.res.Configuration; public cla

Android判断屏幕是横屏或是竖屏的简单实现方法

本文所述为一个Android的常用技巧代码,主要用于判断手机屏幕是横向或是竖向的,在判断屏幕水平或垂直后你可以对程序做出相应的响应,该实例代码只是判断是否为竖屏,若判断正确返回true,否则返回false. 具体的程序代码如下: package com.lurencun.cfuture09.androidkit.util.ui; import android.content.Context; import android.content.res.Configuration; public cla

Android判断屏幕是横屏或是竖屏

  这是从网上发现的一个Android技巧代码,用于判断手机屏幕是横向或是竖向的,判断屏幕水平或垂直后你可以对程序做出相应响应,本代码只是判断是否为竖屏,若判断正确返回true,否则返回false.