是否可以在我的页面上检测到,例如使用 Javascript,当用户在纵向模式下使用移动设备访问它时,并在用户将手机旋转到横向时停止方向改变?我的页面上有游戏,仅针对纵向显示进行了优化,我不想让它横向显示。
阻止移动网页上的设备旋转
新的 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
在支持 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 对象,我从未实际测试过,也不知道是否有效。您可能需要将样式应用于文档元素。
无论如何,我仍然建议简单地显示一条消息,要求用户以纵向模式玩游戏。
似乎很奇怪没有人提出 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
使移动浏览器以纵向或横向显示的简单 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");