Làm cách nào để khóa hướng sang chế độ dọc trong Ứng dụng web iPhone?


160

Tôi đang xây dựng Ứng dụng web cho iPhone và muốn khóa hướng sang chế độ dọc. điều này có thể không Có bất kỳ phần mở rộng bộ công cụ web để làm điều này?

Xin lưu ý đây là một ứng dụng được viết bằng HTML và JavaScript cho Mobile Safari, nó KHÔNG phải là một ứng dụng gốc được viết bằng Objective-C.


1
Toàn bộ lý do để xây dựng một ứng dụng web chứ không phải ứng dụng gốc là vì nó có thể là nền tảng chéo, tại sao bạn lại xây dựng một ứng dụng web dành riêng cho iPhone, bạn đang tìm cách viết thêm mã để khóa các điện thoại khác ???


1
Tôi quan tâm đến một giải pháp dành cho "màn hình nhỏ" chứ không chỉ dành cho những thứ có kích thước 320px và được tạo bởi apple.
cảnh sát trưởng

Câu trả lời:


70

Bạn có thể chỉ định các kiểu CSS dựa trên hướng khung nhìn: Nhắm mục tiêu trình duyệt với body [direction = "cảnh"] hoặc body [direction = "Portrait"]

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

Tuy nhiên...

Cách tiếp cận của Apple đối với vấn đề này là cho phép nhà phát triển thay đổi CSS dựa trên thay đổi định hướng nhưng không ngăn chặn hoàn toàn định hướng lại. Tôi tìm thấy một câu hỏi tương tự ở nơi khác:

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


Cảm ơn, nhưng tôi đã thực hiện phần đó rồi, điều tôi thực sự muốn là ngăn Mobile Safari không chuyển hướng cho tôi khi người dùng nghiêng điện thoại.
Kevin

4
Cách tiếp cận của Apple đối với vấn đề này để cho phép nhà phát triển thay đổi CSS dựa trên thay đổi định hướng nhưng không ngăn chặn hoàn toàn định hướng lại. Tôi tìm thấy một câu hỏi tương tự ở nơi khác: ask.metafilter.com/99784/ Khăn
Scott Fox

2
Tôi đã thấy một số trang web hiển thị thông báo chỉ theo chiều ngang hướng dẫn người dùng rằng trang này chỉ có thể được xem theo hướng dọc - chỉ là một tùy chọn khác để bạn xem xét.
Jayden Lawson

97

Đây là một giải pháp khá hay, nhưng ít nhất là một cái gì đó (?). Ý tưởng là sử dụng một biến đổi CSS để xoay nội dung trang của bạn sang chế độ gần như chân dung. Đây là mã JavaScript (được thể hiện bằng jQuery) để giúp bạn bắt đầu:

$(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);
});

Mã này hy vọng toàn bộ nội dung trang của bạn sẽ sống trong một div ngay bên trong phần tử cơ thể. Nó xoay div 90 độ trong chế độ nằm ngang - trở lại chân dung.

Còn lại như một bài tập cho người đọc: div xoay quanh điểm trung tâm của nó, vì vậy vị trí của nó có thể sẽ cần phải được điều chỉnh trừ khi nó hoàn toàn vuông.

Ngoài ra, có một vấn đề hình ảnh hấp dẫn. Khi bạn thay đổi hướng, Safari sẽ quay chậm, sau đó div cấp cao nhất chuyển sang 90 độ khác nhau. Để vui hơn nữa, hãy thêm

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

CSS của bạn. Khi thiết bị quay, thì Safari sẽ thực hiện, sau đó nội dung trang của bạn sẽ thực hiện. Bắt đầu!


3
Grumdrig, bạn là anh hùng của tôi! Đây là mẹo hữu ích và liên quan đến ứng dụng web dành cho iPhone hiệu quả nhất mà tôi từng thấy trên trang web này. Cảm ơn rất nhiều!
noober

Trước khi tôi đọc phản hồi này, tôi đã đề nghị về các bình luận trả lời "được chấp nhận" rằng ai đó ELSE nên thử điều này và cho tôi biết nếu nó hoạt động. Tôi thực sự vui mừng vì ai đó đã làm, và nó đã làm được!
Ngõ

Nếu div là hình chữ nhật thì sao? công thức để thiết lập chính xác nguồn gốc biến đổi là gì? TA
superjos

Bạn cũng có thể điều khiển nó bằng tùy chọn "Định hướng giao diện được hỗ trợ" trên xCode, trong thông tin phát triển Iphone / iPod. Hoạt động tốt
Rodrigo Dias

