사업부의 하단으로 스크롤?


807

레일에서 아약스 요청을 사용하여 채팅을 만들고 있으며 많은 운없이 div를 맨 아래로 스크롤하려고합니다.

이 div의 모든 것을 감싸고 있습니다.

#scroll {
    height:400px;
    overflow:scroll;
}

JS를 사용하여 기본적으로 맨 아래로 스크롤하는 방법이 있습니까?

아약스 요청 후 맨 아래로 스크롤하는 방법이 있습니까?

답변:


1324

내 사이트에서 사용하는 내용은 다음과 같습니다.

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;

13
이 방법은 모든 브라우저에서 정상입니까?
jondinham

1
@PaulDinh : 방금 이것을 살펴 보았고 scrollHeight를 사용하여 IE7 이하에 문제가 있습니다. IE7에 대한 작업 주위에있을 것 같다 않습니다 여기 .
Sean

2
div 안에 요소를 동적으로 추가 한 후에 왜 작동하지 않습니까?
Vince

3
@Vince-일회성 거래입니다. 내용을 변경하면 다시 실행해야합니다. 이 명령은 기본적으로 "스크롤 막대를이 위치로 이동"이라고 말합니다.
DrFriedParts

8
또한 예를 들어 div 안에 요소가 있으면 특정 요소를 스크롤하여 볼 수 있습니다. (즉, 요소는 부모 div 안에 표시됩니다.) 다음과 같습니다. $ ( "#"+ instanceID) .scrollTop ($ ( "#"+ instanceID) [0] .scrollIntoView);
netfed

360

jQuery scrollTop을 사용하는 경우 훨씬 쉽습니다 .

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);

272
이것이 더 쉬운 방법은 무엇입니까?
captainspi

78
2 대신 1 행? 실마리는 없지만 JQuery로 쉽게 할 수있는 일은 다음과 같이 동작을 애니메이션하는 것입니다. $ ( "# div-id"). animate ({scrollTop : $ ( "# div-id") [0] .scrollHeight}, 1000 ); 이것이 누구에게나 도움이되기를 바랍니다 :)
Samuel

28
jQuery 요소에서 dom 요소를 가져 와서 scrollHeight를 얻으려면 [0]이 필요합니다.
Jimmy Bosse

14
"JQ는 말할 것도없고 이해하기가 더 어렵다!" 순전히 의견. 예를 들어 JQuery를 읽고 이해하고 작업하는 것이 훨씬 쉽습니다. 그리고 어쨌든 JQuery를 이미 사용하고 있다면이 솔루션이 더 좋습니다.
Hanna

47
자신을 반복하지 않고 :$("#mydiv").scrollTop(function() { return this.scrollHeight; });
Eric

98

다음 코드를 사용할 수 있습니다 :

function scrollToBottom (id) {
   var div = document.getElementById(id);
   div.scrollTop = div.scrollHeight - div.clientHeight;
}

JQuery 로 부드러운 스크롤 을 수행하려면

function scrollSmoothToBottom (id) {
   var div = document.getElementById(id);
   $('#' + id).animate({
      scrollTop: div.scrollHeight - div.clientHeight
   }, 500);
}

JSFiddle 를 참조하십시오

이것이 작동하는 이유는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

참조 : scrollTop , scrollHeight , clientHeight


92

사용 의 jQuery 애니메이션을 :

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);

5
그것이 Sam 이이 의견 에서 말한 것입니다 . 그래도 실제 답변에 더 유용 할 것입니다!
Quentin Pradet

6
이 답변이 .stop ()을 사용 하여 여러 애니메이션 문제를 방지 하는 방법에 주목하십시오 .
kalyfe

놀랍게도 이것은 이전의 모든 응답에서 나를 위해 일하는 유일한 것입니다. 스크롤을 계속해야하는 레이어 주위에 다른 div가 설정되어 있기 때문일 수 있습니다.
Duniyadnd

이것은 나를 위해 일한 유일한 사람이었습니다 (텍스트가 아닌 이미지를 추가하고 있습니다)
john ktejik


31

모든 최신 브라우저 에서 작동하는 최신 방법 :

