Làm cách nào để cuộn đến mục cụ thể bằng jQuery?


252

Tôi có một cái bàn lớn với thanh cuộn dọc. Tôi muốn cuộn đến một dòng cụ thể trong bảng này bằng jQuery / Javascript.

Có phương pháp tích hợp để làm điều này?

Dưới đây là một ví dụ nhỏ để chơi với.

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>

Câu trả lời:


562

Chết một cách đơn giản. Không có plugin cần thiết .

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()
});​

Dưới đây là một ví dụ làm việc .

Tài liệu choscrollTop .


4
Nếu vùng chứa có thanh cuộn, bạn sẽ cần tính đến scrollTop: scrollTo.offset (). Top - container.offset (). Top + container.scrollTop ()
claviska

1
Bạn có thể cuộn toàn bộ cửa sổ với $ (tài liệu) .scrollTop (giá trị) - mã jquery cơ bản giải quyết các vấn đề trình duyệt cho bạn.
Chris Moschini

7
Nếu bạn muốn scrollTotập trung hơn là ở trên cùng:scrollTo.offset().top - container.offset().top + container.scrollTop() - (container.height()/2)
Mahn

7
element.scrollIntoView()- Đó là tất cả những gì được yêu cầu. Hoạt hình được chuẩn hóa. Xem developer.mozilla.org/en-US/docs/Web/API/Euity/scrollIntoView
WickyNilliams

7
Lưu ý rằng có một ký tự "vô hình" ở cuối khối mã. Ký tự được coi là không hợp lệ trong Edge, chrome. - một paster sao chép
Tấn công

114

Tôi nhận ra điều này không trả lời cuộn trong một container nhưng mọi người đang thấy nó hữu ích vì vậy:

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

Chúng tôi chọn cả html và body vì trình cuộn tài liệu có thể nằm trên một trong hai và thật khó để xác định đó. Đối với các trình duyệt hiện đại, bạn có thể thoát khỏi $(document.body).

Hoặc, để đi đến đầu trang:

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

Hoặc không có hình ảnh động:

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

HOẶC LÀ...

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

xin chào @infiversity bạn có thể cho tôi một ví dụ làm việc về nguyên nhân này của tôi không hoạt động? tôi đã sử dụng var part2 = $ ('# phần-2'); $ ('html, body'). animate ({scrollTop: part2.offset (). top});
dll_onFire

Điều đó có vẻ tốt - bạn có chắc phần 2 tồn tại? làm console.log (phần2.length); và chắc chắn rằng nó không 0. Sẽ làm một ví dụ trong một chút.
Đaminh

Tại sao $('html,body')? Anh ta chỉ cần trong container cụ thể. Câu trả lời được chấp nhận là tốt hơn cho tôi. Tôi có trường hợp tương tự như câu hỏi và câu trả lời của bạn không làm việc cho tôi.
Petroff

2
@Petroff thật kỳ lạ khi tôi viết bài này, tôi không nhận thấy phần tử này nằm trong một hộp chứa cuộn. Mặc dù vậy, tôi sẽ để lại câu trả lời của mình vì mọi người đến đây từ một tìm kiếm của Google để cuộn cơ thể do tiêu đề câu hỏi
Dominic

30

Tôi đồng ý với Kevin và những người khác, sử dụng một plugin cho việc này là vô nghĩa.

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

Đối với một cái gì đó rất đơn giản, tôi đã dành nhiều năm cho các giải pháp trực tuyến khác, nhưng một lớp lót đơn giản này thực hiện chính xác những gì tôi cần.
Laurence đối phó

3
Cần lưu ý, cách này hoạt động cho toàn bộ cửa sổ. Nếu bạn muốn cuộn nội dung có tràn: cuộn thì điều này sẽ không hoạt động.
Jeremy

12

Tôi quản lý để làm điều đó bản thân mình. Không cần bất kỳ plugin nào. Kiểm tra ý chính của tôi :

// 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);
});

Ý chính một dòng của bạn, hoàn chỉnh với hình ảnh động, chính xác là những gì tôi cần. Cảm ơn!
Scott Smith

No need for any plugins?? Nhưng bạn sử dụng jQuery! Nó là một thư viện khổng lồ, thậm chí không phải là một plugin.
Xanh

1
Tôi nghĩ bạn không cần thêm phần giới thiệu ngoài tài liệu tham khảo thư viện jquery. Plus jquery là loại tiêu chuẩn công nghiệp. Tại sao bạn không sử dụng nó? Nó có thể hoàn toàn có thể thực hiện được nếu không có jquery, nhưng nó vẫn sẽ yêu cầu ai đó viết rất nhiều mã chỉ cho phần phân tích cú pháp. Nó cảm thấy phản tác dụng. Và nó cảm thấy phản tác dụng khi viết một plugin đầy đủ chỉ để cuộn đến một div sởi.
lorddarq

