Rileva l'orientamento del viewport, se l'orientamento è un messaggio di avviso con visualizzazione verticale che avvisa l'utente delle istruzioni


195

Sto costruendo un sito Web appositamente per dispositivi mobili. C'è una pagina in particolare che è meglio visualizzata in modalità orizzontale.

Esiste un modo per rilevare se l'utente che visita quella pagina la sta visualizzando in modalità Ritratto e, in tal caso, visualizzare un messaggio che informa l'utente che la pagina è visualizzata al meglio in modalità orizzontale? Se l'utente lo sta già visualizzando in modalità orizzontale, non verrà visualizzato alcun messaggio.

Quindi, fondamentalmente, voglio che il sito rilevi l'orientamento del viewport, se l'orientamento è Verticale , quindi visualizzo un messaggio di avviso che avvisa l'utente che questa pagina è meglio visualizzata in modalità orizzontale .

Risposte:


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

jQuery Mobile ha un evento che gestisce la modifica di questa proprietà ... se vuoi avvisare se qualcuno ruota più tardi - orientationchange

Inoltre, dopo alcuni googling, controlla window.orientation(che credo sia misurato in gradi ...)


6
No, sfortunatamente no. Tuttavia, il seguente script ha funzionato: if (window.innerHeight> window.innerWidth) {alert ("Si prega di visualizzare in orizzontale"); }
Dan,

8
Stavo complicando troppo il problema. Questo è fantastico Così semplice.

77
Su molti dispositivi, quando viene visualizzata la tastiera, la larghezza disponibile sarà maggiore dell'altezza, fornendo erroneamente l'orientamento orizzontale.
Pierre,

1
Questo non funziona se combinato con l' orientationchangeevento. Mostrerà il vecchio orientamento invece del nuovo orientamento. Questa risposta funziona bene combinata con l' orientationchangeevento.
Donald Duck,


163

Puoi anche usare window.matchMedia, che io uso e preferisco in quanto assomiglia molto alla sintassi CSS:

if (window.matchMedia("(orientation: portrait)").matches) {
   // you're in PORTRAIT mode
}

if (window.matchMedia("(orientation: landscape)").matches) {
   // you're in LANDSCAPE mode
}

Testato su iPad 2.


3
Il supporto per questa funzione è piuttosto debole: caniuse.com/#feat=matchmedia
Ashitaka,

2
In Firefox per Android funziona correttamente solo dopo l'evento DOM pronto per me.
Inversione,

13
Il supporto per questo è molto più forte ora. Questa sembra essere una risposta molto più solida ora di quella accettata.
JonK,

2
Attenzione di questo con questo (link) soluzione stackoverflow.com/questions/8883163/...
dzv3

2
Questa è la risposta corretta ora. Questa funzione ha il pieno supporto per tutti i browser rilevanti.
Telarian,

97

David Walsh ha un approccio migliore e mirato.

// Listen for orientation changes
window.addEventListener("orientationchange", function() {
  // Announce the new orientation number
  alert(window.orientation);
}, false);

Durante queste modifiche, la proprietà window.orientation potrebbe cambiare. Un valore pari a 0 indica la vista verticale, -90 indica che il dispositivo è ruotato in orizzontale verso destra e 90 indica che il dispositivo è ruotato in orizzontale verso sinistra.

http://davidwalsh.name/orientation-change


2
Sul Nexus 10 e non conosco altri tablet Android 10 ", i valori sono all'indietro. Ie 0 viene restituito quando il dispositivo è in orizzontale, non in verticale. La risposta di tobyodavies sopra sembra funzionare bene anche se su tutti i dispositivi che ho testato
Nathan il

8
L'orientamento 0 è considerato l'orientamento "naturale" del dispositivo e quindi dipende dal fornitore. Potrebbe essere ritratto o paesaggio ...
Pierre,

su ipad in iframe non ha avvisato nulla
Darius.V

2
questa non è una buona soluzione per la mod orientamento del rilevamento del dispositivo. Perché restituiscono valore dipende dall'orientamento naturale del dispositivo. Esempio sulla vista
verticale del

3
Su questo link: notes.matthewgifford.com/… L'autore mostra diversi dispositivi di diversi produttori che hanno una diversa interpretazione di ciò che è paesaggio e ritratto. Da qui diversi valori segnalati, su cui non puoi davvero fare affidamento.
Neon Warge,

36

Puoi usare CSS3:

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

La migliore risposta per me, perché non è necessario un ascoltatore per l'orientamento modificato. Anche se lo combino con modernizr per rilevare se si tratta di un dispositivo touch, dal momento che non ha senso sugli schermi desktop o laptop. Ancora non va bene per tali schermi CON funzionalità touch ...
Esger,

