iPhone 웹 응용 프로그램에서 방향을 세로 모드로 잠 그려면 어떻게합니까?


160

iPhone 웹 응용 프로그램을 만들고 있는데 방향을 세로 모드로 잠그고 싶습니다. 이게 가능해? 이를위한 웹 키트 확장이 있습니까?

모바일 Safari 용 HTML 및 JavaScript로 작성된 응용 프로그램이며 Objective-C로 작성된 기본 응용 프로그램이 아닙니다.


1
기본 응용 프로그램이 아닌 웹 응용 프로그램을 작성하는 전체 이유는 크로스 플랫폼이 될 수 있기 때문에 iPhone 전용 웹 응용 프로그램을 작성하는 이유는 무엇입니까? 다른 전화를 잠그기 위해 추가 코드를 작성하고 있습니까?


1
320px이고 애플이 만든 것만이 아니라 "작은 화면"을위한 솔루션에 관심이 있습니다.
보안관

답변:


70

뷰포트 방향에 따라 CSS 스타일을 지정할 수 있습니다. body [orient = "landscape"] 또는 body [orient = "portrait"]

http://www.evotech.net/blog/2007/07/web-development-for-the-iphone/

하나...

이 문제에 대한 Apple의 접근 방식은 개발자가 방향 변경에 따라 CSS를 변경할 수 있지만 방향이 완전히 바뀌지 않도록하는 것입니다. 다른 곳에서 비슷한 질문을 발견했습니다.

http://ask.metafilter.com/99784/How-can-I-lock-iPhone-orientation-in-Mobile-Safari


고맙지 만, 나는 이미 그 일을하고 있습니다. 내가 정말로 원하는 것은 사용자가 전화를 기울일 때 Mobile Safari가 방향을 전환하지 못하게하는 것입니다.
Kevin

4
이 문제에 대한 Apple의 접근 방식은 개발자가 방향 변경을 기반으로 CSS를 변경할 수 있지만 방향이 완전히 바뀌는 것을 방지하지는 않습니다. 다른 곳에서도 비슷한 질문을 찾았습니다 : ask.metafilter.com/99784/…
Scott Fox

2
일부 사이트에는 가로 방향의 메시지 만 표시되어 사용자에게이 사이트를 세로 방향으로 만 볼 수 있다는 것을 알 수 있습니다.
Jayden Lawson

97

이것은 꽤 해킹 된 솔루션이지만 적어도 뭔가 (?)입니다. 아이디어는 CSS 변환을 사용하여 페이지의 내용을 준 초상화 모드로 회전시키는 것입니다. 시작하는 JavaScript (jQuery로 표시) 코드는 다음과 같습니다.

$(document).ready(function () {
  function reorient(e) {
    var portrait = (window.orientation % 180 == 0);
    $("body > div").css("-webkit-transform", !portrait ? "rotate(-90deg)" : "");
  }
  window.onorientationchange = reorient;
  window.setTimeout(reorient, 0);
});

이 코드는 페이지의 전체 내용이 body 요소 내부의 div 안에 있어야합니다. 가로 모드에서 세로 방향으로 90도 회전합니다.

독자에게 연습으로 남겨 두십시오 : div가 중심점을 중심으로 회전하므로 완벽하게 정사각형이 아닌 한 위치를 조정해야합니다.

또한 눈에 띄지 않는 시각적 문제가 있습니다. 방향을 변경하면 Safari가 느리게 회전 한 다음 최상위 div가 90 도씩 달라집니다. 더 재미있게, 추가

body > div { -webkit-transition: all 1s ease-in-out; }

CSS에. 장비가 회전하면 Safari가 페이지 내용을 변경합니다. 속이는!


3
그럼 드리 그, 당신은 나의 영웅입니다! 이것은 내가이 사이트에서 본 가장 유용하고 작동하는 iPhone 웹 응용 프로그램 관련 팁입니다. 많은 감사합니다!
noober

이 답변을 읽기 전에 ELSE 누군가가 이것을 시도하고 그것이 효과가 있는지 말해 주어야한다는 "허용 된"답변 의견에 대해 제안하려고했습니다. 나는 누군가 이미 벌써 기쁘다.
Lane

div가 직사각형이면 어떻게 되나요? 변환 원점을 올바르게 설정하는 공식은 무엇입니까? TA
superjos

