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


195

Я будую веб-сайт спеціально для мобільних пристроїв. Зокрема, є одна сторінка, яку найкраще переглядати в ландшафтному режимі.

Чи є спосіб виявити, чи користувач, який відвідує цю сторінку, переглядає її в портретному режимі, і якщо так, відобразити повідомлення, яке сповіщає користувача про те, що сторінку найкраще переглядати в альбомному режимі? Якщо користувач уже переглядає його в альбомному режимі, повідомлення не з’явиться.

Таким чином, я хочу, щоб сайт визначав орієнтацію вікна перегляду, якщо орієнтація - " Портрет" , а потім відображати попереджувальне повідомлення, яке радить користувачеві, що цю сторінку найкраще переглядати в ландшафтному режимі.

Відповіді:


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

jQuery Mobile має подію, яка обробляє зміну цього властивості ... якщо ви хочете попередити, якщо хтось обертається пізніше - orientationchange

Крім того, після деякого поглинання, перевірте window.orientation(що, на мою думку, вимірюється в градусах ...)


6
Ні, на жаль, ні. Однак такий сценарій спрацював: if (window.innerHeight> window.innerWidth) {alert ("Будь ласка, перегляньте пейзаж"); }
День

8
Я надмірно ускладнював проблему. Це чудово. Так просто.

77
На багатьох пристроях, коли відображається клавіатура, наявна ширина буде більшою за висоту, неправильно надаючи пейзажну орієнтацію.
П’єр

1
Це не працює, якщо поєднується з orientationchangeподією. Він покаже стару орієнтацію замість нової орієнтації. Ця відповідь добре поєднується з orientationchangeподією.
Дональд Дак


163

Ви також можете використовувати те 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.


3
Підтримка цієї функції хоч і слабка: caniuse.com/#feat=matchmedia
Ashitaka

2
У Firefox для Android працює належним чином лише після готовності до мене DOM події.
Інверсія

13
Підтримка цього набагато сильніша. Це здається набагато більш надійною відповіддю тепер, ніж прийняте.
JonK

2
Остерігайтеся цього з цим (посилання) розчин stackoverflow.com/questions/8883163 / ...
dzv3

2
Це правильна відповідь зараз. Ця функція має повну підтримку всіх відповідних браузерів.
Телярій

97

Девід Уолш має кращий і точніший підхід.

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


2
На Nexus 10, і я не знаю про інші планшети Android 10 ", значення зворотні. Тобто 0 повертається, коли пристрій знаходиться в пейзажному режимі, а не в портреті. Відповідь tobyodavies вище, здається, працює добре, хоча на всіх пристроях я" перевірений
Натан

8
Орієнтація 0 задається як "природна" орієнтація пристрою, і, таким чином, залежить від постачальника. Це може бути портрет або пейзаж ...
П'єр,

на ipad в iframe нічого не сповістив
Дарій.V

2
це не гарне рішення для виявлення орієнтації мода пристрою. Оскільки вони повертають значення залежать від природної орієнтації пристрою. Приклад для Samsung 7 'на портретному планшеті повернути 90, але на Nexus 4 для портретного вони повертаються 0.
Dexter_ns88

3
На цьому посиланні: notes.matthewgifford.com/… Автор демонструє різні пристрої різних виробників по-різному трактує, що таке пейзаж та портрет. Звідси різні зареєстровані значення, на які ви реально не можете покластися.
Неонова війна

36

Ви можете використовувати CSS3:

@media screen and (orientation:landscape)
{
   body
   {
      background: red;
   }
}

Найкраща відповідь мені, тому що вам не потрібен слухач для зміни орієнтації. Хоча я поєдную його з модернізатором, щоб виявити, чи це сенсорний пристрій, оскільки це не має сенсу на екранах робочого столу чи ноутбука. Все ще не нормально для таких екранів З сенсорними можливостями ...
Esger

4
Не пов’язаний з JavaScript. ОП потребує рішення Javascript.
easwee