4
Non correlato a JavaScript. OP ha bisogno di una soluzione JavaScript.
Easwee,

10
No, vuole visualizzare un messaggio, puoi usare display: none quindi display: block per visualizzare qualcosa.
Thomas Decaux,

2
Com'è il supporto per questo controllo CSS?
ChrisF,

1
Non lo so, ma non ho trovato un cellulare che non lo supporta. Inoltre sembra rotto sul vecchio Android, quando a volte viene visualizzata la tastiera viene avviata la query multimediale.
Thomas Decaux,

21

Esistono alcuni modi per farlo, ad esempio:

  • Dai un'occhiata window.orientation valore
  • Confronta innerHeightvs.innerWidth

Puoi adattare uno dei metodi di seguito.


Controlla se il dispositivo è in modalità verticale

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

Controlla se il dispositivo è in modalità orizzontale

function isLandscape() {
    return (window.orientation === 90 || window.orientation === -90);
}

Esempio di utilizzo

if (isPortrait()) {
    alert("This page is best viewed in landscape mode");
}

Come posso rilevare il cambio di orientamento?

$(document).ready(function() {
    $(window).on('orientationchange', function(event) {
        console.log(orientation);
    });
});

10

Penso che la soluzione più stabile sia usare lo schermo anziché la finestra, perché potrebbe essere sia orizzontale che verticale se ridimensionerai la finestra del tuo browser sul computer desktop.

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

Funziona con IE 10, Firefox 23 e Chrome 29 (tutti i browser desktop).
Jakob Jenkov,

1
Tutti i principali browser lo supportano. Anche IE 7
artnikpro


@Duncan No. Funziona su dispositivi mobili. È un metodo piuttosto vecchio ed è supportato su vecchi browser Safari e Android. Potrebbe non essere molto preciso con la retina ma per rilevare l'orientamento del viewport dovrebbe funzionare bene
artnikpro

1
@artnikpro L'ho provato ieri e sembra che Safari restituisca le dimensioni fisiche dello schermo trascurando l'orientamento. Quindi screen.width è sempre la larghezza fisica dello schermo.
Duncan Hoggan,

9

Al fine di applicare tutti questi grandi commenti al mio codice quotidiano, per la continuità tra tutte le mie applicazioni, ho deciso di utilizzare quanto segue sia nel mio codice mobile jquery che 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

Dopo alcuni esperimenti ho scoperto che la rotazione di un dispositivo orientato all'orientamento attiverà sempre l' resizeevento di una finestra del browser . Quindi nel tuo gestore di ridimensionamento chiama semplicemente una funzione come:

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

1
Vedi sopra perché 90 => landscape non è qualcosa su cui puoi fare affidamento su diversi dispositivi.
ChrisF,

5

Ho combinato due soluzioni e funziona bene per me.

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

5

Non sono d'accordo con la risposta più votata. Usa screene nonwindow

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

È il modo corretto di farlo. Se calcoli con window.height, avrai problemi su Android. Quando la tastiera è aperta, la finestra si restringe. Quindi usa lo schermo anziché la finestra.

Il screen.orientation.typeè una buona risposta, ma con IE. https://caniuse.com/#search=screen.orientation


4

Ottieni l'orientamento (in qualsiasi momento nel tuo codice js) tramite

window.orientation

Quando window.orientationritorna 0o 180poi sei in modalità verticale , quando ritorni 90o 270poi sei in modalità orizzontale .


1
Tuttavia non restituisce 270, restituisce -90.
Felipe Correa,

@FelipeCorrea La risposta ha 2 anni!
Sliq,

2
Stavo chiarendo di renderlo valido per i nuovi visitatori. Mi ha aiutato a proposito.
Felipe Correa,

window.orientation è deprecato
Jonny il

4

Solo 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;
  }
}

In alcuni casi potresti voler aggiungere un piccolo pezzo di codice per ricaricare la pagina dopo che il visitatore ha ruotato il dispositivo, in modo che il CSS sia reso correttamente:

window.onorientationchange = function() { 
    var orientation = window.orientation; 
        switch(orientation) { 
            case 0:
            case 90:
            case -90: window.location.reload(); 
            break; } 
};

1
So che non dovrei, ma ho dovuto dire grazie per questo, è un'ottima soluzione.
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

un'altra alternativa per determinare l'orientamento, in base al confronto di larghezza / altezza:

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

Lo usi sull'evento "ridimensiona":

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

2

iOS non si aggiorna screen.widthe screen.heightquando l'orientamento cambia. Android non si aggiorna window.orientationquando cambia.

