如何使用jQuery滚动到特定项目?


252

我有一张带垂直滚动条的大桌子。我想使用jQuery / Javascript滚动到此表中的特定行。

有内置的方法可以做到这一点吗?

这是一个小例子。

div {
    width: 100px;
    height: 70px;
    border: 1px solid blue;
    overflow: auto;
}
<div>
    <table id="my_table">
        <tr id='row_1'><td>1</td></tr>
        <tr id='row_2'><td>2</td></tr>
        <tr id='row_3'><td>3</td></tr>
        <tr id='row_4'><td>4</td></tr>
        <tr id='row_5'><td>5</td></tr>
        <tr id='row_6'><td>6</td></tr>
        <tr id='row_7'><td>7</td></tr>
        <tr id='row_8'><td>8</td></tr>
        <tr id='row_9'><td>9</td></tr>
    </table>
</div>

Answers:


562

死了很简单。无需插件

var $container = $('div'),
    $scrollTo = $('#row_8');

$container.scrollTop(
    $scrollTo.offset().top - $container.offset().top + $container.scrollTop()
);

// Or you can animate the scrolling:
$container.animate({
    scrollTop: $scrollTo.offset().top - $container.offset().top + $container.scrollTop()
});​

这是一个工作示例

的文档scrollTop


4
如果容器具有滚动条,则需要考虑scrollTop:scrollTo.offset()。top-container.offset()。top + container.scrollTop()
claviska 2011年

1
您可以使用$(document).scrollTop(value)滚动整个窗口-底层的jquery代码可以为您解决浏览器问题。
克里斯·莫斯奇尼

7
如果您想scrollTo居中而不是在顶部:scrollTo.offset().top - container.offset().top + container.scrollTop() - (container.height()/2)
Mahn 2014年

7
element.scrollIntoView()-仅此而已。动画是标准化的。参见developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
WickyNilliams

7
请注意,在代码块的末尾有一个“不可见”字符。在Edge(镶边)中,该字符被视为无效。-复制副本
攻击性的

114

我意识到这不能解决在容器中滚动的问题,但是人们发现它很有用,因此:

$('html,body').animate({scrollTop: some_element.offset().top});

我们同时选择html和body,因为文档滚动条可能位于其中之一,并且很难确定哪个滚动条。对于现代浏览器,您可以使用$(document.body)

或者,转到页面顶部:

$('html,body').animate({scrollTop: 0});

或不带动画:

$(window).scrollTop(some_element.offset().top);

要么...

window.scrollTo(0, some_element.offset().top); // native equivalent (x, y)

你好@infensus,你能给我一个有效的例子,说明我的这个不起作用吗?我用var section2 = $('#section-2'); $('html,body')。animate({scrollTop:section2.offset()。top});
dll_onFire 2013年

看起来不错-您确定存在section2吗?做console.log(section2.length); 并确保它不为0。稍后将举例说明。
多米尼克

为什么$('html,body')呢 他只需要在特定的容器中。接受的答案对我来说更好。我有类似的问题,例如询问的问题,您的回答对我不起作用。
彼得罗夫2015年

2
@Petroff奇怪的是,当我写这篇文章时,我没有注意到该元素在滚动容器中。我会留下我的答案,因为问题的标题使人​​们从Google搜索中来到此处来滚动身体
Dominic 2015年

30

我同意Kevin和其他人的观点,为此使用插件是没有意义的。

window.scrollTo(0, $("#element").offset().top);

对于那些应该如此简单的事情,我花了很多年时间在网上找到其他解决方案,但是这种简单的班轮恰好满足了我的需求。
劳伦斯·科普,2013年

3
应当指出,这种方式适用于整个窗口。如果您要滚动显示具有overflow:scroll的内容,则此方法将无效。
杰里米

12

我自己做到了。无需任何插件。查看我的要点

// Replace #fromA with your button/control and #toB with the target to which     
// You wanna scroll to. 
//
$("#fromA").click(function() {
    $("html, body").animate({ scrollTop: $("#toB").offset().top }, 1500);
});

一线要点,加上动画,正是我所需要的。谢谢!
史考特史密斯(Smith Smith)

No need for any plugins?? 但是您使用jQuery!它吓坏了巨大的库,甚至没有插件。
绿色

1
我注意到,除了jquery库引用之外,您无需添加引用。再加上jquery是一种行业标准。您为什么不使用它?如果没有jquery,这可能是完全可行的,但是仍然需要有人为解析部分编写大量代码。感觉适得其反。写一个完整的插件只是为了滚动到一个简单的div感觉适得其反。
lorddarq

4

您可以scrollIntoView()在javascript中使用method。只是给id.scrollIntoView();

