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

Я создаю сайт специально для мобильных устройств. В частности, есть одна страница, которую лучше всего просматривать в альбомном режиме.

Есть ли способ определить, просматривает ли пользователь эту страницу ее в портретном режиме, и если да, отобразить сообщение, информирующее пользователя о том, что страницу лучше всего просматривать в альбомном режиме? Если пользователь уже просматривает его в альбомном режиме, сообщение не появится.

По сути, я хочу, чтобы сайт определял ориентацию области просмотра, если ориентация - Книжная, а затем отображала предупреждающее сообщение, информирующее пользователя о том, что эту страницу лучше всего просматривать в режиме Альбомная.


person Dan    schedule 07.02.2011    source источник


Ответы (29)


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

В jQuery Mobile есть событие, которое обрабатывает изменение этого свойства ... если вы хотите предупредить, если кто-то изменится позже - _ 2_

Кроме того, после некоторого поиска в Google, проверьте window.orientation (который, как мне кажется, измеряется в градусах ...)

РЕДАКТИРОВАТЬ: на мобильных устройствах, если вы откроете клавиатуру, вышеуказанное может привести к сбою, поэтому можно использовать screen.availHeight и screen.availWidth, что дает правильную высоту и ширину даже после открытия клавиатуры.

if(screen.availHeight > screen.availWidth){
    alert("Please use Landscape!");
}
person tobyodavies    schedule 07.02.2011
comment
Спасибо за ваш ответ. К сожалению, это не решает проблему определения ориентации устройства и отображения предупреждающего сообщения, если устройство находится в портретном режиме. - person Dan; 07.02.2011
comment
if(window.height > window.width) alert("please view in landscape"); не работает? - person tobyodavies; 07.02.2011
comment
Нет, к сожалению нет. Однако следующий сценарий действительно работал: if (window.innerHeight ›window.innerWidth) {alert (просмотрите в альбомной ориентации); } - person Dan; 07.02.2011
comment
У меня есть небольшие проблемы с тем, чтобы это работало. На каком элементе мне нужно вызвать эту функцию? Если бы кто-нибудь мог опубликовать рабочий пример, он был бы очень признателен. - person sanjaypoyzer; 04.05.2013
comment
Этот скрипт не будет работать, если есть метатег% meta {content: app-id =, app-argument = # {request.url}, name: apple-itunes-app} / на iPhone4, потому что даже в портретном режиме x больше чем у - person Mïchael Makaröv; 07.08.2013
comment
это неверно. это зависит от того, как загружается страница, если у вас есть фиксированные или абсолютные позиционные блоки. - person FlavorScape; 26.08.2013
comment
Я слишком усложнял проблему. Отлично. Так просто. - person ; 10.12.2013
comment
На многих устройствах, когда отображается клавиатура, availableWidth будет больше, чем высота, неправильно задавая альбомную ориентацию. - person Pierre; 14.04.2014
comment
чтобы заставить его работать window.orientation мне нужно включить мобильную библиотеку jquery на страницу? - person ARUN; 30.04.2014
comment
Это не работает, потому что если отображается клавиатура, window.innerHeight ‹window.innerWidth истинно, но вы находитесь в портретном режиме. - person Stefdelec; 30.05.2017
comment
Отличное быстрое решение для простых страниц. Обратите внимание, что window.orientation работает не на всех платформах - например, если вы используете настольные браузеры Chrome, ориентация этого устройства часто не определена. - person Eric; 05.09.2017
comment
@Eric Вопрос касался мобильных устройств. Настольный Chrome не имеет значения. - person Telarian; 14.02.2019
comment
Это не работает в сочетании с событием orientationchange. Он покажет старую ориентацию вместо новой ориентации. Этот ответ хорошо работает в сочетании с событием orientationchange. - person Donald Duck; 17.07.2019
comment
Может быть window.innerWidth > window.innerHeight ? "LANDSCAPE" : "PORTRAIT" - person Rajib Chy; 04.10.2019
comment

Вы также можете использовать 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.

person crmpicco    schedule 15.05.2013
comment
Однако поддержка этой функции довольно слабая: caniuse.com/#feat=matchmedia - person Ashitaka; 06.09.2013
comment
В Firefox для Android работает нормально только после события готовности DOM для меня. - person Inversion; 16.02.2015
comment
Поддержка этого сейчас намного сильнее. Это кажется гораздо более надежным ответом, чем принятый. - person JonK; 29.06.2016
comment
Остерегайтесь этого с помощью этого (ссылки) решения stackoverflow.com/questions/8883163/ - person dzv3; 02.06.2017
comment
Теперь это правильный ответ. Эта функция полностью поддерживает все соответствующие браузеры. - person Telarian; 14.02.2019
comment
Это становится жертвой проблемы, когда клавиатура Android вызывает превышение ширины над высотой, браузер сообщит о альбомной ориентации. - упомянул @ dzv3 - person cdosborn; 21.02.2019
comment
Это не работает в сочетании с событием orientationchange. Он покажет старую ориентацию вместо новой ориентации. Этот ответ хорошо работает в сочетании с событием orientationchange. - person Donald Duck; 17.07.2019

У Дэвида Уолша более точный и точный подход.

// 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

person Jatin    schedule 31.07.2012
comment
На Nexus 10, а о других планшетах Android 10 я не знаю, значения обратные. Т.е. 0 возвращается, когда устройство находится в альбомной, а не вертикальной ориентации. Ответ tobyodavies выше, похоже, работает хорошо, хотя на всех устройствах, которые я тестировал - person Nathan; 20.06.2013
comment
Ориентация 0 задается как естественная ориентация устройства и, таким образом, зависит от производителя. Это может быть портрет или пейзаж ... - person Pierre; 14.04.2014
comment
на ipad в iframe ничего не предупреждал - person Dariux; 04.06.2014
comment
это не лучшее решение для определения ориентации устройства. Потому что возвращаемое значение зависит от естественной ориентации устройства. Пример на планшете Samsung 7 'в портретной ориентации возвращает 90, но на Nexus 4 для портретной ориентации они возвращают 0. - person Dexter_ns88; 04.01.2015
comment
Не все устройства сообщают одинаковые значения: notes.matthewgifford. ru / - person Neon Warge; 13.05.2016
comment
По этой ссылке: notes.matthewgifford.com/ Авторские витрины разных устройств от разных производителей по-разному трактуют, что такое альбомный и портретный. Отсюда разные сообщаемые значения, на которые нельзя полагаться. - person Neon Warge; 13.05.2016
comment
ориентация не поддерживается в iOS - person fletchsod; 29.06.2021

Вы можете использовать CSS3:

@media screen and (orientation:landscape)
{
   body
   {
      background: red;
   }
}
person Thomas Decaux    schedule 26.04.2013
comment
Лучший ответ для меня, потому что вам не нужен слушатель для изменения ориентации. Хотя я объединяю его с modernizr, чтобы определить, является ли это сенсорным устройством, поскольку это не имеет смысла на экранах настольных компьютеров или ноутбуков. Все равно не годится для таких экранов С сенсорными возможностями ... - person Esger; 06.09.2013
comment
Не имеет отношения к javascript. OP требует решение javascript. - person easwee; 12.02.2014
comment
Нет, он хочет отобразить сообщение, вы можете использовать display: none, а затем display: block для отображения чего-либо. - person Thomas Decaux; 12.02.2014
comment
Какова поддержка этой проверки CSS? - person ChrisF; 03.12.2014
comment
Я не знаю, но я не нашел мобильный телефон, который его не поддерживает. Также он кажется сломанным на старом Android, когда появляется клавиатура, иногда запускается медиа-запрос. - person Thomas Decaux; 03.12.2014
comment
К сожалению, хотя это довольно круто, как сказал Томас, я обнаружил, что на iPhone и Android, когда появляется клавиатура, запускается медиа-запрос, если у кого-то есть ответ, я поднял проблему здесь - person svnm; 27.10.2015
comment
Это здорово, не доставляет мне проблем при активации клавиатуры. - person brewpixels; 20.03.2018

Это можно сделать несколькими способами, например:

  • Проверить значение 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);
    });
});
person martynas    schedule 12.03.2014

