Yönlendirme, kullanıcıya talimatları bildiren Dikey ekran uyarı mesajı ise görünüm alanı yönlendirmesini algılama


195

Özellikle mobil cihazlar için bir web sitesi yapıyorum. Özellikle en iyi yatay modda görüntülenen bir sayfa vardır.

Bu sayfayı ziyaret eden kullanıcının Sayfayı Dikey modda görüntüleyip görüntülemediğini tespit etmenin bir yolu var mı? Kullanıcı zaten yatay modda görüntülüyorsa, hiçbir mesaj görünmez.

Temel olarak, sitenin görünüm yönü yönünü algılamasını istiyorum, eğer yön Dikey ise , kullanıcıya bu sayfanın en iyi Manzara modunda görüntülendiğini bildiren bir uyarı mesajı görüntüler .

Yanıtlar:


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

jQuery Mobile, bu özelliğin değiştirilmesini sağlayan bir olaya sahiptir ... eğer biri daha sonra dönerse uyarmak istiyorsanız - orientationchange

Ayrıca, biraz googling yaptıktan sonra, kontrol edin window.orientation(bu derece olarak ölçüldüğüne inanıyorum ...)


6
Hayır, maalesef değil. Ancak, aşağıdaki komut dosyası işe yaradı: if (window.innerHeight> window.innerWidth) {alert ("Lütfen manzarada görüntüleyin"); }
Dan

8
Sorunu aşırı derecede karmaşıklaştırıyordum. Bu harika. Çok basit.

77
Birçok cihazda, klavye gösterildiğinde, availableWidth yükseklikten daha büyük olur ve yanlış yatay yönlendirme verir.
Pierre

1
orientationchangeEtkinlikle birleştirilirse bu çalışmaz . Yeni yönlendirme yerine eski yönü gösterecektir. Bu cevaporientationchange etkinlikle birlikte iyi çalışır .
Donald Duck

2
window.orientation geliştirildi
.mozilla.org/tr

163

Ayrıca window.matchMedia, CSS sözdizimine çok benzediği için kullandığım ve tercih ettiğim:

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

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

İPad 2'de test edildi.


3
Bu özellik için destek biraz zayıf olsa da: caniuse.com/#feat=matchmedia
Ashitaka

2
Android için Firefox'ta benim için DOM için hazır etkinlikten sonra düzgün çalışıyor.
İnversiyon

13
Bunun için destek artık çok daha güçlü. Bu, kabul edilen yanıttan çok daha sağlam bir yanıt gibi görünüyor.
JonK

2
Bu (bağlantı) çözüm ile buna dikkat edin stackoverflow.com/questions/8883163/…
dzv3

2
Şimdi doğru cevap bu. Bu özellik, ilgili tüm tarayıcılar için tam desteğe sahiptir.
Telarian

97

David Walsh'un daha iyi ve noktaya yaklaşımı var.

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

Bu değişiklikler sırasında window.orientation özelliği değişebilir. 0 değeri dikey görünüm, -90 ise cihazın sağa döndürülmüş yatay, 90 değeri ise cihazın sola döndürülmüş yatay olduğu anlamına gelir.

http://davidwalsh.name/orientation-change


2
Nexus 10'da ve diğer Android 10 "tabletleri hakkında bir şey bilmiyorum, değerler geri döndü. Ie 0, cihaz dikey değil, yatay konumdayken döndürülür. ve test edildi
Nathan

8
Yönelim 0, aygıtın "doğal" yönelimi olarak verilir ve dolayısıyla satıcıya bağlıdır. Portre veya manzara olabilir ...
Pierre

iframe ipad üzerinde hiçbir şey
uyarmadı

2
bu, cihazın yönlendirme modunu saptamak için iyi bir çözüm değildir. Çünkü değer geri döner, doğal cihaz yönüne bağlıdır. Samsung 7 'tablet portre görünümü 90 için örnek, ancak portre için nexus 4'te 0 döndürürler.
Dexter_ns88

3
Bu bağlantıda: notes.matthewgifford.com/… Yazar, farklı üreticilerin farklı cihazlarının manzara ve portre ile ilgili farklı yorumlarına sahiptir. Bu nedenle, gerçekten güvenemeyeceğiniz farklı raporlanan değerler.
Neon Warge

36

CSS3'ü kullanabilirsiniz:

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

Bana en iyi cevap, çünkü değişen yön için bir dinleyiciye ihtiyacınız yok. Bir dokunmatik cihaz olup olmadığını tespit etmek için modernizr ile birleştirmeme rağmen, masaüstü veya dizüstü bilgisayar ekranlarında hiçbir anlam ifade etmiyor. Dokunmatik yetenekleri olan bu ekranlar için hala iyi değil ...
Esger

