将元素滚动到可滚动容器中的视图中

Posted

技术标签:

【中文标题】将元素滚动到可滚动容器中的视图中【英文标题】:Scroll element into view in scrollable container 【发布时间】:2013-12-04 17:56:49 【问题描述】:

我有一个带有硬编码高度的滚动容器:

.scrollingContainer 
    overflow: scroll;
    height: 400px;

此滚动容器包含一个项目列表,当我单击要滚动容器的项目时,单击的项目位于滚动容器的顶部。

$('.scrollingContainer li a').click( function(event) 
  var vpHeight = $('.scrollingContainer').height();
  var offset = $(this).offset();
  $('.scrollingContainer').animate(
    scrollTop: vpHeight - offset.top
  , 500);
);

以上是我目前所拥有的,我无法进行需要执行的数学计算。另外我认为var offset 值不正确,因为它似乎是从页面顶部获取偏移量,我希望根据它在滚动容器中的位置获取偏移值。

任何帮助表示赞赏!

【问题讨论】:

这是一个小提琴。它是否说明了问题?它似乎工作。 jsfiddle.net/isherwood/LqQGR 是的,问题是我并没有真正控制它滚动到的位置。此外,如果我单击两次,它会滚动两次,而不是停留在先前滚动到的位置。 【参考方案1】:

this answer 的变体可以解决问题:

var myContainer = $('.scrollingContainer')

$(myContainer).on('click', 'a', function () 
  var scrollTo = $(this);

  myContainer.animate(
    scrollTop: scrollTo.offset().top - myContainer.offset().top + myContainer.scrollTop()
  );
);

Fiddle demo

【讨论】:

【参考方案2】:

这是一个活生生的例子:http://jsfiddle.net/LqQGR/12/

你想将你的scrollTop设置为元素的位置(容器顶部和链接之间的距离)加上当前的scrollTop(包含的顶部之间的距离 内容及其可见的当前位置。

另外:您需要将您的 scrollingContainer 设置为 position: relative,以便它是其中内容的 offset parent。

var $scrollingContainer = $('.scrollingContainer');

$scrollingContainer.on('click', 'a', function (event) 
    var scrollTop = $scrollingContainer.scrollTop();
    var link      = $(event.currentTarget);
    var position  = link.position();

    $scrollingContainer.animate(
        scrollTop: position.top + scrollTop
    , 500);
);

顺便说一句,我的答案优于将点击事件侦听器单独添加到所有锚标记的答案。这只增加了一个监听器,性能更高。 Read more about delegated events

【讨论】:

以上是关于将元素滚动到可滚动容器中的视图中的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin c# 中滚动到可观察集合中的选定项目

以编程方式滚动到可扩展列表视图的底部,最后一项内容很大

使用纯 Javascript 滚动到可滚动 DIV 内的元素

使用纯 Javascript 滚动到可滚动 DIV 内的元素

容器视图和滚动视图呈现偏移的表示

将内容附加到列表时保持滚动位置(AngularJS)