Подтвердить что ты не робот

Блокировка устройства на мобильных веб-страницах

Можно ли обнаружить на моей странице, например, с помощью Javascript, когда пользователь посещает его с помощью мобильного устройства в портретном режиме и прекращает ориентацию ориентации, когда пользователь поворачивает свой телефон до пейзажа? На моей странице есть игра, оптимизированная только для портретного дисплея, и я не хочу ее в ландшафте.

4b9b3361

Ответ 1

В браузерах с поддержкой 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. Кроме того, это применит стиль вращения к объекту окна, который я никогда не тестировал и не знаю, работает ли он или нет. Возможно, вам придется применить стиль к элементу документа.

В любом случае, я бы по-прежнему рекомендовал просто отображать сообщение, которое просит пользователя играть в игру в портретном режиме.

Ответ 2

Новые API разрабатываются (и в настоящее время доступны)!

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

и

screen.lockOrientation("orientation");

Если "ориентация" может быть любой из следующих:

портретно-первичный - Он отображает ориентацию экрана, когда он находится в режиме основного портрета. Экран рассматривается в основном портретном режиме, если устройство удерживается в нормальном положении, и это положение находится в портретном режиме, или если нормальное положение устройства находится в горизонтальном положении, а устройство удерживается на 90 ° по часовой стрелке. Нормальное положение зависит от устройства.

портретно-вторичный - Он отображает ориентацию экрана, когда он находится в режиме вторичной портретной ориентации. Экран рассматривается во вторичном портретном режиме, если устройство удерживается на 180 ° от его нормального положения, и это положение находится в портрете, или если нормальное положение устройства находится в горизонтальном положении, а удерживаемое устройство повернуто на 90 ° против часовой стрелки. Нормальное положение зависит от устройства.

ландшафтно-первичный - Он отображает ориентацию экрана, когда он находится в своем основном ландшафтном режиме. Экран рассматривается в своем основном ландшафтном режиме, если устройство удерживается в нормальном положении, и это положение находится в горизонтальном положении, или если нормальное положение устройства находится в портретной ориентации, а удерживаемое устройство поворачивается на 90 ° по часовой стрелке. Нормальное положение зависит от устройства.

пейзаж-вторичный - Он отображает ориентацию экрана, когда он находится в режиме вторичного ландшафта. Экран рассматривается в режиме вторичного ландшафта, если удерживаемое устройство находится на 180 ° от его нормального положения, и это положение находится в горизонтальном положении или если нормальное положение устройства находится в портретном положении, а удерживаемое устройство повернуто на 90 ° против часовой стрелки. Нормальное положение зависит от устройства.

портрет - Он представляет собой портретно-первичный и портретно-вторичный.

пейзаж - Он представляет собой ландшафтно-первичный и ландшафтно-вторичный.

по умолчанию - Он представляет собой портретно-первичный и ландшафтно-первичный, зависит от естественной ориентации устройств. Например, если разрешение панели составляет 1280 * 800, значение по умолчанию сделает ее альбомной, если разрешение 800 * 1280, по умолчанию она будет сделана на портрете.

Mozilla рекомендует добавлять lockOrientationUniversal к экрану, чтобы сделать его более совместимым с несколькими браузерами.

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

Перейдите сюда для получения дополнительной информации: https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation

Ответ 3

кажется странным, что никто не предложил решение для запросов css media:

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

а параметр lo использует конкретную таблицу стилей:

<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

Ответ 4

Простой код Javascript, чтобы сделать отображение мобильного браузера в портретном или ландшафтном.

(Несмотря на то, что вам нужно дважды вводить html-код в два DIV (по одному для каждого режима), возможно, это будет загружаться быстрее, чем использование 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.

Ответ 5

С новыми функциями CSS3 вы можете вращать страницу с противоположной ориентацией, которую они вращают. Извините, нет поддержки IE7.:. (

var rotate = 0 - window.orientation;
setAttribute("transform:rotate("+rotate+"deg);-ms-transform:rotate("+rotate+"deg);-webkit-transform:rotate("+rotate+"deg)", "style");

Ответ 6

Вы можете использовать свойства screenSize.width и screenSize.height и определять, когда ширинa > высота, а затем обрабатывать эту ситуацию, либо путем указания пользователю, либо путем соответствующего изменения экрана.

Но лучшее решение - это то, что говорит @Doozer1979... Почему бы вам переопределить то, что пользователь предпочитает?