4
Javascript ile ilgili değil. OP javascript çözümüne ihtiyaç duyar.
easwee

10
Hayır, bir mesaj görüntülemek istiyor, ekran: hiçbirini görüntülemek için display: block komutunu kullanabilirsiniz.
Thomas Decaux

2
Bu CSS kontrolü için destek nasıldır?
ChrisF

1
Bilmiyorum, ama desteklemeyen bir cep telefonu bulamadım. Ayrıca klavye bazen medya sorgusu tetiklendiğinde eski Android'de bozuk görünüyor.
Thomas Decaux

21

Bunu yapmanın birkaç yolu vardır, örneğin:

  • window.orientationDeğeri kontrol et
  • Karşılaştır innerHeightvs.innerWidth

Aşağıdaki yöntemlerden birini uyarlayabilirsiniz.


Cihazın dikey modda olup olmadığını kontrol edin

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

Cihazın yatay modda olup olmadığını kontrol edin

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

Örnek kullanım

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

Yön değişikliğini nasıl tespit edebilirim?

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

10

Bence daha istikrarlı bir çözüm pencere yerine ekranı kullanmaktır, çünkü tarayıcı pencerenizi masaüstü bilgisayarda yeniden boyutlandırırsanız hem yatay hem de dikey olabilir.

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

Bu, IE 10, Firefox 23 ve Chrome 29'da (tüm masaüstü tarayıcılarında) çalışır.
Jakob Jenkov

1
Tüm büyük tarayıcılar bunu destekler. IE 7 de
artnikpro


@Duncan Hayır. Mobil cihazlarda çalışır. Oldukça eski bir yöntemdir ve eski safari ve android tarayıcılarda desteklenir. Retina ile çok doğru olmayabilir, ancak görünüm yönünü tespit etmek için iyi çalışmalıdır
artnikpro

1
@artnikpro Dün test ettim ve Safari'nin oryantasyonu ihmal eden fiziksel ekran boyutlarını döndürdüğü anlaşılıyor. Yani screen.width her zaman ekranın fiziksel genişliğidir.
Duncan Hoggan

9

Tüm bu harika yorumları günlük koduma uygulamak için, tüm uygulamalarım arasında süreklilik için, hem jquery hem de jquery mobil kodumda aşağıdakileri kullanmaya karar verdim.

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

Bazı deneylerden sonra, yönlendirmeye duyarlı bir cihazın döndürülmesinin her zaman bir tarayıcı penceresinin resizeolayını tetikleyeceğini buldum . Yeniden boyutlandırma işleyicinizde basitçe aşağıdaki gibi bir işlev çağırın:

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

1
Neden 90 => manzara'nın farklı cihazlarda güvenebileceğiniz bir şey olmadığını görün.
ChrisF

5

İki çözümü birleştirdim ve benim için iyi çalışıyor.

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

5

En çok oy alan cevaba katılmıyorum. Kullan screenve değilwindow

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

Bunu yapmanın doğru yolu. window.heightİle hesaplarsanız , Android'de sorun yaşarsınız. Klavye açıkken pencere daralır. Yani pencere yerine ekranı kullanın.

screen.orientation.typeİyi bir cevap ama IE ile olduğunu. https://caniuse.com/#search=screen.orientation


4

(Js kodunuzda istediğiniz zaman) yönlendirmeyi alın

window.orientation

Ne zaman window.orientationdöner 0veya 180sonra olan dikey modda döndürürken, 90ya 270sonra bulunduğunuz yatay modda .


1
270 döndürmez, -90 döndürür.
Felipe Correa

@FelipeCorrea Cevap 2 yaşında!
Sliq

2
Yeni ziyaretçiler için geçerli kılmak için netleştiriyordum. Bana btw yardımcı oldu.
Felipe Correa

window.orientation kullanımdan kaldırıldı
Jonny

4

Yalnızca 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;
  }
}

Bazı durumlarda, ziyaretçi cihazı döndürdükten sonra sayfaya yeniden yüklemek için küçük bir kod parçası eklemek isteyebilirsiniz, böylece CSS düzgün şekilde işlenir:

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

1
Yapmamam gerektiğini biliyorum ama bunun için teşekkür etmek zorundaydım, bu harika bir çözüm.
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

genişlik / yükseklik karşılaştırmasına dayalı olarak yönlendirmeyi belirlemek için başka bir alternatif:

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

Bunu "resize" etkinliğinde kullanırsınız:

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

2

iOS , yön değiştiğinde screen.widthve güncellenmediğinde screen.height. Android window.orientationdeğiştiğinde güncellenmez .

Bu soruna benim çözümüm:

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'de ve iOS'taki yönelimdeki bu değişikliği aşağıdaki kodla tespit edebilirsiniz:

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

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

Eğer onorientationchangeolay desteklenmez, etkinlik olacak bağlı resizebir olay.


