2012-08-24 17 views
19

Necesito el ancho de la ventana gráfica para que una página tenga 950 px en el paisaje y 630 px en el retrato. Estos anchos de píxeles son, lamentablemente, inflexibles.¿Cómo ajustar a la pantalla después de cambiar el ancho de la ventana gráfica en el cambio de orientación?

Estoy ajustando el ancho del contenido de DOM según la orientación mediante consultas de medios de CSS.

Estoy escuchando eventos de cambio de orientación en JS para cambiar el tamaño de la ventana gráfica en el cambio de orientación.

Todo se ve bien en la carga de la página inicial (retrato o paisaje).

Sin embargo, después de un cambio de orientación, Mobile Safari conserva la configuración de escala anterior, en lugar de ajustar la ventana gráfica a la pantalla. Un doble toque o dos enderezan. Pero necesito que sea automático.

He adjuntado la fuente a continuación y la he subido a una demo URL.

A continuación se muestran las capturas de pantalla tomadas después de los cambios de orientación: de paisaje a retrato, y de vertical a horizontal.

¿Cómo puedo forzar a Safari a establecer automáticamente el ancho de la ventana gráfica en el ancho de la pantalla? ¿O estoy haciendo esto mal?

Cambiar las diversas configuraciones de escala en la ventana gráfica no ha ayudado. La configuración maximum-scale=1.0 o initial-scale=1.0 parece anular mi width, estableciendo width en device-width (es decir, 1024 o 768 en mi iPad 2), dejando espacio en el margen muerto. El ajuste minimum-scale=1.0 parece no hacer nada.

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> 

Respuesta

8

bien, la respuesta estaba en los atributos *-scale después de todo.

Puede forzar una báscula específica configurando maximum-scale y minimum-scale con el mismo valor. Pero debe sacrificar la escala del usuario configurando la metaetiqueta en <meta name='viewport' content='user-scalable=no' />.

Tenga en cuenta que los ajustes de *-scale son relativos a las dimensiones de la pantalla del dispositivo, que varían de un dispositivo a otro. Afortunadamente puede buscarlos en el objeto screen en JS.

Por lo tanto, si su ancho de contenido es inferior a 980, su escala forzada debe ser screen_dimension/content_width.

Esta versión actualizada de mi JS anterior ha hecho que los cambios de orientación funcionen sin problemas. Probado en el iPhone 4 y el 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

Yo también puedo confirmar que el anterior tiene resultados maravillosos en un ipad (mayo de 2013) – Richard

+0

Obviamente se estropea el ancho en muchos otros dispositivos. Entonces realmente no es una buena solución. Pero finalmente hay algo con lo que trabajar :-) –

+0

+1 para el concepto. Bonito. –

3

utilizar la sabiduría de este post y simplemente obtener el ancho y la altura del contenedor de la secuencia de comandos (anchura de la ventana & altura) ... https://stackoverflow.com/a/9049670/818732

usando esta ventana gráfica: target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no resolvió mis problemas en Android AND iOS. Tenga en cuenta que target-densitydpi se marcará en TODOS los demás dispositivos, pero Android, pero no hará ningún daño. Se asegurará de que nada se escale automáticamente.

9

Tuve este problema y escribí algunos JavaScript para solucionarlo. Lo puse en Github aquí:

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

Este es el código para su conveniencia:

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

tenido un problema similar con iOS, después de algunas pruebas terminó con una solución que puede encontrar aquí

Reset Zoom on iOS after viewport width change

En mi solución de zoom está desactivado pero se puede remover libremente "usuario-scalabl e = no "para hacerlo zoomable.

Cuestiones relacionadas