2013-02-25 14 views
15

Ho un'app PhoneGap che visualizza un testo piuttosto lungo con intestazioni, tabelle e immagini che sto testando su Android.Elementi posizionati in modo discreto posizionabili posizionati div "lag behind" su scroll

Tutto funziona bene, tranne per gli elementi con stile position:relative Questi elementi "lag" dietro durante lo scorrimento, il che significa se ho scorrere la pagina, quindi quegli elementi di inizio e fine scorrimento circa un quarto di secondo più tardi.

L'errore si verifica quando si combina un div assoluto con figli relativi e un bambino con overflow:auto. Rimozione di una di queste cose risolve il bug, ma preferirei lasciarlo. Anche se sarei disposto a rimuovere la tabella e mostrarla separatamente (come in una finestra di dialogo), se necessario.

Il bug si presenta solo sul browser Android standard (e ovviamente sulla mia app PhoneGap). Finora ho provato con i seguenti dispositivi:

  • Samsung Galaxy Nexus (4.1.1)
  • Samsung Galaxy S III (4.1.2)

Qualsiasi l'aiuto è apprezzato ma preferirei una soluzione in cui l'HTML e la funzionalità non sono cambiati (o non troppo).

after quick scrolling

ho creato un minimal example che mostra il bug. È sufficiente aprire sul vostro Android e iniziare lo scorrimento e si dovrebbe vedere immediatamente il problema:

<!doctype html> 
<html> 
<head><meta name="viewport" content="initial-scale=1.0"></head> 
<body style="margin:0"> 

<div style="position:absolute;overflow:auto;top:100px;bottom:100px;width:100%"> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a quam arcu. Duis ultrices mollis nibh ut hendrerit. Etiam a interdum metus. Integer volutpat, nibh laoreet euismod suscipit, libero sem iaculis lorem, ut hendrerit magna orci eu elit. Nulla eu ultricies libero. Nulla facilisi. Maecenas nec turpis vitae magna lobortis ornare sit amet ut lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc vestibulum lobortis orci, sit amet ornare dui congue nec. Morbi id magna at turpis auctor ultricies. Ut rhoncus quam augue, ut consectetur risus.</p> 
    <div style="position:relative;background:red;">relative box<br>moves slower than the other text</div> 
    <p>Fusce congue orci a nunc gravida sed pretium lorem convallis. Etiam hendrerit, ligula eget lobortis vestibulum, arcu sapien pharetra magna, auctor suscipit nisl tellus quis lacus. Cras id elit at ante mollis venenatis. Donec eu sollicitudin odio. Aliquam erat volutpat. Cras et tortor sed mi faucibus sagittis non quis metus. Morbi mauris ante, posuere vel rutrum id, mattis id enim. Morbi purus quam, euismod facilisis blandit quis, commodo at justo. Aliquam in fermentum nibh. Curabitur pharetra blandit risus sit amet tristique. Suspendisse potenti. Curabitur interdum eleifend justo, et dapibus justo volutpat sed.</p>   
    <div style="overflow:auto"> 
    <table> 
     <tr><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th></tr> 
     <tr><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td></tr> 
    </table> 
    </div> 

</div> 
</body> 
</html> 
+0

potreste fornire un jsfiddle o un tinkerbin o liveweave –

+0

Ho aggiornato il post con un link. Questi servizi purtroppo non ti permettono di aggiungere meta header. – Thomas

+0

grazie, risposta aggiunta. –

risposta

29

In breve, i mali che stai soffrendo sono comuni e documentati. Gli elementi con overflow:auto o overflow:scroll soffrono di problemi di vernice/reflow/rendering nei browser desktop e mobili. Inoltre, ci sono problemi nei browser per dispositivi mobili (webkit sia su iOS che su Android) per quanto riguarda il non rendering di elementi relativi e assoluti se sono "fuori schermo". Ciò può comportare un ritardo durante lo scorrimento sullo schermo.

ci sono alcune "hack" spessori che si possono applicare:

element { 
    -webkit-overflow-scrolling: touch; 
} 

element > * { 
    -webkit-transform: translateZ(0px); 
} 

element > * { 
    -webkit-transform: translate3d(0,0,0); 
} 