Я думаю, что более стабильным решением является использование экрана вместо окна, потому что это может быть как альбомная, так и портретная ориентация, если вы измените размер окна браузера на настольном компьютере.

if (screen.height > screen.width){
    alert("Please use Landscape!");
}
person artnikpro    schedule 19.01.2013
comment
Это работает в IE 10, Firefox 23 и Chrome 29 (все настольные браузеры). - person Jakob Jenkov; 28.09.2013
comment
Все основные браузеры поддерживают его. IE 7 тоже - person artnikpro; 29.09.2013
comment
но не стандартный: developer.mozilla.org/en -US / docs / Web / API / - person fjsj; 07.11.2013
comment
@Duncan Нет. Это работает на мобильных устройствах. Это довольно старый метод, который поддерживается в старых браузерах Safari и Android. Это может быть не очень точно с сетчаткой, но для определения ориентации области просмотра это должно работать нормально. - person artnikpro; 20.10.2016
comment
@artnikpro Я тестировал его вчера, и оказалось, что Safari возвращает физические размеры экрана без учета ориентации. Таким образом, screen.width - это всегда физическая ширина экрана. - person Duncan Hoggan; 20.10.2016

Чтобы применить все эти замечательные комментарии к моему ежедневному кодированию для обеспечения непрерывности между всеми моими приложениями, я решил использовать следующее в моем коде jquery и jquery для мобильных устройств.

