방향이 세로 디스플레이 경고 메시지 인 경우 사용자에게 지침을 제공하는 경우 뷰포트 방향 감지


195

모바일 장치 전용 웹 사이트를 만들고 있습니다. 가로 모드에서 가장 잘 보이는 페이지가 하나 있습니다.

해당 페이지를 방문한 사용자가 세로 모드에서 페이지를보고 있는지 감지하고, 그렇다면 가로 모드에서 페이지를 가장 잘 볼 수 있다는 메시지를 표시합니까? 사용자가 가로 모드에서 이미보고있는 경우 메시지가 나타나지 않습니다.

기본적으로 사이트가 뷰포트 방향을 감지하고 방향이 세로 인 경우이 페이지가 가로 모드 에서 가장 잘 보인다는 경고 메시지를 표시 합니다.

답변:


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

jQuery Mobile에는이 속성의 변경을 처리하는 이벤트가 있습니다. 누군가가 나중에 회전하면 경고하려면- orientationchange

또한 인터넷 검색 후 체크 아웃하십시오 window.orientation(도 단위로 측정된다고 생각합니다 ...)


6
안타깝게도 아닙니다. 그러나 다음 스크립트가 작동했습니다. if (window.innerHeight> window.innerWidth) {alert ( "가로로보십시오"); }
Dan

8
나는 문제를 너무 복잡하게했다. 대단하다. 너무 간단합니다.

77
많은 장치에서 키보드가 표시되면 availableWidth가 높이보다 커서 가로 방향이 잘못됩니다.
Pierre

1
orientationchange이벤트 와 결합하면 작동하지 않습니다 . 새 방향 대신 이전 방향이 표시됩니다. 이 답변orientationchange이벤트 와 함께 잘 작동합니다 .
Donald Duck


163

window.matchMediaCSS 구문과 매우 유사하므로 사용하고 선호하는을 사용할 수도 있습니다 .

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
Android 용 Firefox에서 DOM 준비 이벤트가 발생한 후에 만 ​​제대로 작동합니다.
Inversion

13
이것에 대한 지원은 지금 훨씬 강력합니다. 이것은 지금 받아 들여진 것보다 훨씬 강력한 대답 인 것 같습니다.
JonK

2
이 (링크) 솔루션으로 이것을 조심하십시오 stackoverflow.com/questions/8883163/…
dzv3

2
이것이 정답입니다. 이 기능은 모든 관련 브라우저를 완벽하게 지원합니다.
Telarian

97

David Walsh는 더 나은 지점 접근 방식을 가지고 있습니다.

// 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의 답변은 모든 기기에서 잘 작동하는 것 같습니다. ve 테스트
Nathan

8
방향 0은 장치의 "자연적인"방향으로 제공되므로 공급 업체에 따라 다릅니다. 그것은 초상화 또는 풍경이 될 수 있습니다 ...
Pierre

iframe의 ipad에서 아무 것도 경고하지 않았습니다
Darius.V

2
이것은 장치의 방향 감지 모드에 적합한 솔루션이 아닙니다. 반환 값은 자연 장치 방향에 따라 다릅니다. Samsung 7 '태블릿 세로보기의 예는 90을 반환하지만 넥서스 4에서 세로는 0을 반환합니다.
Dexter_ns88

3
이 링크에서 : notes.matthewgifford.com/… 저자는 다른 제조사의 다른 장치들이 가로와 세로에 대한 해석이 다르다는 것을 보여줍니다. 따라서 다른보고 된 값은 실제로 신뢰할 수 없습니다.
네온 전쟁 27 년

36

CSS3을 사용할 수 있습니다 :

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

방향 변경을 위해 청취자가 필요하지 않기 때문에 가장 좋은 대답입니다. 터치 장치인지 감지하기 위해 modernizr과 결합했지만 데스크톱 또는 랩톱 화면에서는 의미가 없으므로. 터치 기능이있는 화면에는 여전히 문제가 있습니다 ...
Esger