qualche lettura per voi:

E un frammento ho copiato da da qualche parte nelle mie note e ora non riesco a trovare la fonte:

Soprattutto su siti che si basano molto su scroll, è possibile scoprire che il contenuto principale si basa su overflow: scroll. Questa è una vera sfida poiché questo scorrimento non viene accelerato in modo GPU in alcun modo, quindi il contenuto dello viene ridipinto ogni volta che l'utente scorre. È possibile aggirare gli errori utilizzando il normale scorrimento pagina (overflow: visibile) e la posizione : corretta.

+0

Grazie! BTW La citazione è da http://addyosmani.com/blog/devtools-visually-re-engineering-css-for-faster-paint-times/ – Thomas

+0

Gli ultimi due snippet CSS funzionano. Mi sento così stupido perché ne ho letto prima, ma in qualche modo non mi ero reso conto che dovevano applicarsi ai figli dell'elemento di scorrimento: D È importante quale uso riguardo alle prestazioni e al supporto? È consigliabile usarlo anche quando non ci sono problemi? Sono preoccupato che rallenterà il rendering, specialmente se ci sono molti elementi. – Thomas

+0

@Thomas - grazie per aver trovato la citazione ... Addy è un attivista web incredibile e dovresti leggere il suo ebook su modelli di design Javascript se non lo hai già fatto. –

2

Penso che tu abbia due problemi si sta cercando di risolvere. Il testo che scivola in basso e la velocità di scorrimento in ritardo?

Non sono sicuro di cosa si stia tentando di fare con il simbolo del copyright ma non avrei uno line-height inferiore a 1 o 1em. Prova ad usare un elemento genitore e stile lo span fuori da quello. Probabilmente puoi usare display:inline-block; vertical-align: middle; sullo span per ottenere l'effetto desiderato.

<p><span>&copy;</span>Some text</p> 

Per lo scorrimento dipende da cosa stai facendo. I browser per dispositivi mobili attendono 300ms per i tag <a> per vedere se si sta scorrendo o si fa clic su un collegamento. Potrebbe essere correlato a questo. Se è così, vorrei fare il checkout Google FastClick.

I browser mobili accelerano lo scorrimento delle pagine sul corpo. Quindi utilizzando div nested o position:absolute potrebbe impedirti di ottenere la velocità di scorrimento più elevata. Nelle versioni più recenti di Android e iOS è possibile utilizzare -webkit-overflow-scrolling: toccare per aiutare ma che non farà nulla per i telefoni più vecchi. Vorrei provare a non utilizzare la posizione assoluta perché basato sul tuo esempio non sembra essere necessario, anche utilizzando div nidificati che scorrono richiedono alcuni utenti di usare due dita all'interno del div per scorrere il contenuto. Cercherò anche di evitarlo e sostituire il design con modelli di progettazione più mobili come un collegamento che espande il contenuto verso il basso.

Un sacco di problemi di scorrimento sono venuti alla luce durante il tentativo di sostenere position:fixed sul cellulare se pensa che potrebbe essere la causa di esso e si vorrebbero leggere su di esso: http://bradfrostweb.com/blog/mobile/fixed-position/

+0

Ho solo un problema con alcuni elementi (postion: relative) che hanno un lag di scorrimento diverso, quindi quando lo si scorre sembra un po 'come lo scrolling del paralax. È difficile da spiegare, quindi ho aggiunto uno screenshot. Per i simboli di copyright ho copiato alcuni CSS dal nostro sito Web in cui abbiamo riscontrato un problema con alcuni browser che non rendevano correttamente super e subscript quando si trovavano in una cella di tabella con allineamento verticale: top. – Thomas

+0

Il div più esterno è l'area di contenuto della mia app.È assolutamente posizionato per lasciare spazio per l'intestazione e il piè di pagina. O c'è un modo migliore? L'errore scompare quando rimuovo la tabella, quindi l'overflow orizzontale sembra essere il problema. – Thomas

+0

non utilizzare la posizione assoluta. se solo per il mobile impila un'intestazione, un div di contenuto e un piè di pagina uno sopra l'altro con una larghezza del 100%. – Jesse

1

