目標
したがって<div>
、クラス「アクティブ」または「非アクティブ」のいずれかを持つすべての s のリストが単一の列レイアウトにあります。アクティブなクラスはアイテムの右側にグラフィックを表示し、非アクティブなクラスは表示しません。上下の矢印キーを押すと、「アクティブな」クラス(およびそれを含むグラフィック)が前または次の項目に移動するように設定しました。アニメーション化されていませんが、上または下のタグでグラフィックが消えたり再表示されたりするのを視覚的に確認できます。
ここで、アイテムの上端が常に同じ場所にあるように、矢印キーを押してページを下にスクロールしたいと思います。要素リストはページ ウィンドウよりも大きいため、ブラウザを自動的にスクロールして、選択した要素<div>
が常に画面の中央に表示されるようにする必要があります...
コード
//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)
}
});
問題
問題は、すべてのバージョンの Safari で、他のブラウザーではなく、window.scroll メソッドが CSS クラス切り替えのパフォーマンスの点でわずかに遅れていることです。ブラウザが下にスクロールする前に、次の要素の右側にグラフィックが短時間表示されるため、下にスクロールするとページが「グリッチ」しているように見えます。
ライブデモ
ここでライブを見ることができます:
矢印キーを使用してアイテムのページをめくります。ジャンプに注意してください。これを解決するにはどうすればよいですか?