L'obiettivo
Così ho un elenco di <div>
è tutto in un layout a colonna singola che hanno sia la classe "attivo" o "inattivo". La classe attiva mostra un grafico a destra dell'elemento e la classe inattiva no. L'ho configurato in modo che premendo il tasto freccia su o giù si sposti la classe "attiva" (e l'immagine con essa) alla voce precedente o successiva. Non è animato, ma puoi visivamente vedere la grafica scomparire e riapparire sul tag sopra o sotto.JavaScript ritardo window.scroll provoca asincrono ridisegnare
Ora mi piacerebbe avere la pagina scorrere verso il basso sulla freccia premere il tasto in modo che il bordo superiore dell'articolo sia sempre nello stesso punto. Dal momento che la lista degli elementi è più grande della finestra pagina, è necessario scorrere automaticamente il browser in modo che il selezionato <div>
è sempre al centro dello schermo ...
Il Codice
//Paging through items with arrow keys
theWindow.keydown(function (e) {
var key = e.keyCode,
oldItem = $('li.active')
if ((key === 40 && oldItem.next().length) || (key === 38 && oldItem.prev().length)) {
var theWindowMod = (window.innerHeight/2) + 43,
theHTML = $('html'),
theDetail = $('.detail')
theHTML.addClass('notransition')
if (key === 40 && oldItem.next().length) {
oldItem.removeClass('active').next().addClass('active')
} else if (key === 38 && oldItem.prev().length) {
oldItem.removeClass('active').prev().addClass('active')
}
var newItem = $('li.active')
window.scroll(0, newItem.offset().top - theWindowMod)
e.preventDefault()
$('.detail-inner.active').fadeOut(0).removeClass('active')
$('section.active, .tab.active').removeClass('active')
newItem.find('.tab').add(theDetail).addClass('active')
theDetail.find('.detail-' + newItem.attr('class').split(' ')[0]).addClass('active').fadeIn(0)
setTimeout(function() {
theHTML.removeClass('notransition')
}, 1)
}
});
Il problema
Il problema è che in tutte le versioni di Safari ma nessun altro browser, il metodo window.scroll è solo un po 'indietro rispetto alle prestazioni di commutazione della classe CSS. Quello che succede è che finiscono in due diversi eventi di ridisegno e sembra che la pagina sia "glitching" quando scorri verso il basso perché puoi vedere brevemente il grafico a destra dell'elemento successivo prima che il browser scorra verso il basso.
La Live Demo
È possibile visualizzare dal vivo qui:
Utilizzare i tasti freccia per scorrere gli elementi. Notare il salto. Come dovrei andare a risolvere questo?
webkit è l'unico che ha gradiente _and_ lineare gradiente nella hashtagly.css '.right-bg, .left-bg {... background-image: -webkit-gradiente (.. . il resto usa solo il gradiente lineare (nessun safari da testare però) ... un sacco di dup css li dentro – technosaurus
Ho riposto le mie speranze che questa risposta sia stata soddisfatta, ma grazie per l'avviso. Devo dimagrire il codice è grande. – alt
Per risolvere il problema, è possibile animare lo scorrimento della pagina o utilizzare in qualche modo le animazioni per evitare il problema. – tiffon