Die Zielsetzung
Ich habe also eine Liste von <div>
s in einem einspaltigen Layout, die entweder die Klasse "aktiv" oder "inaktiv" haben. Bei der aktiven Klasse wird rechts neben dem Element eine Grafik angezeigt, bei der inaktiven Klasse nicht. Ich habe es so eingerichtet, dass die "aktive" Klasse (und die dazugehörige Grafik) durch Drücken der Pfeiltaste nach oben oder unten zum vorherigen oder nächsten Element verschoben wird. Es ist nicht animiert, aber man kann visuell sehen, wie die Grafik verschwindet und auf dem Tag darüber oder darunter wieder auftaucht.
Jetzt möchte ich, dass die Seite beim Drücken der Pfeiltaste nach unten scrollt, so dass der obere Rand des Elements immer an der gleichen Stelle ist. Da die Elementliste größer ist als das Seitenfenster, muss der Browser automatisch gescrollt werden, damit das ausgewählte Element immer an der gleichen Stelle erscheint. <div>
ist immer in der Mitte des Bildschirms...
Der Kodex
//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)
}
});
Das Problem
Das Problem ist dass die window.scroll-Methode in allen Versionen von Safari, aber in keinem anderen Browser, leistungsmäßig ein wenig hinter der CSS-Klassenumschaltung zurückbleibt. Was passiert, ist, dass sie in zwei verschiedenen Redraw-Ereignissen landen und es so aussieht, als würde die Seite "glitchen", wenn man nach unten scrollt, weil man kurz die Grafik rechts vom nächsten Element sehen kann, bevor der Browser nach unten scrollt.
Die Live-Demo
Sie können es hier live sehen:
Verwenden Sie die Pfeiltasten, um durch die Einträge zu blättern. Beachten Sie den Sprung. Wie soll ich das Problem lösen?