2014-07-24 7 views
7

-> Si prega di goto Modifica parte di questa domandasincronizzazione di due div di scorrimento non è corretta in iOS

voglio sincronizzare barra di scorrimento di due div e questo è come sto facendo

var div1 = document.getElementById('element1'), 
    div2 = document.getElementById('element2'); 

div1.addEventListener('touchmove', scrolled, false); 
div2.addEventListener('touchmove', scrolled, false); 

function getscrollTop(node) { 
    return node.pageYOffset || node.scrollTop; 
} 

function scrolled() { 

    var node = this, scrollTop = getscrollTop(node); 

    var percentage = scrollTop/(node.scrollHeight - node.clientHeight); 

    var other = document.getElementById({ 
     "element1": "element2", 
     "element2": "element1" 
    }[node.id]); 

    other.scrollTop = percentage * (other.scrollHeight - other.clientHeight); 

}; 

Fiddle -> utilizzato scroll invece touchmove

Ma il problema è che è tremolante nei dispositivi di fascia bassa e vorrebbe renderlo liscio in dispositivi di fascia bassa di evento.

Modifica

Ho usato qui di seguito il codice per lisciare lo scorrimento

var children = document.querySelectorAll('.scrolldiv'); 

var getscrollTop = function(node) { 
    return node.pageYOffset || node.scrollTop; 
}, toInt = function(n) { 
    return Math.round(Number(n)); 
}; 

window.setInterval(function() { 
    var scrollTop = getscrollTop(children[0]); 
    var percentage = scrollTop/(children[0].scrollHeight - children[0].clientHeight); 
    var oscrollTop = percentage * (children[1].scrollHeight - children[1].clientHeight); 
    // console.log(1); 
    children[1].scrollTop = toInt(oscrollTop); 
}, 2); 

E 'agevole nei browser desktop, ma in del browser iOS, quando si imposta la seconda div di scorrimento è masturbandosi, strappi nella impostazione dei sensi scrollTop una volta completato lo scorrimento, non durante lo scorrimento.

+0

forse questo ti aiuterà http://stackoverflow.com/questions/17722497/scroll-smoothly-to-specific-element-on-page – lordkain

+0

Una cosa che ho notato è sulla linea 17, stai chiamando una funzione "getscrollTop" (nodo) "che hai già come variabile scrollTop. Inoltre, dichiari "oscrollTop" come variabile e poi assegnalo direttamente a un oggetto alla fine della tua funzione ... assegnalo direttamente all'oggetto. Se sei preoccupato per le prestazioni nei dispositivi di fascia bassa, l'ottimizzazione del codice è estremamente importante. – Michael

+0

@Michael Grazie :) – Exception

risposta

4

Non vedo perché si debba calcolare una nuova percentuale qui, valore che si consegna al secondo scroll .. questo è probabilmente il motivo del jerking .. invece si potrebbe semplicemente prendere il valore di scroll dal primo scorrere e assegnarlo direttamente all'altro scorrimento .. Questo rimuoverà il movimento a scatti nell'altro scorrimento .. e sincronizzandoli ..

Ho appena aggiunto la seguente riga alla fine della tua funzione a scorrimento .. altro .scrollTop = getscrollTop (nodo);

La funzione di modifica: -

funzione scorrimento() {

var node = this, 
    scrollTop = getscrollTop(node); 

var id = node.id; 

var percentage = getscrollTop(node)/(node.scrollHeight - node.clientHeight); 

var other = document.getElementById({ 
    "element1": "element2", 
    "element2": "element1" 
}[id]); 

var oscrollTop = percentage * (other.scrollHeight - other.clientHeight) 

//other.scrollTop = oscrollTop; 
//Please note that I have commented out the above line.. and added the following line 
other.scrollTop = getscrollTop(node); 

};

Spero che questo sia il comportamento che speravi, l'ho testato su jsfiddle, entrambi gli scroll sono ben sincronizzati.

+0

La soluzione non funziona se entrambi gli elementi hanno altezze di scorrimento diverse – redV

+0

Ciao @redV, credo che il valore dell'altezza di scorrimento sia preso in relazione al suo scorrimento e dato che questo valore viene passato all'altro scorrimento lo fa sembrare che il valore sia effettivamente preso dall'altra scroll, quindi indipendentemente dall'altezza, ogni scroll scorrerà la stessa altezza in base a quel valore che viene passato, quindi sincronizzerà ancora i due scroll. –

+0

Sì, hai ragione. Penso che non sia necessario calcolare la percentuale :) – redV

5

Se si arrotonda i numeri a valore di scorrimento per interi allora questo problema scompare:

http://jsfiddle.net/2Cj4S/15/

ho appena usato una funzione di arrotondamento:

function toInt(n){ return Math.round(Number(n)); }; 

e questo sembra aver riparato. I doppi valori hanno davvero confuso i widget della GUI come le barre di scorrimento e il disegno 2D.

+0

Grazie per il suggerimento.Ma ho appena rimosso il gestore di scorrimento e ho utilizzato setInterval con 20 secondi per sincronizzare le posizioni di scorrimento di entrambi i DIV ed ora è abbastanza fluido. Modifica: E ho anche aggiunto il tuo suggerimento :) Posso sapere di più su quale sia la ragione dietro l'arrotondamento degli interi? – Exception

+0

Penso che abbia qualcosa a che fare con l'arrotondamento interno del componente di scorrimento. Non sono sicuro di me stesso. Inoltre se riduci gli eventi (come hai fatto tu) è un modo per non travolgere il componente. –

Problemi correlati