window.onresize = function (event) {
  applyOrientation();
}

function applyOrientation() {
  if (window.innerHeight > window.innerWidth) {
    alert("You are now in portrait");
  } else {
    alert("You are now in landscape");
  }
}
person dLindley    schedule 23.06.2014

Не пытайтесь использовать фиксированные запросы window.orientation (0, 90 и т. Д. Не означает портрет, пейзаж и т. Д.):

http://www.matthewgifford.com/blog/2011/12/22/a-misconception-about-window-orientation/

Даже на iOS7, в зависимости от того, как вы заходите в браузер, 0 не всегда портретный

person kev666n    schedule 13.11.2013
comment
я больше не думаю, что это правда - person oldboy; 24.03.2019
comment
Это все еще верно ... ничего не могу предполагать из чистого orientation.angle. Вам также нужно проверить orientation.type, и это немного усложняет задачу. - person Scalway; 22.12.2020

Только CCS

@media (max-width: 1024px) and (orientation: portrait){ /* tablet and smaller */
  body:after{
    position: absolute;
    z-index: 9999;
    width: 100%;
    top: 0;
    bottom: 0;
    content: "";
    background: #212121 url(http://i.stack.imgur.com/sValK.png) 0 0 no-repeat; /* replace with an image that tells the visitor to rotate the device to landscape mode */
    background-size: 100% auto;
    opacity: 0.95;
  }
}

В некоторых случаях вам может потребоваться добавить небольшой фрагмент кода для перезагрузки на страницу после того, как посетитель повернул устройство, чтобы CSS отображался правильно:

window.onorientationchange = function() { 
    var orientation = window.orientation; 
        switch(orientation) { 
            case 0:
            case 90:
            case -90: window.location.reload(); 
            break; } 
};
person cptstarling    schedule 16.08.2016
comment
Я знаю, что не должен, но мне пришлось поблагодарить за это, это отличное решение. - person FalsePozitive; 30.08.2019

После некоторых экспериментов я обнаружил, что поворот устройства с ориентацией всегда вызывает событие resize в окне браузера. Поэтому в обработчике изменения размера просто вызовите такую ​​функцию, как:

function is_landscape() {
  return (window.innerWidth > window.innerHeight);
}
person Dave Sag    schedule 23.01.2013
comment
См. Выше, почему 90 = ›пейзаж - это не то, на что можно положиться на разных устройствах. - person ChrisF; 03.12.2014

Я объединил два решения, и у меня он отлично работает.

window.addEventListener("orientationchange", function() {                   
    if (window.matchMedia("(orientation: portrait)").matches) {
       alert("PORTRAIT")
     }
    if (window.matchMedia("(orientation: landscape)").matches) {
      alert("LANSCAPE")
     }
}, false);
person ARTniyet    schedule 20.06.2016

Я не согласен с ответом, получившим наибольшее количество голосов. Используйте screen, а не window

    if(screen.innerHeight > screen.innerWidth){
    alert("Please use Landscape!");
}

Это правильный способ сделать это. Если вы рассчитываете с window.height, у вас будут проблемы на Android. Когда клавиатура открыта, окно сжимается. Так что используйте экран вместо окна.

screen.orientation.type - хороший ответ, но с IE. https://caniuse.com/#search=screen.orientation

person Stefdelec    schedule 31.05.2017
comment
По состоянию на март 2021 года screen.innerHeight отсутствует ... по крайней мере, в Chrome. Есть screen.availHeight. И screen.height тоже существует. - person den232; 19.03.2021

Получите ориентацию (в любое время в вашем js-коде) через

window.orientation

Когда window.orientation возвращает 0 или 180, вы находитесь в портретном режиме, когда возвращает 90 или 270, вы находитесь в альбомном режиме.

