ScrollTop 跳到错误的顶部

ScrollTop goes to the wrong top

我有一个物品清单。当我单击一个项目(项目)时,它会打开(没关系)并滚动到页面顶部(错误的顶部!)。当我有一个打开的项目并且我决定打开下面的项目时出现问题:顶部位置增加了打开的项目高度,我点击的第二个项目超出了顶部。

按照下面的FIDDLE:如果我打开project1然后点击project2,这就出错了最佳。如果我尝试在另一个打开的项目下方打开任何项目,则相同。

JS

$('.accordion-section-title').on('click', function () {
    var idName = $(this).attr('id');

    $('html, body').animate({
        scrollTop: $("#" + idName).offset().top
    }, 500);
});

这是FIDDLE

问题似乎是 .slideUp().slideDown() 方法在 window 滚动的同时进行动画处理。当 window 滚动到右侧 Y 坐标时,手风琴部分的高度已经改变,从而导致 window 最终出现在错误的位置。

我确信还有其他方法可以实现正确的滚动位置,但我的第一个想法是在页面加载后存储初始 Y 位置。这可以通过以下方式完成:

$('.accordion-section-title').each(function() {
  $(this).data('ypos', $(this).offset().top)
})

每个 .accordion-section-title 元素都将其 Y 位置存储在名为 ypos 的数据属性中。稍后当您滚动 window 时,不要滚动到元素 位置 ,而是滚动到其 存储的初始位置 。换句话说,将 scrollTop: $("#" + idName).offset().top 更改为 scrollTop: $("#" + idName).data('ypos')。与您的代码放在一起,它将如下所示:

$('.accordion-section-title').on('click', function(e) {
  var idName = $(this).attr('id');
  $('html, body').animate({
    scrollTop: $("#" + idName).data('ypos') - 10
  }, 500);
});

您可以在 this fiddle

中看到结果如何