目标
因此,我<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 类切换性能方面稍逊一筹。发生的情况是它们最终出现在两个不同的重绘事件中,当您向下滚动时,页面看起来像“小故障”,因为您可以在浏览器向下滚动之前简要地看到下一个元素右侧的图形。
现场演示
您可以在此处实时查看:
使用箭头键翻阅项目。注意跳跃。我应该如何解决这个问题?