Rimuovere position:absolute e position:relative, sono NON è assolutamente necessario per questo layout e causa tutti i tuoi problemi.

Se lo desideri, puoi aggiungere un po 'di margin-top al tuo corpo.

PhoneGap produce un po 'di spazzatura html del genere, spero che tu abbia un buon controllo del CSS.

+0

Il codice pubblicato è solo un esempio minimo. Ho bisogno del posizionamento assoluto perché ho bisogno di animazioni e ho anche bisogno di mostrare il contenuto in una finestra di dialogo. E ho bisogno di un posizionamento relativo per posizionare i bambini assolutamente. In breve, ho bisogno di duplicare alcuni elementi di design del nostro sito web. E che spazzatura html PhoneGap intendi? È tutta la mia spazzatura: D – Thomas

+0

Posizione: relativa e posizione: l'assoluto è noto per causare problemi nei browser mobili e il supporto può variare molto. Sai come eseguire un'ispezione di Sviluppo Web remoto? È così che puoi giocare con il tuo CSS e vedere cosa funziona o no. Ecco come: https://developers.google.com/chrome-developer-tools/docs/remote-debugging Una volta impostato, sei il re. Sai come usare Dev Tools? –

+0

Purtroppo non riesco a rimuovere quelli. Soprattutto se il div esterno è un dialogo che deve essere assoluto. Sì, so come usare DevTools ma non l'ho mai fatto in remoto. Il metodo nel link che hai fornito sfortunatamente funziona solo per Chrome (dove funziona correttamente). Ma l'ho testato all'interno dell'app con la funzione di debug di PhoneGap Build. Sta usando [weinre] (http://people.apache.org/~pmuellr/weinre/docs/latest/) che darò un'occhiata a. – Thomas

0

In realtà c'è una semplice correzione CSS per questo, aggiungendo position:relative ai paragrafi risolvere il problema.

Prova questa:

<!doctype html> 
<html> 
<head><meta name="viewport" content="initial-scale=1.0"> 
<style> 
p{ position:relative;} 
</style> 
</head> 
<body style="margin:0"> 

<div style="position:absolute;overflow:auto;top:100px;bottom:100px;width:100%"> 

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a quam arcu. Duis ultrices mollis nibh ut hendrerit. Etiam a interdum metus. Integer volutpat, nibh laoreet euismod suscipit, libero sem iaculis lorem, ut hendrerit magna orci eu elit. Nulla eu ultricies libero. Nulla facilisi. Maecenas nec turpis vitae magna lobortis ornare sit amet ut lacus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc vestibulum lobortis orci, sit amet ornare dui congue nec. Morbi id magna at turpis auctor ultricies. Ut rhoncus quam augue, ut consectetur risus.</p> 
    <div style="position:relative;background:red;">relative box<br>moves slower than the other text</div> 
    <p>Fusce congue orci a nunc gravida sed pretium lorem convallis. Etiam hendrerit, ligula eget lobortis vestibulum, arcu sapien pharetra magna, auctor suscipit nisl tellus quis lacus. Cras id elit at ante mollis venenatis. Donec eu sollicitudin odio. Aliquam erat volutpat. Cras et tortor sed mi faucibus sagittis non quis metus. Morbi mauris ante, posuere vel rutrum id, mattis id enim. Morbi purus quam, euismod facilisis blandit quis, commodo at justo. Aliquam in fermentum nibh. Curabitur pharetra blandit risus sit amet tristique. Suspendisse potenti. Curabitur interdum eleifend justo, et dapibus justo volutpat sed.</p>   
    <div style="overflow:auto"> 
    <table> 
     <tr><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th> <th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th><th>test</th> <th>test</th><th>test</th><th>test</th><th>test</th><th>test</th></tr> 
     <tr><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td> <td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td><td>test</td> <td>test</td><td>test</td><td>test</td><td>test</td><td>test</td></tr> 
    </table> 
    </div> 

</div> 
</body> 
</html> 
+0

Sembra funzionare prima, ma la tabella e alcuni altri elementi sono ancora in leasing. Anche se lo applico a '#topdiv> *' la tabella è ancora in leasing. Forse c'è una soluzione, ma vado con la soluzione di trasformazione – Thomas

Problemi correlati