this.scrollIntoView(false);

1
: 이것은 단지 파이어 폭스에서 작동 생각 developer.mozilla.org/en/docs/Web/API/Element/...
하기 Amrit Kahlon

3
지원에는 실제로 ATM이 부족하지만 이것이 받아 들여지면 대단 할 것입니다.
Kristjan Liiva

업데이트가 있습니까? 나는 이것이 좋은 대답으로 받아 들여 져야한다고 생각합니다. jQuery를 사용한다는 의미입니까?
lkahtz 2016 년

작업 중 : document.querySelector ( ". mdl-list"). scrollIntoView (false);
Johann Medina

15

자바 스크립트로 부드러운 스크롤 :

document.getElementById('messages').scrollIntoView({ behavior: 'smooth', block: 'end' });


8

에 의존하지 않으려면 scrollHeight다음 코드가 도움이됩니다.

$('#scroll').scrollTop(1000000);

1
귀하의 솔루션을 포함한 위의 솔루션 중 어느 것도 Android의 Firefox에서 작동하지 않는 것 같습니다.
Kaya Toast

걱정하지 마세요. 너무 큰 숫자 ( 1E10)를 사용하고있었습니다. 적은 수의 작품
andrewtweber

그것은 항상 중요하다
Ben Taliadoros

4
왜 성능이 좋지 않습니까? 각 픽셀을 반복하는 것과는 다릅니다. 이제 나쁜 연습이 또 다른 질문입니다…
devios1

$ ( '# scroll'). scrollTop (Infinity), 그러면 작동합니다.
Madhav Poudel

5

jQuery를 사용하여 scrollTop 은 주어진 요소에 대한 scollbar의 세로 위치를 설정하는 데 사용됩니다. 애니메이션과 다른 옵션 ( 데모 ) 으로 스크롤하는 데 사용되는 멋진 jquery scrollTo 플러그인이 있습니다.

var myDiv = $("#div_id").get(0);
myDiv.scrollTop = myDiv.scrollHeight;

아래로 스크롤하면서 jQuery의 애니메이션 메소드 를 사용 하여 애니메이션 을 추가하려면 다음 스 니펫을 확인하십시오.

var myDiv = $("#div_id").get(0);
myDiv.animate({
    scrollTop: myDiv.scrollHeight
  }, 500);

4

같은 문제가 발생했지만 추가 제약이 있습니다. 스크롤 컨테이너에 새 요소를 추가하는 코드를 제어 할 수 없었습니다. 내가 찾은 예 중 어느 것도 나를 그렇게 할 수 없었습니다. 내가 끝내는 해결책은 다음과 같습니다.

그것은 사용 Mutation Observers( https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ) (polyfills가 존재하지만)은 최신 브라우저에서 사용할 수있는 수

따라서 기본적으로 코드는 다음을 수행합니다.

var scrollContainer = document.getElementById("myId");

// Define the Mutation Observer
var observer = new MutationObserver(function(mutations) {

  // Compute sum of the heights of added Nodes
  var newNodesHeight = mutations.reduce(function(sum, mutation) {
      return sum + [].slice.call(mutation.addedNodes)
        .map(function (node) { return node.scrollHeight || 0; })
        .reduce(function(sum, height) {return sum + height});
  }, 0);

  // Scroll to bottom if it was already scrolled to bottom
  if (scrollContainer.clientHeight + scrollContainer.scrollTop + newNodesHeight + 10 >= scrollContainer.scrollHeight) {
    scrollContainer.scrollTop = scrollContainer.scrollHeight;
  }

});

// Observe the DOM Element
observer.observe(scrollContainer, {childList: true});

나는 개념을 보여주기 위해 바이올린을 만들었습니다 : https://jsfiddle.net/j17r4bnk/


동적 ID를 얻는 방법? <div class="abc"><div data-bind=attr : {'id': myId } ></div></div>이 코드 에서와 같이 myId는 변수입니다. 스크립트에서이 ID에 어떻게 액세스 할 수 있습니까?
Irfan Yusanif