例如

row_5.scrollIntoView();

如何制作动画?
绿色

无需动画。当您使用scrollIntoView()时,控件将自动滚动以使其显示在视图中。
Tamilarasi


2

将元素滚动到容器的中心

将元素带到容器的中心。

CODEPEN上的演示

JS

function scrollToCenter() {
  var container = $('.container'),
    scrollTo = $('.5');

  container.animate({
    //scrolls to center
    scrollTop: scrollTo.offset().top - container.offset().top + scrollTo.scrollTop() - container.height() / 2
  });
}

的HTML

<div class="container">
   <div class="1">
    1
  </div>
  <div class="2">
    2
  </div>
  <div class="3">
    3
  </div>
  <div class="4">
    4
  </div>
  <div class="5">
    5
  </div>
  <div class="6">
    6
  </div>
  <div class="7">
    7
  </div>
  <div class="8">
    8
  </div>
  <div class="9">
    9
  </div>
  <div class="10">
    10
  </div>


</div>
<br>
<br>
<button id="scroll" onclick="scrollToCenter()">
  Scroll
</button>

的CSS

.container {
  height: 60px;
  overflow-y: scroll;
  width 60px;
  background-color: white;
}

它不精确到中心,但是您不会在较大的较大元素上识别它。


2

您可以通过jQueryJavaScript进行滚动, 只需要两个元素jQuery和以下JavaScript代码即可:

$(function() {
  // Generic selector to be used anywhere
  $(".js-scroll-to-id").click(function(e) {

    // Get the href dynamically
    var destination = $(this).attr('href');

    // Prevent href=“#” link from changing the URL hash (optional)
    e.preventDefault();

    // Animate scroll to destination
    $('html, body').animate({
      scrollTop: $(destination).offset().top
    }, 1500);
  });
});


1

我做了其他人一起发布的内容。简单流畅

 $('#myButton').click(function(){
        $('html, body').animate({
            scrollTop: $('#scroll-to-this-element').position().top },
            1000
        );
    });

@AnriëtteMyburgh无法确定position()是否可在所有浏览器中正常工作。您是否曾在其他人中尝试过该工具以查看其是否有效?或者我可以查看您正在使用的代码,看看是否还有其他错误?
Nlinscott 2014年

1

不知道为什么没有人说清楚,因为有内置的javascript scrollTo函数:

scrollTo( $('#element').position().top );

参考


6
scrollTo需要两个参数,您只写了一个。
NuclearPeon 2014年

2
...并且在window对象上调用它。
hashchange

1

相反的是这里大多数人所提出的建议,我建议你,如果你想动画移动使用插件。仅对scrollTop设置动画不足以提供流畅的用户体验。在这里查看我的答案以进行推理。

这些年来,我尝试了许多插件,但最终还是自己写了一个。您可能需要一下:jQuery.scrollable。使用它,滚动动作变为

$container.scrollTo( targetPosition );

但这还不是全部。我们也需要确定目标位置。您在其他答案中看到的计算,

$target.offset().top - $container.offset().top + $container.scrollTop()

大部分有效,但并不完全正确。它不能正确处理滚动容器的边界。根据边框的大小,目标元素向上滚动太远。这是一个演示。

因此,计算目标位置的更好方法是

var target = $target[0], 
    container = $container[0];

targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;

同样,请看一下演示以实际操作它。

对于返回目标位置并适用于窗口和非窗口滚动容器的函数,请随时使用此gist。其中的注释说明了位置的计算方法。

一开始,我曾说过最好使用插件进行动画滚动。但是,如果您想在不进行过渡的情况下跳转到目标,则不需要插件。为此,请参阅@James答案,但是如果容器周围有边界,请确保正确计算目标位置。


0

对于它的价值,这是我设法通过滚动(不知道容器)可以位于DIV内的常规元素实现这种行为的方式

它会创建目标元素高度的假输入,然后将焦点放在目标上,无论您在可滚动层次结构中有多深,浏览器都会处理其余部分。奇迹般有效。

var $scrollTo = $('#someId'),
inputElem = $('<input type="text"></input>');

$scrollTo.prepend(inputElem);
inputElem.css({
  position: 'absolute',
  width: '1px',
  height: $scrollTo.height()
});
inputElem.focus();
inputElem.remove();

0

我做了这个组合。它为我工作。但如果单击鼠标移动该div尺寸太大而导致场景无法滚动到该特定div,则面临一个问题。

 var scrollDownTo =$("#show_question_" + nQueId).position().top;
        console.log(scrollDownTo);
        $('#slider_light_box_container').animate({
            scrollTop: scrollDownTo
            }, 1000, function(){
        });

        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.