1
chúng ta không thể tự xoay thân? Nói, $ ("cơ thể"). Css ("- webkit-Transform" ,! Portrait? "Xoay (-90deg)": "");
Krsna Chaitanya

39

Câu trả lời này vẫn chưa thể thực hiện được, nhưng tôi đang đăng nó cho "thế hệ tương lai". Hy vọng, một ngày nào đó chúng ta sẽ có thể làm điều này thông qua quy tắc CSS @viewport:

@viewport {
    orientation: portrait;
}

Đây là trang "Tôi có thể sử dụng" (tính đến năm 2019 chỉ có IE và Edge):
https://caniuse.com/#feat=mdn-css_at-rules_viewport_orientation

Spec (đang xử lý):
https://dcraft.csswg.org/css-device-adapt/#orientation-desc

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

Dựa trên bảng tương thích trình duyệt MDN và bài viết sau, có vẻ như có một số hỗ trợ trong các phiên bản nhất định của IE và Opera:
http://menacescloud.com/?c=cssViewportOrMetaTag

Thông số API API này cũng có vẻ phù hợp:
https://w3c.github.io/screen-orientation/

Tôi đã giả định rằng vì có thể với @viewportquy tắc được đề xuất , nên có thể bằng cách đặt orientationtrong cài đặt chế độ xem trong metathẻ, nhưng tôi đã không thành công với điều này cho đến nay.

Hãy cập nhật câu trả lời này khi mọi thứ được cải thiện.


Đến tháng 10/2019, tính năng mới này vẫn chưa hoạt động. Hãy giữ cho chúng tôi được đăng. cảm ơn.
RainCast

2
Quả thực phải mất rất lâu tôi mới tự hỏi liệu nó sẽ như thế nào. Tôi đã thêm một liên kết đến trang "CanIUse".
xdhmoore

cảm ơn bạn. Bạn có phải là chủ sở hữu của tính năng này? Tôi hoàn toàn không hiểu làm thế nào một tính năng css mới được phát hành. Theo suy đoán của tôi, css org nói chuyện với từng chủ sở hữu sản phẩm trình duyệt chính và yêu cầu họ hỗ trợ? Ai kiểm soát quá trình? Tôi rất tò mò.
RainCast

Hà không chỉ là nhà phát triển. Bạn đang tìm kiếm W3C.
xdhmoore

19

Đoạn mã sau đã được sử dụng trong trò chơi html5 của chúng tôi.

$(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'); 
});

Làm thế nào để bạn tìm ra những con số cho nguồn gốc biến đổi?
superjos

3
Cảnh báo!!! Không phải tất cả các thiết bị đều báo cáo các giá trị giống nhau cho định hướng, vì vậy không thể dựa vào matthewgifford.com/blog/2011/12/22/iêu
Rob

6

Tôi đã đưa ra phương pháp chỉ xoay CSS màn hình này bằng các truy vấn phương tiện. Các truy vấn dựa trên kích thước màn hình mà tôi tìm thấy ở đây . 480px dường như là tốt vì không có / vài thiết bị có chiều rộng hơn 480px hoặc chiều cao dưới 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 giải pháp tốt đẹp. Tôi có một chân trang là vị trí cố định trên dưới. Bất kỳ ý tưởng làm thế nào để hiển thị nó sau khi xoay?
Cybrix

1
Làm thế nào về việc sử dụng (định hướng: phong cảnh) trong truy vấn phương tiện thay vì các giá trị pixel cụ thể? Hay một giá trị pixel chính xác cần phải được xác định?
Justin Putney

Tôi đã sử dụng một giá trị pixel vì bạn phải đặt một giá trị chính xác trên html, giá trị này phải khớp với chiều cao màn hình (khi ở chế độ ngang - chiều rộng màn hình). Vì vậy, việc sử dụng orientation: landscapesẽ không hiệu quả lắm trong ví dụ của tôi @JustinPutney
Bill

1
Từ MDN: "Lưu ý: Giá trị này không tương ứng với hướng thiết bị thực tế. Mở bàn phím mềm trên hầu hết các thiết bị theo hướng dọc sẽ khiến khung nhìn trở nên rộng hơn chiều cao, do đó khiến trình duyệt sử dụng kiểu ngang thay vì dọc. "
cảnh sát trưởng