person Sliq    schedule 11.07.2013
comment
Однако он не возвращает 270, он возвращает -90. - person Felipe Correa; 12.06.2015
comment
@FelipeCorrea Ответу 2 года! - person Sliq; 12.06.2015
comment
Я уточнял, чтобы сделать его действительным для новых посетителей. Кстати, мне это помогло. - person Felipe Correa; 16.06.2015
comment
window.orientation устарел - person Jonny; 26.04.2019

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

var orientation = window.screen.orientation.angle;

Это пока экспериментальная технология, вы можете проверить совместимость браузера здесь

person Atul Kumar    schedule 31.08.2018

другая альтернатива для определения ориентации, основанная на сравнении ширины / высоты:

var mql = window.matchMedia("(min-aspect-ratio: 4/3)");
if (mql.matches) {
     orientation = 'landscape';
} 

Вы используете его в событии "изменение размера":

window.addEventListener("resize", function() { ... });
person Gregor Srdic    schedule 16.09.2015

Вот лучший метод, который я нашел, на основе статьи Дэвида Уолша (Определение изменения ориентации на мобильных устройствах)

if ( window.matchMedia("(orientation: portrait)").matches ) {  
   alert("Please use Landscape!") 
}

Пояснение:

Window.matchMedia () - это собственный метод, который позволяет вы можете определить правило медиа-запроса и проверить его действительность в любой момент времени.

Я считаю полезным прикрепить onchange слушателя к возвращаемому значению этого метода. Пример:

var mediaQueryRule = window.matchMedia("(orientation: portrait)")
mediaQueryRule.onchange = function(){ alert("screen orientation changed") }
person Shibl    schedule 11.05.2016

iOS не обновляет screen.width & screen.height при изменении ориентации. Android не обновляет window.orientation при изменении.

Мое решение этой проблемы:

var isAndroid = /(android)/i.test(navigator.userAgent);

if(isAndroid)
{
    if(screen.width < screen.height){
        //portrait mode on Android
    }
} else {
    if(window.orientation == 0){
        //portrait mode iOS and other devices
    }
}

Вы можете обнаружить это изменение ориентации на Android, а также на iOS с помощью следующего кода:

var supportsOrientationChange = "onorientationchange" in window,
    orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";

window.addEventListener(orientationEvent, function() {
    alert("the orientation has changed");
}, false);

Если событие onorientationchange не поддерживается, привязкой к событию будет событие resize.

person Sandman    schedule 19.10.2016

Спасибо tobyodavies за то, что указали путь.