La mia soluzione a questo problema:

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

Puoi rilevare questo cambiamento di orientamento su Android e iOS con il seguente codice:

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

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

Se l' onorientationchangeevento non è supportato, l'evento associato sarà l' resizeevento.


2

Se disponi degli ultimi browser, window.orientationpotrebbe non funzionare. In tal caso, utilizzare il seguente codice per ottenere l'angolo:

var orientation = window.screen.orientation.angle;

Questa è ancora una tecnologia sperimentale, puoi verificare la compatibilità del browser qui


1

Grazie a tobyodavies per aver guidato la strada.

Per ottenere un messaggio di avviso basato sull'orientamento del dispositivo mobile, è necessario implementare il seguente script all'interno di function setHeight() {

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

1

Invece di 270, può essere -90 (meno 90).


1

Questo si espande su una risposta precedente. La migliore soluzione che ho trovato è creare un innocuo attributo CSS che appare solo se viene soddisfatta una query media CSS3 e quindi avere il test JS per quell'attributo.

Ad esempio, nel CSS avresti:

@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;
    }
}

Quindi vai su JavaScript (sto usando jQuery per i fanatici). Le dichiarazioni di colore possono essere strane, quindi potresti voler usare qualcos'altro, ma questo è il metodo più sicuro che ho trovato per testarlo. È quindi possibile utilizzare l'evento di ridimensionamento per riprendere il passaggio. Metti tutto insieme per:

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 + "!");
    });
});

La parte migliore di questo è che dal momento in cui scrivo questa risposta, non sembra avere alcun effetto sulle interfacce desktop, poiché (generalmente) non (sembrano) passare alcun argomento per l'orientamento alla pagina.


Come nota, Windows 10 e Edge potrebbero lanciare una chiave in questo: non ho ancora fatto test sostanziali sulla nuova piattaforma, ma almeno inizialmente, sembra che potrebbe fornire dati di orientamento al browser. È ancora possibile costruire il tuo sito attorno ad esso, ma è sicuramente qualcosa di cui essere consapevoli.
Josh C

1

Ecco il metodo migliore che ho trovato, basato sull'articolo di David Walsh ( Rileva cambiamenti di orientamento su dispositivi mobili )

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

Spiegazione:

Window.matchMedia () è un metodo nativo che consente di definire una regola di query multimediale e verificarne la validità in qualsiasi momento.

Trovo utile collegare un onchangeascoltatore al valore di ritorno di questo metodo. Esempio:

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

1

Ho usato per Android Chrome "L'API di orientamento dello schermo"

Per guardare l'orientamento attuale, chiama console.log (screen.orientation.type) (e forse screen.orientation.angle).

Risultati: ritratto-primario | ritratto secondario | paesaggio primario | paesaggio-secondaria

Di seguito è il mio codice, spero che sarà utile:

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();
  • Ho testato solo per Android Chrome - ok

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

Mentre questo frammento di codice può risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non aggiungere il tuo codice a commenti esplicativi, in quanto ciò riduce la leggibilità sia del codice che delle spiegazioni!
Arrivederci StackExchange il

Questa risposta non risolve il problema nella domanda originale. Mostra come registrare le modifiche all'orientamento, ma non mostra come visualizzare un messaggio solo con un orientamento particolare.
Giuliano

1

L'oggetto finestra in JavaScript sui dispositivi iOS ha una proprietà di orientamento che può essere utilizzata per determinare la rotazione del dispositivo. Quanto segue mostra i valori window.orientation per dispositivi iOS (ad es. IPhone, iPad, iPod) con diversi orientamenti.

Questa soluzione funziona anche per i dispositivi Android. Ho controllato nel browser nativo Android (browser Internet) e nel browser Chrome, anche nelle versioni precedenti.

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

1

Questo è quello che uso.

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

    }

}

Implementazione

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

C'è un modo in cui puoi rilevare se l'utente ha portato il proprio dispositivo in modalità verticale usando screen.orientation

Basta usare il seguente codice:

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

Ora, onchangeverrà attivato quando l'utente lancia il dispositivo e verrà visualizzato un avviso quando l'utente utilizza la modalità ritratto.


0

Una cosa da notare window.orientationè che tornerà undefinedse non si è su un dispositivo mobile. Quindi una buona funzione per verificare l'orientamento potrebbe apparire così, dove si xtrova window.orientation:

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

Chiamalo così:

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

0

O potresti semplicemente usare questo ..

window.addEventListener("orientationchange", function() {
    if (window.orientation == "90" || window.orientation == "-90") {
        //Do stuff
    }
}, false);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.