2

En son tarayıcılara sahipseniz window.orientationçalışmayabilir. Bu durumda açı elde etmek için aşağıdaki kodu kullanın -

var orientation = window.screen.orientation.angle;

Bu hala deneysel bir teknolojidir, tarayıcı uyumluluğunu buradan kontrol edebilirsiniz


1

Tobyodavies yol rehberlik için teşekkür ederiz.

Mobil cihazın yönüne göre bir uyarı mesajı elde etmek için, aşağıdaki komut dosyasını function setHeight() {

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


1

Bu, önceki bir cevabı genişletir. Bulduğum en iyi çözüm, yalnızca bir CSS3 medya sorgusu karşılandığında görünen ve daha sonra bu özellik için JS testine sahip olan, zararsız bir CSS özelliği yapmaktır.

Örneğin, CSS'de:

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

Daha sonra JavaScript'e gidin (eğlenceler için jQuery kullanıyorum). Renk bildirimleri garip olabilir, bu yüzden başka bir şey kullanmak isteyebilirsiniz, ancak bu test etmek için bulduğum en kusursuz yöntemdir. Daha sonra anahtarlamayı almak için resize olayını kullanabilirsiniz. Hepsini bir araya getirin:

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

Bunun en iyi yanı, bu yanıtı yazdığımdan beri, masaüstü arayüzleri üzerinde herhangi bir etkisi olmadığı, çünkü (genellikle) sayfaya yönlendirme için herhangi bir argüman iletmedikleri (görünmedikleri).


Bir not olarak, Windows 10 ve Edge buna bir anahtar atıyor olabilir - Yeni platformda henüz önemli bir test yapmadım, ancak en azından başlangıçta, tarayıcıya yönlendirme verileri sağlıyor gibi görünüyor. Sitenizi bunun etrafında oluşturmak hala mümkündür, ancak kesinlikle farkında olmanız gereken bir şeydir.
Josh C

1

İşte David Walsh'ın maddeye dayalı buldum en iyi yöntem, var ( Mobil Cihazlarda Oryantasyon Değiştir Algılama )

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

Açıklama:

Window.matchMedia () , bir medya sorgu kuralı tanımlamanıza ve geçerliliğini herhangi bir zamanda kontrol etmenize olanak tanıyan yerel bir yöntemdir.

onchangeBu yöntemin dönüş değerine bir dinleyici iliştirmeyi yararlı buluyorum . Misal:

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

1

Android Chrome "Ekran Yönlendirme API'sı" için kullandım

Geçerli yönlendirmeye bakmak için console.log (screen.orientation.type) (ve belki screen.orientation.angle) öğesini arayın.

Sonuçlar: portre-birincil | ikincil portre | peyzaj-birincil | Yatay sekonder

Kodumu aşağıda, umarım faydalı olacaktır:

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();
  • Yalnızca Android Chrome için test ettim - tamam

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

Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen hem kodun hem de açıklamaların okunabilirliğini azalttığı için kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın!
Hoşçakal StackExchange

Bu cevap orijinal sorudaki sorunu çözmez. Yön değişikliklerinin nasıl günlüğe kaydedileceğini gösterir, ancak bir iletinin yalnızca belirli bir yönde nasıl görüntüleneceğini göstermez.
Julian

1

İOS aygıtlarındaki JavaScript'teki pencere nesnesinin, aygıtın dönüşünü belirlemek için kullanılabilecek bir yönlendirme özelliği vardır. Aşağıda değerler penceresi gösterilmektedir. İOS aygıtları (örneğin iPhone, iPad, iPod) için farklı yönlerde yönlendirme.

Bu çözüm aynı zamanda android cihazlar için de çalışır. Android yerel tarayıcısını (İnternet tarayıcısı) ve Chrome tarayıcısında, eski sürümlerinde bile kontrol ettim.

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

1

Ben bunu kullanıyorum.

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

    }

}

uygulama

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

Kullanıcının cihazını kullanarak portre moduna çevirip çevirmediğini tespit etmenin bir yolu vardır. screen.orientation

Sadece aşağıdaki kodu kullanın:

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

Şimdi, onchangekullanıcı cihazı çevirdiğinde tetiklenir ve kullanıcı portre modunu kullandığında uyarı açılır.


0

Dikkat edilmesi gereken bir şey , bir mobil cihazda değilseniz window.orientationgeri döneceğidir undefined. Yönlendirme için kontrol etmek iyi işlev şöyle görünebilir Peki, nerede xolduğunu window.orientation:

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

Öyle söyle:

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

0

Ya da sadece bunu kullanabilirsiniz ..

window.addEventListener("orientationchange", function() {
    if (window.orientation == "90" || window.orientation == "-90") {
        //Do stuff
    }
}, false);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.