귀하의 질문에 대해 잘 모르겠습니다. 이 예에서 "myId"는 스크롤 컨테이너의 ID입니다. 사용자가 스크롤 할 수있는 영역을 두 개 이상 만들고 싶습니까?
Benkinass

4

자바 스크립트 또는 jquery :

var scroll = document.getElementById('messages');
   scroll.scrollTop = scroll.scrollHeight;
   scroll.animate({scrollTop: scroll.scrollHeight});

CSS :

 .messages
 {
      height: 100%;
      overflow: auto;
  }

4

이것이 정말로 도움이된다는 것을 알게되었습니다. 감사합니다.

Angular 1.X 사람들을 위해 :

angular.module('myApp').controller('myController', ['$scope', '$document',
  function($scope, $document) {

    var overflowScrollElement = $document[0].getElementById('your_overflow_scroll_div');
    overflowScrollElement[0].scrollTop = overflowScrollElement[0].scrollHeight;

  }
]);

jQuery 요소와 HTML DOM 요소의 줄 바꿈이 각도와 약간 혼동되기 때문입니다.

또한 채팅 응용 프로그램의 경우 유용한 채팅이로드 된 후이 할당을 수행하면 짧은 시간 초과시에도 시간을 두어야 할 수도 있습니다.


3

작은 부록 : 마지막 줄이 이미 보이는 경우에만 스크롤됩니다. 조금만 스크롤하면 내용을 그대로 둡니다 (주의 : 다른 글꼴 크기로 테스트되지 않았습니다. "> = 비교"내에서 약간의 조정이 필요할 수 있습니다) :

var objDiv = document.getElementById(id);
var doScroll=objDiv.scrollTop>=(objDiv.scrollHeight-objDiv.clientHeight);                   

// add new content to div
$('#' + id ).append("new line at end<br>"); // this is jquery!

// doScroll is true, if we the bottom line is already visible
if( doScroll) objDiv.scrollTop = objDiv.scrollHeight;

3

보너스 스 니펫과 같습니다. 나는 각도를 사용하고 있으며 사용자가 사용자와 다른 대화를 선택할 때 메시지 스레드를 맨 아래로 스크롤하려고했습니다. 메시지에 대한 ng-repeat를 사용하여 새 데이터가 div에로드 된 후 스크롤이 작동하는지 확인하려면 스크롤 스 니펫을 시간 초과로 래핑하십시오.

$timeout(function(){
    var messageThread = document.getElementById('message-thread-div-id');
    messageThread.scrollTop = messageThread.scrollHeight;
},0)

그러면 데이터가 DOM에 삽입 된 후 scroll 이벤트가 시작됩니다.


나는 $ scope. $ apply (callback)이 작동하고 뷰의 다이제스트와 재평가를 강요 할 것이라고 생각합니다.
SStanley

감사합니다! 나는 왜 내가 그것을 작동시킬 수 없었는지 궁금해하고 있었고 $ timeout이 문제였습니다.
Wayferer

@Wayferer와 동일setTimeout(function() { ... }, n)
KingRider

3

jQuery를 사용하여 html,body다음을 통해 문서에 애니메이션을 첨부 할 수도 있습니다 .

$("html,body").animate({scrollTop:$("#div-id")[0].offsetTop}, 1000);

id가 "div-id"인 div의 상단으로 부드럽게 스크롤됩니다.


3

자바 스크립트 :

document.getElementById('messages').scrollIntoView(false);

존재하는 내용의 마지막 줄로 스크롤합니다.


2

문서 높이와 관련하여 아래로 스크롤 할 수 있습니다.

$('html, body').animate({scrollTop:$(document).height()}, 1000);

1

이것에 대한 매우 간단한 방법 scroll to은 div의 높이 로 설정하는 것입니다.

var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);

1

div 내부의 마지막 요소로 스크롤하십시오.

myDiv.scrollTop = myDiv.lastChild.offsetTop

1

내 Angular 6 응용 프로그램에서 방금 다음을 수행했습니다.

postMessage() {
  // post functions here
  let history = document.getElementById('history')
  let interval    
  interval = setInterval(function() {
    history.scrollTop = history.scrollHeight
    clearInterval(interval)
  }, 1)
}