10
Ні, він хоче відобразити повідомлення, ви можете використовувати display: none then display: block, щоб щось відобразити.
Томас Деко

2
Яка підтримка для цієї перевірки CSS?
ChrisF

1
Я не знаю, але я не знайшов мобільний, який би його не підтримував. Крім того, здається, зламаний на старому Android, коли клавіатура відображається іноді запускається медіа-запит.
Томас Деко

21

Наприклад, це кілька способів:

  • Перевірте window.orientationзначення
  • Порівняйте innerHeightvs.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);
    });
});

10

Я думаю, що більш стабільним рішенням є використання екрана замість вікна, оскільки це може бути і пейзаж, або портрет, якщо ви зміните розмір вікна свого браузера на настільному комп’ютері.

if (screen.height > screen.width){
    alert("Please use Landscape!");
}

Це працює в IE 10, Firefox 23 та Chrome 29 (усі браузери на робочому столі).
Якоб Дженков

1
Усі основні браузери підтримують його. IE 7 також
artnikpro

не стандартний, хоча: developer.mozilla.org/en-US/docs/Web/API/…
fjsj

@Duncan No. Це працює на мобільному пристрої. Це досить старий метод, і він підтримується на старих браузерах сафарі та android. З сітківкою це може бути не дуже точно, але для виявлення орієнтації огляду слід добре працювати
artnikpro

1
@artnikpro Я перевірив це вчора, і, здається, Safari повертає фізичні розміри екрана, нехтуючи орієнтацією. Отже, ширина екрана - це завжди фізична ширина екрана.
Дункан Хогган

9

Для того, щоб застосувати всі ці чудові коментарі до мого щоденного кодування, для наступності між усіма моїми програмами, я вирішив використати наступне у моєму коді 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");
  }
}


5

Після деяких експериментів я виявив, що обертання пристрою, орієнтованого на орієнтацію, завжди викликає resizeподії вікна браузера . Тож у вашому оброблювачі розміру просто викликайте функцію, наприклад:

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

1
Дивіться вище, чому пейзаж 90 => не те, на що можна покластися на різних пристроях.
ChrisF

5

Я поєднав два рішення, і це прекрасно працює для мене.

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

5

Я не згоден з найбільш голосовою відповіддю. Використовуйте screenі ніwindow

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

Це правильний спосіб зробити це. Якщо ви розраховуєтесь window.height, у вас виникнуть проблеми на Android. Коли клавіатура відкрита, вікно скорочується. Тому використовуйте екран замість вікна.

Відповідь screen.orientation.typeхороша, але з IE. https://caniuse.com/#search=screen.orientation


4

Отримайте орієнтацію (у будь-який час у своєму js-коді) через

window.orientation

Коли ви window.orientationповертаєтесь 0або 180тоді ви перебуваєте в портретному режимі , при поверненні 90або 270тоді ви перебуваєте в ландшафтному режимі .


1
Але він не повертається 270, але повертає -90.
Феліпе Кореа

@FelipeCorrea Відповідь 2 роки!
Sliq

2
Я уточнював, щоб зробити його дійсним для нових відвідувачів. Це допомогло мені btw.
Феліпе Кореа

window.orientation засуджується
Jonny

4

Тільки 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; } 
};

1
Я знаю, що цього не маю, але мені потрібно було сказати подяку за це, це чудове рішення.
FalsePozitive


2
//see also http://stackoverflow.com/questions/641857/javascript-window-resize-event
//see also http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html
/*
Be wary of this:
While you can just hook up to the standard window resize event, you'll find that in IE, the event is fired once for every X and once for every Y axis movement, resulting in a ton of events being fired which might have a performance impact on your site if rendering is an intensive task.
*/

//setup 
window.onresize = function(event) {
    window_resize(event);
}

//timeout wrapper points with doResizeCode as callback
function window_resize(e) { 
     window.clearTimeout(resizeTimeoutId); 
     resizeTimeoutId = window.setTimeout('doResizeCode();', 10); 
}

//wrapper for height/width check
function doResizeCode() {
    if(window.innerHeight > window.innerWidth){
        alert("Please view in landscape");
    }
}