2
Định hướng @media quy tắc --- yeah. Nghĩ rằng họ là con đường để đi cho đến khi tôi đọc được điều này: developer.mozilla.org/en-US/docs/Web/Guide/CSS/ mẹo
Kẻ sheriffderek



2

Có lẽ trong một tương lai mới, nó sẽ có một cuộc giải quyết ngoài lề ...

Vào tháng 5 năm 2015,

có một chức năng thử nghiệm làm điều đó.

Nhưng nó chỉ hoạt động trên Firefox 18+, IE11 + và Chrome 38+.

Tuy nhiên, nó không hoạt động trên Opera hoặc Safari.

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

Đây là mã hiện tại cho các trình duyệt tương thích:

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

lockOrientation("landscape-primary");

Tôi đang sử dụng nó trong mã javascript của mình trong trang web wordpress của mình như: screen.lockOrientation ("phong cảnh"); và nó không hoạt động. Tôi nhận được: jQuery (...). LockOrientation không phải là một hàm. Tôi có cần thực hiện bất kỳ plugin hoặc khung nào không?
Alex Stanese

1

Mặc dù bạn không thể ngăn thay đổi định hướng có hiệu lực, bạn có thể mô phỏng không có thay đổi như đã nêu trong các câu trả lời khác.

Trước tiên, phát hiện định hướng hoặc định hướng lại thiết bị và, bằng cách sử dụng JavaScript, thêm tên lớp vào thành phần gói của bạn (trong ví dụ này tôi sử dụng thẻ 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();

Sau đó, nếu thiết bị là ngang, sử dụng CSS để đặt chiều rộng thân thành chiều cao của khung nhìn và chiều cao thân thành chiều rộng của khung nhìn. Và hãy thiết lập nguồn gốc biến đổi trong khi chúng ta đang ở đó.

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

Bây giờ, định hướng lại phần tử cơ thể và trượt (dịch) nó vào vị trí.

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

Điều này, hoặc một giải pháp CSS tương tự, ít nhất sẽ giữ nguyên bố cục của bạn nếu đó là những gì bạn đang theo đuổi.

Giải pháp gốc là tính toán các khả năng của thiết bị thay vì cố gắng hạn chế chúng. Nếu thiết bị không cho phép bạn giới hạn phù hợp thì một hack đơn giản là lựa chọn tốt nhất của bạn vì thiết kế về cơ bản chưa hoàn thiện. Càng đơn giản càng tốt.


0

Trong cà phê nếu ai cần nó.

    $(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

Lấy cảm hứng từ câu trả lời của @ Grumdrig và vì một số hướng dẫn đã sử dụng sẽ không hoạt động, tôi đề xuất tập lệnh sau nếu cần bởi người khác:

    $(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

Tôi có một vấn đề tương tự, nhưng để tạo cảnh quan ... Tôi tin rằng đoạn mã dưới đây nên thực hiện thủ thuật:

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

Nhấn vào đây để xem hướng dẫn và ví dụ làm việc từ trang web của tôi.

Bạn không còn cần phải sử dụng các bản hack chỉ để xem Định hướng màn hình di động jQuery cũng như không nên sử dụng PhoneGap nữa, trừ khi bạn thực sự sử dụng PhoneGap.

Để thực hiện công việc này trong năm 2015, chúng tôi cần:

  • Cordova (bất kỳ phiên bản nào dù có gì trên 4.0 đều tốt hơn)
  • PhoneGap (thậm chí bạn có thể sử dụng PhoneGap, các plugin tương thích)

Và một trong những plugin này tùy thuộc vào phiên bản Cordova của bạn:

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

plugin cordova thêm net.yoik.cordova.plugins.screenorientation

  • plugin cordova thêm định hướng cordova-plugin-màn hình (Cordova> = 4)

plugin cordova thêm cordova-plugin-định hướng màn hình

Và để khóa hướng màn hình, chỉ cần sử dụng chức năng này:

screen.lockOrientation('landscape');

Để mở khóa:

screen.unlockOrientation();

Định hướng có thể:

  • Portrait-sơ cấp Định hướng ở chế độ chân dung chính.

  • chân dung phụ Các hướng ở chế độ chân dung phụ.

  • cảnh quan chính Chính hướng ở chế độ cảnh quan chính.

  • phong cảnh-thứ cấp Định hướng là trong chế độ cảnh quan thứ cấp.

  • chân dung Hướng là chân dung chính hoặc chân dung phụ (cảm biến).

  • phong cảnh Định hướng là cảnh quan chính hoặc cảnh quan phụ (cảm biến).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.