it-swarm.com.ru

Прокрутить до нижней части div?

Я создаю чат, используя запросы ajax в Rails, и пытаюсь получить div для прокрутки до дна без особой удачи.

Я оборачиваю все в этом div:

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

Есть ли способ сохранить прокрутку вниз по умолчанию с помощью JS?

Есть ли способ сохранить прокрутку вниз после запроса AJAX?

707
dMix

Вот что я использую на своем сайте:

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

Это намного проще, если вы используете jQuery:

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

используя jQuery animate :

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

Вы можете использовать следующий код:

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

Чтобы выполнить прокрутку smooth, используйте следующий код (требуется jQuery):

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

Смотрите образец на JSFiddle

И вот как это работает:

 enter image description here

Ссылка: scrollTop , scrollHeight , clientHeight

77
Tho
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

Работает с JQuery 1.6

https://api.jquery.com/scrollTop/

http://api.jquery.com/prop/

34
Akira Yamamoto

Более новый метод, который работает на все текущие браузеры :

this.scrollIntoView(false);
21
tnt-rox

Если вы не хотите полагаться на scrollHeight, вам поможет следующий код:

$('#scroll').scrollTop(1000000);
10
Benny Neugebauer

Используя jQuery, scrollTop используется для установки вертикальной позиции полосы прокрутки для любого данного элемента. есть также плагин Nice jquery scrollTo используется для прокрутки с анимацией и различными опциями ( demos )

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

если вы хотите использовать метод анимации jQuery , чтобы добавить анимацию при прокрутке вниз, проверьте следующий фрагмент:

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

Нашел это действительно полезным, спасибо.

Для пользователей 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 немного сбивает с толку angular. 

Также для приложения чата было полезно сделать это назначение после того, как ваши чаты были загружены, вам также может понадобиться короткое время ожидания. 

6
devonj

Javascript или JQuery:

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

Css:

 .messages
 {
      height: 100%;
      overflow: auto;
  }
4
Lay Leangsros

небольшое приложение: прокручивается только, если последняя строка уже видна. если прокрутить чуть-чуть, оставляет содержимое там, где оно есть (внимание: не проверено с разными размерами шрифта. это может потребовать некоторых настроек внутри "> = сравнения"):

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;
4
Bruno Jennrich

Так же, как бонусный фрагмент. Я использую angular и пытался прокрутить ветку сообщений до конца, когда пользователь выбирал разные разговоры с пользователями. Чтобы убедиться, что прокрутка работает после того, как новые данные были загружены в div с ng-repeat для сообщений, просто оберните фрагмент прокрутки в тайм-аут.

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

Это обеспечит запуск события прокрутки после вставки данных в DOM.

4
mylescc

Вы также можете, используя jQuery, прикрепить анимацию к html,body документа с помощью:

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

что приведет к плавной прокрутке к началу div с идентификатором "div-id".

3
John Dunne

Это позволит вам прокручивать всю страницу вниз по высоте документа

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

Я столкнулся с той же проблемой, но с дополнительным ограничением: у меня не было контроля над кодом, добавляющим новые элементы в контейнер прокрутки. Ни один из приведенных здесь примеров не позволил мне сделать именно это. Вот решение, которое я выбрал.

Он использует Mutation Observers ( https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ), что делает его пригодным для использования только в современных браузерах (хотя полифиллы существуют)

Так что в основном код делает именно это:

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/

3
Benkinass

Прокрутите до последнего элемента внутри div:

myDiv.scrollTop = myDiv.lastChild.offsetTop
1
mjaque

Очень простой способ сделать это - установить scroll to в высоту div.

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

Javascript:

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

Прокрутка до последней строки содержимого присутствует.

1
Barath

гладкая прокрутка с помощью Javascript:

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

0
remi

Я знаю, что это старый вопрос, но ни одно из этих решений не сработало для меня. В итоге я использовал offset (). Top, чтобы получить желаемые результаты. Вот что я использовал, чтобы аккуратно прокрутить экран вниз до последнего сообщения в моем приложении чата:

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

Я надеюсь, что это помогает кому-то еще.

0
BrianLegg