2

ще одна альтернатива визначення орієнтації, заснована на порівнянні ширини / висоти:

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

Ви використовуєте його у події "зміни розміру":

window.addEventListener("resize", function() { ... });

2

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подія.


2

Якщо у вас найновіші браузери, то це window.orientationможе не працювати. У цьому випадку використовуйте наступний код для отримання кута -

var orientation = window.screen.orientation.angle;

Це все ще експериментальна технологія, ви можете перевірити сумісність браузера тут


1

Завдяки tobyodavies за керівництво дорогою.

Щоб досягти повідомлення попередження на основі орієнтації мобільного пристрою, вам потрібно реалізувати наступний скрипт у програмі function setHeight() {

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


1

Це пояснюється попередньою відповіддю. Найкраще рішення, яке я знайшов, - це зробити нешкідливий атрибут 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 + "!");
    });
});

Найкращою мірою є те, що на момент написання цієї відповіді, схоже, це не впливає на інтерфейси робочого столу, оскільки вони (як правило) не передають жодного аргументу для орієнтації на сторінку.


Як на замітку, Windows 10 і Edge, можливо, кидають гайковий ключ - я ще не робив серйозних тестів на новій платформі, але, принаймні, спочатку здається, що, можливо, вона надає дані орієнтації в браузер. Ще можна створити свій сайт навколо нього, але це, безумовно, щось, про що слід пам’ятати.
Джош C

1

Ось найкращий метод, який я знайшов, базуючись на статті Девіда Уолша (« Виявити зміну орієнтації на мобільних пристроях» )

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") }

1

Я використовував для Android Chrome "API орієнтації на екран"

Подивитись поточну орієнтацію виклику console.log (screen.orientation.type) (і, можливо, екран.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 - добре

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

Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Будь ласка, намагайтеся не переповнювати ваш код пояснювальними коментарями, оскільки це зменшує читабельність і коду, і пояснень!
Goodbye StackExchange

Ця відповідь не вирішує проблему в оригінальному питанні. Він показує, як реєструвати зміни орієнтації, але не показує, як відображати повідомлення лише в одній конкретній орієнтації.
Джуліан

1

Об'єкт вікна в JavaScript на пристроях iOS має властивість орієнтації, яку можна використовувати для визначення обертання пристрою. Далі показано значення window.orientation для пристроїв iOS (наприклад, iPhone, iPad, iPod) в різних напрямках.

Це рішення також працює і для андроїд-пристроїв. Я перевірив андроїд в домашньому браузері (Інтернет-браузері) та в браузері Chrome, навіть у старих версіях.

function readDeviceOrientation() {                      
    if (Math.abs(window.orientation) === 90) {
        // Landscape
    } else {
        // Portrait
    }
}

1

Це те, що я використовую.

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);

0
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Rotation Test</title>
  <link type="text/css" href="css/style.css" rel="stylesheet"></style>
  <script src="js/jquery-1.5.min.js" type="text/javascript"></script>
  <script type="text/javascript">
        window.addEventListener("resize", function() {
            // Get screen size (inner/outerWidth, inner/outerHeight)
            var height = $(window).height();
            var width = $(window).width();

            if(width>height) {
              // Landscape
              $("#mode").text("LANDSCAPE");
            } else {
              // Portrait
              $("#mode").text("PORTRAIT");
            }
        }, false);

  </script>
 </head>
 <body onorientationchange="updateOrientation();">
   <div id="mode">LANDSCAPE</div>
 </body>
</html>

0

Існує спосіб, за допомогою якого можна визначити, чи користувач перевів свій пристрій у портретний режим, використовуючи 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його звільнять, коли користувач переверне пристрій, і сповіщення з’явиться, коли користувач використовує портретний режим.


0

Варто зазначити одне 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);

0

Або ви могли просто скористатися цим ..

window.addEventListener("orientationchange", function() {
    if (window.orientation == "90" || window.orientation == "-90") {
        //Do stuff
    }
}, false);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.