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>

답변:


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 ()를 최고 - container.offset ()를 상단 + container.scrollTop ()..
— claviska

1
$ (document) .scrollTop (value)를 사용하여 전체 창을 스크롤 할 수 있습니다. 기본 jquery 코드는 브라우저 문제를 해결합니다.
— Chris Moschini 2016 년

7
scrollTo상단이 아닌 중앙에 배치 하려는 경우 :scrollTo.offset().top - container.offset().top + container.scrollTop() - (container.height()/2)
— Mahn

7
element.scrollIntoView()-그게 전부입니다. 애니메이션이 표준화되었습니다. 참조 developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
— WickyNilliams

7
코드 블록의 맨 끝에 "보이지 않는"문자가 있습니다. Chrome에서 Edge에서 문자가 유효하지 않은 것으로 간주됩니다. -복사
— -paster

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

괜찮아 보입니다-section2가 존재합니까? console.log (section2.length); 0이 아닌지 확인하십시오. 조금 예를 들어 보겠습니다.
— Dominic

왜 $('html,body')? 그는 특정 용기에만 필요합니다. 받아 들인 대답이 나에게 더 좋습니다. 나는 묻는 질문과 비슷한 경우가 있으며 귀하의 답변이 효과가 없었습니다.
— Petroff

2
내가 이것을 썼을 때 @Petroff는 이상하게도 요소가 스크롤 컨테이너에 있음을 알지 못했습니다. 사람들이 질문 제목으로 인해 본문을 스크롤하기 위해 Google 검색에서 여기로 왔기 때문에 답변을 그대로 두겠습니다.
— Dominic

30

나는 플러그인을 사용하는 Kevin과 다른 사람들에게 동의합니다.

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

완전히 단순해야 할 무언가를 위해 나는 온라인으로 다른 솔루션에 오랜 시간을 보냈지만이 간단한 라이너는 내가 필요한 것을 정확하게 수행합니다.
— Laurence Cope

3
이 방법은 전체 창에서 작동합니다. overflow : scroll이있는 내용을 스크롤하려면 작동하지 않습니다.
— Jeremy

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

애니메이션으로 완성 된 한 줄짜리 요점은 정확히 내가 필요한 것입니다. 감사!
— Scott Smith

No need for any plugins?? 그러나 당신은 jQuery를 사용합니다! 플러그인이 아니라 거대한 라이브러리입니다.
— 그린

1
jquery 라이브러리 참조 외에도 참조를 추가 할 필요가 없습니다. 또한 jquery는 일종의 산업 표준입니다. 왜 사용하지 않습니까? 아마도 jquery 없이는 가능하지만 구문 분석 부분을 위해 많은 코드를 작성해야합니다. 비생산적인 느낌입니다. 그리고 measy div로 스크롤하기 위해 플러그인에 전체를 작성하는 것은 비생산적이었습니다.
— lorddarq

4

scrollIntoView()자바 스크립트에서 메소드를 사용할 수 있습니다 . 그냥 줘id.scrollIntoView();

예를 들어

row_5.scrollIntoView();

애니메이션하는 방법?
— 그린

애니메이션 할 필요가 없습니다. scrollIntoView ()를 사용하면 컨트롤이 자동으로 스크롤되어 뷰에 표시됩니다.
— Tamilarasi 2016 년


2

컨테이너 중심으로 요소 스크롤

컨테이너 중앙에 요소를 가져옵니다.

코덱에 대한 데모

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

jQuery 와 JavaScript로 스크롤 할 수 있습니다. 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 im position ()이 모든 브라우저에서 작동하는지 확실하지 않습니다. 다른 곳에서 시도해 보았습니까? 아니면 사용중인 코드를보고 다른 것이 있는지 확인할 수 있습니까?
— Nlinscott

1

내장 자바 스크립트 scrollTo함수 가 있기 때문에 아무도 분명하지 않은 이유를 모르겠습니다 .

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

참조 .


6
scrollTo에는 두 개의 인수가 필요하며 하나만 작성했습니다.
— NuclearPeon

2
... 창 개체에서 호출됩니다.
— 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;

다시 데모를보십시오 를 살펴보고 실제로 작동하는지 확인하십시오.

대상 위치를 반환하고 창 및 비 창문 스크롤 컨테이너 모두에서 작동하는 함수의 경우이 요점을 자유롭게 사용 하십시오. . 여기에있는 의견은 위치 계산 방법을 설명합니다.

처음에는 애니메이션 스크롤을 위해 플러그인을 사용하는 것이 가장 좋겠다고 말했습니다 . 그러나 전환없이 대상으로 이동하려면 플러그인이 필요하지 않습니다. @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 크기가 너무 커서 scenerio 스크롤 이이 특정 div로 내려 가지 않으면 한 가지 문제가 발생합니다.

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

        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.