Чтобы получить предупреждающее сообщение, основанное на ориентации мобильного устройства, вам необходимо реализовать следующий скрипт в function setHeight() {

if(window.innerHeight > window.innerWidth){
    alert("Please view in landscape");
}
person Community    schedule 07.02.2011

Вместо 270 может быть -90 (минус 90).

person zeuf    schedule 14.07.2013

Это расширяет предыдущий ответ. Лучшее решение, которое я нашел, - создать безобидный атрибут CSS, который появляется только при выполнении медиа-запроса CSS3, а затем выполнить тест JS для этого атрибута.

Так, например, в CSS у вас будет:

@media screen only and (orientation:landscape)
{
    //  Some innocuous rule here
    body
    {
        background-color: #fffffe;
    }
}
@media screen only and (orientation:portrait)
{
    //  Some innocuous rule here
    body
    {
        background-color: #fffeff;
    }
}

Затем вы переходите к JavaScript (я использую jQuery для забавы). Объявление цвета может быть странным, поэтому вы можете использовать что-нибудь еще, но это самый надежный метод, который я нашел для его тестирования. Затем вы можете просто использовать событие изменения размера, чтобы отслеживать переключение. Сложите все вместе для:

function detectOrientation(){
    //  Referencing the CSS rules here.
    //  Change your attributes and values to match what you have set up.
    var bodyColor = $("body").css("background-color");
    if (bodyColor == "#fffffe") {
        return "landscape";
    } else
    if (bodyColor == "#fffeff") {
        return "portrait";
    }
}
$(document).ready(function(){
    var orientation = detectOrientation();
    alert("Your orientation is " + orientation + "!");
    $(document).resize(function(){
        orientation = detectOrientation();
        alert("Your orientation is " + orientation + "!");
    });
});

Лучшая часть этого заключается в том, что на момент написания этого ответа он, похоже, не оказал никакого влияния на интерфейсы рабочего стола, поскольку они (как правило) (кажется) не передают никаких аргументов для ориентации на страницу.

person Josh C    schedule 29.09.2015
comment
В качестве примечания, Windows 10 и Edge могут помочь в этом - я еще не проводил существенного тестирования на новой платформе, но, по крайней мере, сначала кажется, что он может предоставлять данные об ориентации в браузер. На его основе все еще можно создать свой сайт, но об этом определенно нужно знать. - person Josh C; 18.03.2016

Я использовал для Android Chrome «API ориентации экрана»

Чтобы посмотреть текущую ориентацию, вызовите console.log (screen.orientation.type) (и, возможно, screen.orientation.angle).

Результаты: портрет-начальный | портрет-средний | пейзаж первичный | пейзаж-вторичный

Ниже мой код, надеюсь, он будет вам полезен:

var m_isOrientation = ("orientation" in screen) && (typeof screen.orientation.lock == 'function') && (typeof screen.orientation.unlock == 'function');
...
if (!isFullscreen()) return;
screen.orientation.lock('landscape-secondary').then(
    function() {
        console.log('new orientation is landscape-secondary');
    },
    function(e) {
        console.error(e);
    }
);//here's Promise
...
screen.orientation.unlock();
  • Тестировал только для Android Chrome - ок
person Dmitry Sokolyuk    schedule 09.06.2016

Есть способ определить, перевел ли пользователь свое устройство в портретный режим, используя screen.orientation

Просто используйте приведенный ниже код:

screen.orientation.onchange = function () {
     var type = screen.orientation.type;
     if (type.match(/portrait/)) {
         alert('Please flip to landscape, to use this app!');
     }
}

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

person Naman    schedule 30.07.2016

Объект окна в JavaScript на устройствах iOS имеет свойство ориентации, которое можно использовать для определения поворота устройства. Ниже показаны значения window.orientation для устройств iOS (например, iPhone, iPad, iPod) в разных ориентациях.

Это решение также работает для устройств Android. Я проверил в родном браузере Android (Интернет-браузере) и в браузере Chrome даже в старых его версиях.

function readDeviceOrientation() {                      
    if (Math.abs(window.orientation) === 90) {
        // Landscape
    } else {
        // Portrait
    }
}
person Dmytro Medvid    schedule 13.09.2016

Это то, что я использую.

function getOrientation() {

    // if window.orientation is available...
    if( window.orientation && typeof window.orientation === 'number' ) {

        // ... and if the absolute value of orientation is 90...
        if( Math.abs( window.orientation ) == 90 ) {

              // ... then it's landscape
              return 'landscape';

        } else {

              // ... otherwise it's portrait
              return 'portrait';

        }

    } else {

        return false; // window.orientation not available

    }

}

Выполнение

window.addEventListener("orientationchange", function() {

     // if orientation is landscape...
     if( getOrientation() === 'landscape' ) {

         // ...do your thing

    }

}, false);
person CTE    schedule 06.04.2017
comment
В вашем коде есть ошибка: // если доступно window.orientation ... if (window.orientation && typeof window.orientation === 'number') {if in и не работает, если window.orientation = 0 - person Angelotti; 03.12.2020

Некоторые устройства не предоставляют событие orientationchange, но запускают событие изменения размера окна:

// Listen for resize changes
window.addEventListener("resize", function() {
    // Get screen size (inner/outerWidth, inner/outerHeight)

}, false);

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

person yadavr    schedule 03.10.2018

Следует отметить, что window.orientation вернет undefined, если вы не используете мобильное устройство. Итак, хорошая функция для проверки ориентации может выглядеть так, где x равно window.orientation:

//check for orientation
function getOrientation(x){
  if (x===undefined){
    return 'desktop'
  } else {
    var y;
    x < 0 ? y = 'landscape' : y = 'portrait';
    return y;
  }
}

Назовите это так:

var o = getOrientation(window.orientation);
window.addEventListener("orientationchange", function() {
  o = getOrientation(window.orientation);
  console.log(o);
}, false);
person Harry Stevens    schedule 19.10.2016

Или вы могли бы просто использовать это ..

window.addEventListener("orientationchange", function() {
    if (window.orientation == "90" || window.orientation == "-90") {
        //Do stuff
    }
}, false);
person Bradley    schedule 04.05.2017
comment
Лучше добавить window.orientation === 90 тест на равенство между числом и строкой не уверен. - person Melvynx; 04.05.2021

person    schedule
comment
к сожалению, не поддерживается Safari - person Jesper N; 01.06.2018

person    schedule
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, так как это снижает удобочитаемость как кода, так и пояснений! - person Goodbye StackExchange; 04.08.2016
comment
Этот ответ не решает проблему в исходном вопросе. Он показывает, как регистрировать изменения ориентации, но не показывает, как отображать сообщение только в одной конкретной ориентации. - person Julian; 05.08.2016