iPhone / iPod 개발 정보 아래 xCode의 "지원되는 인터페이스 방향"옵션으로 제어 할 수도 있습니다. 잘 작동
Rodrigo Dias

1
몸 자체를 직접 회전시킬 수 없습니까? $ ( "body"). css ( "-webkit-transform",! portrait? "rotate (-90deg)": "");
Krsna Chaitanya

39

이 답변은 아직 불가능하지만 "미래 세대"를 위해 게시하고 있습니다. 언젠가 CSS @viewport 규칙을 통해이 작업을 수행 할 수 있기를 바랍니다.

@viewport {
    orientation: portrait;
}

다음은 "사용할 수있는"페이지입니다 (2019 년 현재 IE 및 Edge 만 해당).
https://caniuse.com/#feat=mdn-css_at-rules_viewport_orientation

사양 (처리 중) :
https://drafts.csswg.org/css-device-adapt/#orientation-desc

MDN :
https://developer.mozilla.org/en-US/docs/Web/CSS/@viewport/orientation

MDN 브라우저 호환성 표 및 다음 기사를 기반으로 특정 버전의 IE 및 Opera에서 일부 지원이있는 것 같습니다.
http://menacingcloud.com/?c=cssViewportOrMetaTag

이 JS API 사양도 관련이 있습니다.
https://w3c.github.io/screen-orientation/

제안 된 @viewport규칙 으로 가능했기 때문에 태그 orientation의 뷰포트 설정에서 설정하면 가능할 것이라고 가정 meta했지만 지금까지는 성공하지 못했습니다.

상황이 개선됨에 따라이 답변을 자유롭게 업데이트하십시오.


2019 년 10 월까지이 새로운 기능은 아직 작동하지 않습니다. 우리를 계속 게시하십시오. 감사.
RainCast

2
실제로 그것이 오래 걸리는지 궁금합니다. "CanIUse"페이지에 대한 링크를 추가했습니다.
xdhmoore

감사합니다. 이 기능의 소유자입니까? 새로운 CSS 기능이 어떻게 출시되는지 잘 모르겠습니다. 내 생각에, CSS 조직은 주요 브라우저 제품 소유자 각각과 대화하고 지원하도록 요청합니까? 누가 프로세스를 관리합니까? 매우 궁금합니다.
RainCast

또 다른 개발자는 없습니다. 당신은 W3C를 찾고 있습니다.
xdhmoore

19

다음 코드는 html5 게임에서 사용되었습니다.

$(document).ready(function () {
     $(window)    
          .bind('orientationchange', function(){
               if (window.orientation % 180 == 0){
                   $(document.body).css("-webkit-transform-origin", "")
                       .css("-webkit-transform", "");               
               } 
               else {                   
                   if ( window.orientation > 0) { //clockwise
                     $(document.body).css("-webkit-transform-origin", "200px 190px")
                       .css("-webkit-transform",  "rotate(-90deg)");  
                   }
                   else {
                     $(document.body).css("-webkit-transform-origin", "280px 190px")
                       .css("-webkit-transform",  "rotate(90deg)"); 
                   }
               }
           })
          .trigger('orientationchange'); 
});

변환 원점의 숫자를 어떻게 알 수 있습니까?
superjos December

3
경고!!! 모든 장치가 동일한 오리엔테이션 값을보고하는 것은 아니므로 matthewgifford.com/blog/2011/12/22/…에
Rob

6

미디어 쿼리를 사용하여 화면을 회전시키는이 CSS 전용 방법을 생각해 냈습니다. 검색어는 여기에서 찾은 화면 크기 기준으로 합니다 . 480px는 너비가 480px 이상이거나 높이가 480px 미만인 장치가 거의 없기 때문에 좋았습니다.

@media (max-height: 480px) and (min-width: 480px) and (max-width: 600px) { 
    html{
        -webkit-transform: rotate(-90deg);
           -moz-transform: rotate(-90deg);
            -ms-transform: rotate(-90deg);
             -o-transform: rotate(-90deg);
                transform: rotate(-90deg);
        -webkit-transform-origin: left top;
           -moz-transform-origin: left top;
            -ms-transform-origin: left top;
             -o-transform-origin: left top;
                transform-origin: left top;
        width: 320px; /*this is the iPhone screen width.*/
        position: absolute;
        top: 100%;
            left: 0
    }
}

