2012-08-24 9 views
19

Tôi cần chiều rộng khung nhìn cho một trang có kích thước là 950px và phông nền là 630px. Độ rộng pixel này không may là không linh hoạt.Làm thế nào để vừa với màn hình sau khi thay đổi chiều rộng khung nhìn trên sự thay đổi hướng?

Tôi đang điều chỉnh độ rộng của nội dung DOM dựa trên hướng sử dụng truy vấn phương tiện CSS.

Tôi đang nghe các sự kiện thay đổi hướng trong JS để thay đổi kích thước chế độ xem trên thay đổi hướng.

Mọi thứ đều tốt khi tải trang ban đầu (dọc hoặc ngang).

Tuy nhiên, sau khi thay đổi định hướng, Mobile Safari giữ nguyên cài đặt tỷ lệ trước đó, thay vì gắn khung nhìn vào màn hình. Nhấn đúp hoặc nhấn hai lần. Nhưng tôi cần điều đó là tự động.

Tôi đã đính kèm nguồn bên dưới và tải nó lên bản demo URL.

Dưới đây là các ảnh chụp màn hình được chụp sau khi thay đổi hướng: từ ngang sang dọc và từ dọc sang ngang.

Làm cách nào để buộc Safari tự động đặt chiều rộng khung nhìn thành chiều rộng màn hình? Hoặc tôi đang đi về điều này tất cả các sai?

Thay đổi các cài đặt quy mô khác nhau trong chế độ xem không có tác dụng. Đặt maximum-scale=1.0 hoặc initial-scale=1.0 xuất hiện để ghi đè số width của tôi, đặt width thành device-width (tức là 1024 hoặc 768 trên iPad 2 của tôi), để lại khoảng trống lề. Thiết lập minimum-scale=1.0 dường như không làm gì cả.

From landscape to portrait

From portrait to landscape

<!DOCTYPE html> 
<html> 
    <head> 
     <title>iPad orientation</title> 

     <meta name="viewport" content="user-scalable=yes"> 

     <script src="jquery-1.4.2.min.js" type="text/javascript"></script> 

     <script type="text/javascript" charset="utf-8">; 
     /** 
     * update viewport width on orientation change 
     */ 
     function adapt_to_orientation() { 
      // determine new screen_width 
      var screen_width; 
      if (window.orientation == 0 || window.orientation == 180) { 
      // portrait 
      screen_width = 630; 
      } else if (window.orientation == 90 || window.orientation == -90) { 
      // landscape 
      screen_width = 950; 
      } 

      // resize meta viewport 
      $('meta[name=viewport]').attr('content', 'width='+screen_width); 
     } 

     $(document).ready(function() { 

      // bind to handler 
      $('body').bind('orientationchange', adapt_to_orientation); 

      // call now 
      adapt_to_orientation(); 
     }); 

     </script> 
     <style type="text/css" media="screen"> 
     body { 
      margin: 0; 
     } 
     #block { 
      background-color: #333; 
      color: #fff; 
      font-size: 128px; 

      /* landscape */ 
      width: 950px; 
     } 
     #block .right { 
      float: right 
     } 
     @media only screen and (orientation:portrait) { 
      #block { 
      width: 630px; 
      } 
     } 
     </style> 
    </head> 
    <body> 
     <div id="block"> 
     <div class="right">&rarr;</div> 
     <div class="left">&larr;</div> 
     </div> 
    </body> 
</html> 

Trả lời

8

OK, câu trả lời nằm trong *-scale thuộc tính sau khi tất cả.

Bạn có thể buộc một tỷ lệ cụ thể bằng cách đặt cả hai số maximum-scaleminimum-scale thành cùng một giá trị. Nhưng bạn phải hy sinh quy mô người dùng bằng cách đặt thẻ meta thành <meta name='viewport' content='user-scalable=no' />.

Lưu ý rằng cài đặt *-scale liên quan đến kích thước màn hình của thiết bị — thay đổi từ thiết bị này sang thiết bị khác. May mắn là bạn có thể tra cứu chúng trong đối tượng screen trong JS.

Vì vậy, nếu chiều rộng nội dung của bạn dưới 980, tỷ lệ buộc phải là screen_dimension/content_width.

Phiên bản cập nhật này của JS ở trên đã thực hiện các thay đổi định hướng hoạt động trơn tru. Thử nghiệm trên iPhone 4 và iPad 2.

function adapt_to_orientation() { 
     var content_width, screen_dimension; 

     if (window.orientation == 0 || window.orientation == 180) { 
     // portrait 
     content_width = 630; 
     screen_dimension = screen.width * 0.98; // fudge factor was necessary in my case 
     } else if (window.orientation == 90 || window.orientation == -90) { 
     // landscape 
     content_width = 950; 
     screen_dimension = screen.height; 
     } 

     var viewport_scale = screen_dimension/content_width; 

     // resize viewport 
     $('meta[name=viewport]').attr('content', 
     'width=' + content_width + ',' + 
     'minimum-scale=' + viewport_scale + ', maximum-scale=' + viewport_scale); 
    } 
+0

Tôi cũng có thể xác nhận ở trên có kết quả tuyệt vời trên iPad (tháng 5 năm 2013) – Richard

+0

Rõ ràng là vít lên chiều rộng trên nhiều thiết bị khác. Vì vậy, không thực sự là một giải pháp tốt. Nhưng cuối cùng cũng có điều gì đó để làm việc với :-) –

+0

+1 cho khái niệm. Tốt đẹp. –

3

sử dụng sự khôn ngoan của bài đăng này và chỉ đơn giản là có được chiều rộng và chiều cao của container của kịch bản của bạn (cửa sổ rộng & chiều cao) ... https://stackoverflow.com/a/9049670/818732

sử dụng chế độ xem này: target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no đã giải quyết được sự cố của tôi trên android AND ios. Lưu ý rằng target-densitydpi sẽ được gắn cờ trên tất cả các thiết bị khác nhưng Android nhưng sẽ không gây hại gì. Nó sẽ đảm bảo không có gì được tự động thu nhỏ.

9

Tôi gặp sự cố này và đã viết một số JavaScript để khắc phục sự cố. Tôi đặt nó trên Github đây:

https://github.com/incompl/ios-reorient

Đây là mã thuận tiện cho bạn:

window.document.addEventListener('orientationchange', function() { 
    var iOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/g); 
    var viewportmeta = document.querySelector('meta[name="viewport"]'); 
    if (iOS && viewportmeta) { 
    if (viewportmeta.content.match(/width=device-width/)) { 
     viewportmeta.content = viewportmeta.content.replace(/width=[^,]+/, 'width=1'); 
    } 
    viewportmeta.content = viewportmeta.content.replace(/width=[^,]+/, 'width=' + window.innerWidth); 
    } 
    // If you want to hide the address bar on orientation change, uncomment the next line 
    // window.scrollTo(0, 0); 
}, false); 
0

Đã có một vấn đề tương tự với iOS, sau khi một số thử nghiệm đã kết thúc với một giải pháp bạn có thể tìm thấy ở đây

Reset Zoom on iOS after viewport width change

Trong zoom giải pháp của tôi bị vô hiệu hóa nhưng bạn có thể tự do loại bỏ "user-scalabl e = không "để làm cho nó có thể thu phóng.