2012-08-24 15 views
19

Ho bisogno della larghezza della finestra per una pagina di 950px in orizzontale e 630px in verticale. Queste larghezze di pixel sono sfortunatamente inflessibili.Come adattarsi allo schermo dopo aver cambiato la larghezza della vista sul cambio di orientamento?

Sto regolando la larghezza del contenuto DOM in base all'orientamento utilizzando le query multimediali CSS.

Sto ascoltando gli eventi di modifica dell'orientamento in JS per ridimensionare il viewport sul cambio di orientamento.

Tutto sembra buono sul caricamento iniziale della pagina (verticale o orizzontale).

Tuttavia, dopo un cambio di orientamento, Safari Safari conserva l'impostazione della scala precedente, invece di adattare la finestra sullo schermo. Un doppio tocco o due lo raddrizza. Ma ho bisogno che sia automatico.

Ho allegato la fonte di seguito e l'ho caricata su una demo URL.

Di seguito vengono catturate schermate scattate dopo i cambi di orientamento: da orizzontale a verticale e da verticale a orizzontale.

Come posso forzare Safari a impostare automaticamente la larghezza della finestra sullo schermo? O sto andando tutto sbagliato?

La modifica delle varie impostazioni della scala nella finestra non ha aiutato. L'impostazione maximum-scale=1.0 o initial-scale=1.0 sembra ignorare il mio width, l'impostazione width a device-width (ad esempio 1024 o 768 sul mio iPad 2), lasciando spazio margine morto. L'impostazione minimum-scale=1.0 sembra non fare nulla.

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> 

risposta

8

OK, la risposta stava nel *-scale attributi, dopo tutto.

È possibile forzare una scala specifica impostando sia maximum-scale e minimum-scale allo stesso valore. Ma devi sacrificare il ridimensionamento degli utenti impostando il meta tag su <meta name='viewport' content='user-scalable=no' />.

Si noti che le impostazioni dello *-scale sono relative alle dimensioni dello schermo del dispositivo, che variano da dispositivo a dispositivo. Fortunatamente è possibile consultarli nell'oggetto screen in JS.

Quindi, se la larghezza del contenuto è inferiore a 980, la scala forzata deve essere screen_dimension/content_width.

Questa versione aggiornata del mio JS precedente ha apportato modifiche di orientamento senza problemi. Testato su iPhone 4 e 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

Anche io posso confermare quanto sopra ha risultati meravigliosi su un iPad (maggio 2013) – Richard

+0

Ovviamente aumenta la larghezza su molti altri dispositivi. Quindi non è davvero una buona soluzione. Ma c'è finalmente qualcosa su cui lavorare :-) –

+0

+1 per il concetto. Bello. –

3

utilizzare la saggezza di questo post e semplicemente ottenere la larghezza e l'altezza del contenitore dello script (larghezza della finestra & altezza) ... https://stackoverflow.com/a/9049670/818732

utilizzando questo viewport: target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no risolto i miei problemi su android AND ios. Si noti che target-densitydpi verrà contrassegnato su TUTTI gli altri dispositivi, ma Android, ma non farà alcun danno. Si assicurerà che nulla venga ridimensionato automaticamente.

9

Ho avuto questo problema e ho scritto alcuni JavaScript per risolverlo. Ho messo su Github qui:

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

Ecco il codice per la vostra convenienza:

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

avuto un problema simile con iOS, dopo alcuni test si è conclusa con una soluzione che potete trovare qui

Reset Zoom on iOS after viewport width change

Nella mia soluzione zoom è disattivato, ma è possibile rimuovere liberamente "user-scalabl e = no "per renderlo zoomabile.

Problemi correlati