4

Bạn có thể sử dụng scrollIntoView()phương pháp trong javascript. chỉ choid.scrollIntoView();

Ví dụ

row_5.scrollIntoView();

Làm thế nào để hoạt hình?
Xanh

Không cần phải hoạt hình. Khi bạn sử dụng scrollIntoView (), điều khiển sẽ được tự động cuộn để hiển thị nó trong chế độ xem.
Tamilarasi


2

Di chuyển phần tử đến trung tâm của container

Để đưa các yếu tố vào trung tâm của container.

DEMO trên CODEPEN

Mã não

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;
}

Nó không chính xác với trung tâm nhưng bạn sẽ không nhận ra nó trên các yếu tố lớn hơn lớn hơn.


2

Bạn có thể cuộn bằng jQueryJavaScript Chỉ cần hai yếu tố jQuery và mã JavaScript này:

$(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

Tôi đã làm một sự kết hợp của những gì người khác đã đăng. Nó đơn giản và trơn tru

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

@ AnriëtteMyburgh im không chắc chắn nếu vị trí () có chức năng trên tất cả các trình duyệt. Bạn đã thử nó ở những người khác để xem nếu nó hoạt động? Hoặc tôi có thể xem mã bạn đang sử dụng và xem có gì khác không?
Nlinscott

1

Không chắc chắn tại sao không ai nói điều hiển nhiên, vì có một scrollTohàm javascript tích hợp:

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

Tham khảo .


6
scrollTo yêu cầu hai đối số, bạn chỉ được viết bằng một.
NuclePeon

2
... và nó được gọi trên đối tượng cửa sổ.
trao đổi

1

Trái với những gì hầu hết mọi người ở đây đang đề xuất, tôi khuyên bạn nên sử dụng một plugin nếu bạn muốn làm động tác di chuyển. Chỉ hoạt hình scrollTop là không đủ cho trải nghiệm người dùng mượt mà. Xem câu trả lời của tôi ở đây cho lý do.

Tôi đã thử một số plugin trong những năm qua, nhưng cuối cùng đã tự viết một cái. Bạn có thể muốn cung cấp cho nó một spin: jQuery.scrollable . Sử dụng đó, hành động cuộn trở thành

$container.scrollTo( targetPosition );

Nhưng đó không phải là tất cả. Chúng ta cũng cần sửa vị trí mục tiêu. Tính toán bạn thấy trong các câu trả lời khác,

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

chủ yếu là hoạt động nhưng không hoàn toàn chính xác. Nó không xử lý đường viền của thùng chứa cuộn đúng cách. Phần tử đích được cuộn lên quá xa, theo kích thước của đường viền. Đây là một bản demo.

Do đó, một cách tốt hơn để tính toán vị trí mục tiêu là

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

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

Một lần nữa, hãy xem bản demo để thấy nó hoạt động.

Đối với một chức năng trả về vị trí đích và hoạt động cho cả vùng chứa cuộn cửa sổ và không phải cửa sổ, hãy sử dụng ý chính này . Các ý kiến ​​trong đó giải thích cách tính vị trí.

Ban đầu, tôi đã nói rằng tốt nhất nên sử dụng một plugin để cuộn hoạt hình . Tuy nhiên, bạn không cần một plugin, nếu bạn muốn nhảy đến mục tiêu mà không cần chuyển đổi. Xem câu trả lời của @James cho điều đó, nhưng hãy đảm bảo bạn tính toán chính xác vị trí mục tiêu nếu có đường viền xung quanh container.


0

Đối với giá trị của nó, đây là cách tôi quản lý để đạt được hành vi như vậy đối với một yếu tố chung có thể ở bên trong DIV bằng cách cuộn (mà không cần biết container)

Nó tạo ra một đầu vào giả về chiều cao của phần tử đích, sau đó đặt trọng tâm vào nó và trình duyệt sẽ quan tâm đến phần còn lại cho dù bạn có ở sâu trong hệ thống phân cấp có thể cuộn của bạn. Hoạt động như một lá bùa.

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

Tôi đã làm sự kết hợp này. nó làm việc cho tôi nhưng phải đối mặt với một vấn đề nếu nhấp di chuyển kích thước div quá lớn mà cuộn scenerio không xuống div cụ thể này.

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

        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.