2012-02-02 10 views
5

Attualmente sto lavorando a un'applicazione web a pagina singola ottimizzata per dispositivi touch, principalmente iOS. Ho implementato il nuovo scrolling nativo iOS tramite -webkit-overflow-scrolling: touch; e tutto funziona bene, tranne per il fatto che stiamo ancora sperimentando l'effetto scroll elastico di Apple sull'intero corpo della pagina.Disabilitazione scorrimento corpo elastico iOS e mantenimento dello scorrimento nativo funzionante

Ciò implica che l'intera pagina si sposta dalla parte superiore/inferiore del viewport quando una pergamena termina o il corpo viene spinto e si deduce davvero che si tratta di un'app Web. Ho seguito various guidelines su come prevenirlo e mentre funzionano, impediscono al tutto gli elementi di scorrimento interni di funzionare.

Here's a fiddle per dimostrare quello che sto usando finora.

Qualcuno ha trovato una soluzione che disabilita lo scorrimento elastico del corpo ma consente il funzionamento degli scrollabili interni?

+0

Ho notato che la disattivazione di touchmove per $ (documento) è stata commentata. È questo di proposito? – zvona

+0

Lo è. Se disattivi tutto, lo scorrimento è disabilitato. Mi dispiace, avrei dovuto dirlo. – madcapnmckay

risposta

5

Ho adattato la buona soluzione da Conditionally block scrolling/touchmove event in mobile safari usando Dojo:

var initialY = null; 
dojo.connect(document, 'ontouchstart', function(e) { 
    initialY = e.pageY; 
}); 
dojo.connect(document, 'ontouchend', function(e) { 
    initialY = null; 
}); 
dojo.connect(document, 'ontouchcancel', function(e) { 
    initialY = null; 
}); 
dojo.connect(document, 'ontouchmove', function(e) { 
    if(initialY !== null) { 
     if(!dojo.query(e.target).closest('#content')[0]) { 
      // The element to be scrolled is not the content node 
      e.preventDefault(); 
      return; 
     } 

     var direction = e.pageY - initialY; 
     var contentNode = dojo.byId('content'); 

     if(direction > 0 && contentNode.scrollTop <= 0) { 
      // The user is scrolling up, and the element is already scrolled to top 
      e.preventDefault(); 
     } else if(direction < 0 && contentNode.scrollTop >= contentNode.scrollHeight - contentNode.clientHeight) { 
      // The user is scrolling down, and the element is already scrolled to bottom 
      e.preventDefault(); 
     } 
    } 
}); 

L'elemento da scorrere è #contenuto in questo caso.

+1

Sei sicuro che funzioni? Non potrei replicare questo lavoro sul violino ... chiedendo se questa è davvero una risposta corretta – zanona

+0

Funziona ancora abbastanza bene per me. –

+0

In IOS 7 questo codice impedisce solo lo scorrimento elastico una volta che la pagina è stata scorsa oltre i suoi confini una volta. Es: 1. si scorre verso il basso: si sovrascrive 2. si scorre di nuovo verso il basso: nessun overscroll 3. si scorre verso l'alto: si overscroll 4. si scorre verso il basso: si overscroll 5.scorri verso il basso: no overscroll 6. scorri verso il basso: nessun overscroll – Phedg1

1

Forse iScroll è quello che stai cercando (se ho capito la tua domanda destra)

+0

Il problema con iscroll è che non è nativo e implementa solo lo scorrimento su un contenitore per quanto ne so. Lo scroll overflow del webkit consente lo scorrimento nativo del tocco sui contenitori e funziona alla grande. Ma lo scrolling del corpo elastico della mela è ancora presente indipendentemente dalla soluzione di scorrimento scelta. – madcapnmckay

+0

In realtà, iScroll non ne soffre, penso che mette una correzione in atto, in pratica disabilita tutto lo scorrimento e quindi aggiunge i suoi gestori in cima per abilitare la sua scroll. Sto cercando di farlo da solo, ma continuando con lo scroll nativo. – madcapnmckay

0

A rischio di duplicare il mio post, cerco di risolvere lo stesso problema e finora sono soltanto fino a questo punto:

 $(document).bind("touchmove",function(e){ 
      e.preventDefault(); 
     }); 
     $('.scrollable').bind("touchmove",function(e){ 
      e.stopPropagation(); 
     }); 

Questo funziona se si dispone di un elemento di overflow che non copre l'intero schermo ad esempio, come in un'app per iPad. ma non funziona se si dispone di un'app mobile e l'intero viewport è coperto dall'elemento in overflow.

L'unica cosa che riuscivo a pensare è quello di verificare la scrollTop() del $ ('scorrevole') e poi condizionalmente legare il preventDefault() se si tratta di 0.

Dopo aver provato, ho notato che la webkit UA segnala scrollTop sempre come 0 quando l'elemento viene fatto scorrere verso l'alto anche quando esegue il "rimbalzo interno" dello scroll overflow nativo. Quindi non posso fare nulla dal momento che avrei bisogno di una scrollTop negativa per impostare la mia condizione.

Sigh. Frustrante.

Problemi correlati