4
자바 스크립트와 관련이 없습니다. OP는 자바 스크립트 솔루션이 필요합니다.
easwee

10
아니요, 메시지를 표시하려고합니다. display : none을 사용하고 display : block을 사용하여 무언가를 표시 할 수 있습니다.
Thomas Decaux

2
이 CSS 검사에 대한 지원은 무엇입니까?
ChrisF

1
잘 모르겠지만 지원하지 않는 모바일을 찾지 못했습니다. 또한 키보드가 나타나면 때로는 이전 쿼리에서 미디어 쿼리가 작동하지 않는 것으로 보입니다.
Thomas Decaux

21

예를 들어 몇 가지 방법이 있습니다.

  • 검사 window.orientation
  • 비교 innerHeightinnerWidth

아래 방법 중 하나를 적용 할 수 있습니다.


기기가 세로 모드인지 확인

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 (모든 데스크탑 브라우저)에서 작동합니다.
Jakob Jenkov

1
모든 주요 브라우저가이를 지원합니다. IE 7도
artnikpro

하지만 표준은 아닙니다 : developer.mozilla.org/en-US/docs/Web/API/…
fjsj

@ Duncan No. 그것은 모바일에서 작동합니다. 꽤 오래된 방법이며 오래된 사파리 및 안드로이드 브라우저에서 지원됩니다. 망막에서는 그다지 정확하지는 않지만 뷰포트 방향을 감지하기 위해서는 잘 작동해야합니다.
artnikpro

1
@artnikpro 어제 테스트했는데 Safari가 방향을 무시한 실제 화면 크기를 반환하는 것으로 보입니다. 따라서 screen.width는 항상 화면의 실제 너비입니다.
Duncan Hoggan

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을 반환합니다.
Felipe Correa

@FelipeCorrea 정답은 2 살입니다!
Sliq

2
새로운 방문자에게 유효하게 해주었습니다. 그것은 나에게 도움이되었습니다.
Felipe Correa

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

아이폰 OS 넣은 사람은 아니다 업데이트 screen.widthscreen.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

270 대신 -90 (빼기 90)이 될 수 있습니다.


1

이것은 이전 답변에서 확장됩니다. 내가 찾은 최고의 솔루션은 CSS3 미디어 쿼리가 충족되는 경우에만 나타나는 무해한 CSS 속성을 만든 다음 해당 속성에 대한 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를 funsies에 사용하고 있습니다). 색상 선언이 이상 할 수 있으므로 다른 것을 사용하고 싶을 수도 있지만 테스트에서 찾은 가장 확실한 방법입니다. 그런 다음 크기 조정 이벤트를 사용하여 전환시 선택할 수 있습니다. 다음과 같이 정리하십시오 :

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는이 문제를 해결할 수 있습니다. 새 플랫폼에서 아직 실질적인 테스트를 수행하지는 않았지만 적어도 초기에는 브라우저에 방향 데이터를 제공하는 것처럼 보입니다. 여전히 주변에 사이트를 구축 할 수 있지만 반드시 알고 있어야합니다.
Josh 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 'Screen Orientation 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();
  • 나는 안드로이드 크롬 만 테스트했다.

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

이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 또한 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼동하지 마십시오!
Goodbye StackExchange 2018 년

이 답변은 원래 질문의 문제를 해결하지 못합니다. 방향 변경을 기록하는 방법을 보여 주지만 특정 방향으로 만 메시지를 표시하는 방법은 보여주지 않습니다.
Julian

1

iOS 장치에서 JavaScript의 창 객체에는 장치의 회전을 결정하는 데 사용할 수있는 방향 속성이 있습니다. 다음은 다른 방향으로 iOS 장치 (예 : iPhone, iPad, iPod)에 대한 값 window.orientation을 보여줍니다.

이 솔루션은 안드로이드 기기에서도 작동합니다. 안드로이드 기본 브라우저 (인터넷 브라우저)와 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.