+1 좋은 해결책. 바닥에 고정 된 바닥 글이 있습니다. 회전 후 표시하는 방법에 대한 아이디어가 있습니까?
Cybrix

1
특정 픽셀 값 대신 미디어 쿼리에서 (방향 : 가로)를 사용하는 것은 어떻습니까? 아니면 정확한 픽셀 값을 정의해야합니까?
저스틴 퍼트 니

HTML에서 정확한 값을 설정해야하기 때문에 픽셀 값을 사용했습니다. 화면 높이와 일치해야합니다 (가로-화면 너비). 따라서 orientation: landscape@JustinPutney
Bill

1
MDN에서 : "참고 :이 값은 실제 장치 방향과 일치하지 않습니다. 대부분의 장치에서 세로 방향으로 소프트 키보드를 열면 뷰포트의 높이가 키보다 크게되어 브라우저가 세로 대신 가로 스타일을 사용합니다. "
보안관

2
오리엔테이션 @ 미디어 규칙 --- 예. 그들이 이것을 읽을 때까지 갈 길이라고 생각했다 : developer.mozilla.org/en-US/docs/Web/Guide/CSS/…
sheriffderek



2

아마도 새로운 미래에는 즉시 사용 가능한 솔루션이있을 것입니다 ...

2015 년 5 월은

이를 수행하는 실험적인 기능이 있습니다.

그러나 Firefox 18+, IE11 + 및 Chrome 38 이상에서만 작동합니다.

그러나 Opera 나 Safari에서는 아직 작동하지 않습니다.

https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation#Browser_compatibility

호환 가능한 브라우저의 현재 코드는 다음과 같습니다.

var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation;

lockOrientation("landscape-primary");

워드 프레스 웹 사이트의 자바 스크립트 코드에서 다음과 같이 사용하고 있습니다. screen.lockOrientation ( "landscape"); 작동하지 않습니다. jQuery (...). lockOrientation은 함수가 아닙니다. 플러그인 또는 프레임 워크를 구현해야합니까?
Alex Stanese

1

방향 변경이 적용되는 것을 막을 수는 없지만 다른 답변에 명시된대로 변경을 모방 할 수는 없습니다.

먼저 장치 방향 또는 방향을 감지하고 JavaScript를 사용하여 래핑 요소에 클래스 이름을 추가하십시오 (이 예제에서는 body 태그를 사용함).

function deviceOrientation() {
  var body = document.body;
  switch(window.orientation) {
    case 90:
      body.classList = '';
      body.classList.add('rotation90');
      break;
    case -90:
      body.classList = '';
      body.classList.add('rotation-90');
      break;
    default:
      body.classList = '';
      body.classList.add('portrait');
      break;
  }
}
window.addEventListener('orientationchange', deviceOrientation);
deviceOrientation();

그런 다음 장치가 가로 인 경우 CSS를 사용하여 바디 너비를 뷰포트 높이로 설정하고 바디 높이를 뷰포트 너비로 설정하십시오. 그리고 변환 원점을 설정하는 동안 설정합니다.

@media screen and (orientation: landscape) {
  body {
    width: 100vh;
    height: 100vw;
    transform-origin: 0 0;
  }
}

이제 본문 요소의 방향을 바꾸고 해당 위치로 슬라이드 (번역)합니다.

body.rotation-90 {
  transform: rotate(90deg) translateY(-100%);
}
body.rotation90 {
  transform: rotate(-90deg) translateX(-100%);
}

0
// CSS hack to prevent layout breaking in landscape
// e.g. screens larger than 320px  
html {
  width: 320px;
  overflow-x: hidden;
}

이것 또는 유사한 CSS 솔루션은 레이아웃이 나중에 유지되는 경우 최소한 레이아웃을 유지합니다.

루트 솔루션은 장치의 기능을 제한하지 않고 설명합니다. 장치가 단순한 해킹보다 적절한 제한을 허용하지 않으면 디자인이 본질적으로 불완전하기 때문에 최선의 방법입니다. 간단할수록 좋습니다.


0

커피가 필요하다면

    $(window).bind 'orientationchange', ->
        if window.orientation % 180 == 0
            $(document.body).css
                "-webkit-transform-origin" : ''
                "-webkit-transform" : ''
        else
            if window.orientation > 0
                $(document.body).css
                    "-webkit-transform-origin" : "200px 190px"
                    "-webkit-transform" : "rotate(-90deg)"
            else
                $(document.body).css
                    "-webkit-transform-origin" : "280px 190px"
                    "-webkit-transform" : "rotate(90deg)"