clearInterval (interval) 기능은 수동 스크롤 상단 / 하단을 허용하도록 타이머를 중지합니다.


1

내 시나리오 : 사용자가 제공 한 문자열을 추가하고 목록의 끝으로 자동 스크롤 해야하는 문자열 목록이있었습니다. 목록의 표시 높이를 고정한 후 오버플로해야합니다.

@Jeremy Ruten의 답변을 시도했지만 효과가 있었지만 (n-1) 번째 요소로 스크롤되었습니다. 이 유형의 문제에 직면 한 사람이 있으면 setTimeOut()방법 해결 방법을 사용할 수 있습니다 . 아래 코드를 수정해야합니다.

setTimeout(() => {
    var objDiv = document.getElementById('div_id');
    objDiv.scrollTop = objDiv.scrollHeight
}, 0)

여기 내가 만든 StcakBlitz 링크는 문제와 그 해결책을 보여줍니다 : https://stackblitz.com/edit/angular-ivy-x9esw8


-1

나는 이것이 오래된 질문이라는 것을 알고 있지만 이러한 해결책 중 어느 것도 나를 위해 일하지 않았다. 원하는 결과를 얻기 위해 offset (). top을 사용했습니다. 채팅 애플리케이션의 마지막 메시지까지 화면 을 부드럽게 스크롤하는 데 사용한 내용은 다음과 같습니다 .

$("#html, body").stop().animate({
     scrollTop: $("#last-message").offset().top
}, 2000);

나는 이것이 다른 누군가를 돕기를 바랍니다.


-1

때로는 가장 간단한 것이 가장 좋은 해결책입니다. 이것이 도움이 될지 모르겠습니다. "y ="가 높을수록 스크롤이 내려 가고 "0"은 맨 위를 의미하므로 예를 들어 "1000"은 맨 아래 또는 "2000"또는 "3000"등이 될 수 있습니다. 페이지입니다. 이것은 일반적으로 onclick 또는 onmouseover가있는 버튼에서 작동합니다.

window.scrollTo(x=0,y=150);

-1

스크롤 가능한 요소의 상단과의 거리를 요소의 총 높이로 설정하십시오.

const element = this.shadowRoot.getElementById('my-scrollable-div')
element.scrollTop = element.scrollHeight

이미 존재하는 동일한 솔루션을 추가하지 마십시오.
Ason

해결책이 이미 존재한다면 그렇게하지 마십시오
Oswaldo

-1

다음과 같이 HTML DOM scrollIntoView 메소드를 사용할 수 있습니다.

var element = document.getElementById("scroll");
element.scrollIntoView();

-2

사용하다 :

var element= $('element');
var maxScrollTop = element[0].scrollHeight - element.outerHeight();
element.scrollTop(maxScrollTop);

또는 아래로 스크롤을 확인하십시오.

    var element = $(element);
    var maxScrollTop = element[0].scrollHeight - element.outerHeight();
    element.on('scroll', function() {
        if ( element.scrollTop() >= maxScrollTop ) {
            alert('scroll to bottom');
        }
    });

scrollTopMax를 var로 변경하십시오 maxScrollTop = element [0] .scrollHeight-element.outerHeight ();
Mahdi Bagheri

-2

채팅 창 하단으로 스크롤하기 위해이 작업을 수행 한 경우 다음을 수행하십시오.

채팅에서 특정 div로 스크롤하는 아이디어는 다음과 같습니다.

1) Person, time 및 message로 구성된 각 채팅 div는 chatContentbox 클래스의 for 루프에서 실행됩니다.

2) querySelectorAll은 이러한 모든 배열을 찾습니다. 400 개의 노드 (400 개의 채팅) 일 수 있습니다.

3) 마지막으로 이동

4) scrollIntoView ()

let lastChatBox = document.querySelectorAll('.chatContentBox'); 
lastChatBox = lastChatBox[lastChatBox.length-1]; 
lastChatBox.scrollIntoView(); 

을 사용하여 여러 답변이 이미 제공되었으므로 scrollIntoView더 추가 할 필요가 없습니다.
Ason
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.