0

@Grumdrig의 답변에서 영감을 얻었으며 사용 된 지침 중 일부가 작동하지 않기 때문에 다른 사람이 필요하면 다음 스크립트를 제안합니다.

    $(document).ready(function () {

      function reorient(e) {
        var orientation = window.screen.orientation.type;
        $("body > div").css("-webkit-transform", (orientation == 'landscape-primary' || orientation == 'landscape-secondary') ? "rotate(-90deg)" : "");
      }
    $(window).on("orientationchange",function(){
        reorient();
    });
      window.setTimeout(reorient, 0);
    });

0

비슷한 문제가 있지만 조경하려면 ... 아래 코드가 트릭을 수행해야한다고 생각합니다.

//This code consider you are using the fullscreen portrait mode
function processOrientation(forceOrientation) {
  var orientation = window.orientation;
  if (forceOrientation != undefined)
    orientation = forceOrientation;
  var domElement = document.getElementById('fullscreen-element-div');
  switch(orientation) {
    case 90:
      var width = window.innerHeight;
      var height = window.innerWidth;
      domElement.style.width = "100vh";
      domElement.style.height = "100vw";
      domElement.style.transformOrigin="50% 50%";
      domElement.style.transform="translate("+(window.innerWidth/2-width/2)+"px, "+(window.innerHeight/2-height/2)+"px) rotate(-90deg)";
      break;
    case -90:
      var width = window.innerHeight;
      var height = window.innerWidth;
      domElement.style.width = "100vh";
      domElement.style.height = "100vw";
      domElement.style.transformOrigin="50% 50%";
      domElement.style.transform="translate("+(window.innerWidth/2-width/2)+"px, "+(window.innerHeight/2-height/2)+"px) rotate(90deg)";
      break;
    default:
      domElement.style.width = "100vw";
      domElement.style.height = "100vh";
      domElement.style.transformOrigin="";
      domElement.style.transform="";
      break;
  }
}
window.addEventListener('orientationchange', processOrientation);
processOrientation();
<html>
<head></head>
<body style="margin:0;padding:0;overflow: hidden;">
  <div id="fullscreen-element-div" style="background-color:#00ff00;width:100vw;height:100vh;margin:0;padding:0"> Test
  <br>
  <input type="button" value="force 90" onclick="processOrientation(90);" /><br>
  <input type="button" value="force -90" onclick="processOrientation(-90);" /><br>
  <input type="button" value="back to normal" onclick="processOrientation();" />
  </div>
</body>
</html>


-3

내 웹 사이트의 자습서 및 실제 예제를 보려면 여기 를 클릭 하십시오 .

실제로 PhoneGap을 사용하지 않는 한 jQuery 모바일 화면 방향을보기 위해 더 이상 핵을 사용할 필요가 없으며 더 이상 PhoneGap을 사용하지 않아도됩니다.

2015 년에이 작업을 수행하려면 다음이 필요합니다.

  • 코르도바 (4.0 이상인 것이 더 낫다)
  • PhoneGap (PhoneGap도 사용할 수 있으며 플러그인은 호환 가능)

Cordova 버전에 따라 다음 플러그인 중 하나가 있습니다.

  • net.yoik.cordova.plugins.screenorientation (Cordova <4)

cordova 플러그인 추가 net.yoik.cordova.plugins.screenorientation

  • 코르도바 플러그인 추가 cordova-plugin-screen-orientation (Cordova> = 4)

cordova 플러그인 추가 cordova-plugin-screen-orientation

화면 방향을 잠 그려면이 기능을 사용하십시오.

screen.lockOrientation('landscape');

잠금을 해제하려면

screen.unlockOrientation();

가능한 오리엔테이션 :

  • 세로-기본 방향이 기본 세로 모드입니다.

  • 세로-보조 방향은 보조 세로 모드입니다.

  • landscape-primary 방향이 기본 가로 모드입니다.

  • landscape-secondary 방향이 보조 가로 모드입니다.

  • 세로 방향은 세로 기본 또는 세로 보조 (센서)입니다.

  • landscape 방향은 landscape-primary 또는 landscape-secondary (센서)입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.