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

667

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

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

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

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

Есть ли способ, чтобы он прокручивался вниз после запроса ajax?

Теги:

21 ответ

1028
Лучший ответ

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

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
  • 8
    этот метод подходит для всех браузеров?
  • 1
    @PaulDinh: Я только что посмотрел на это, и есть проблема с IE7 и ниже, используя scrollHeight. Кажется, здесь есть обходной путь для IE7.
Показать ещё 10 комментариев
329

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

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);
  • 228
    Как это проще?
  • 73
    1 строка вместо 2? понятия не имею, но то, что вы можете легко сделать с помощью JQuery, это анимировать действие следующим образом: $ ("# div-id"). animate ({scrollTop: $ ("# div-id") [0] .scrollHeight}, 1000 ); надеюсь, это кому-нибудь поможет :)
Показать ещё 12 комментариев
82

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

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);
  • 5
    Это то, что Сэм сказал в этом комментарии . Это, вероятно, более полезно в реальном ответе, хотя!
  • 6
    Обратите внимание, как этот ответ использует .stop () , что предотвращает проблемы с несколькими анимациями.
Показать ещё 1 комментарий
78

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

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

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

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

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

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

Изображение 2244

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

  • 1
    Лучшее объяснение. Спасибо!
32
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

Работает от jQuery 1.6

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

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

  • 1
    Это решение работает для элементов с уникальным классом CSS, но без идентификатора CSS. Решение верхнего комментария не работает "из коробки" с классом CSS.
20

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

this.scrollIntoView(false);
  • 1
    Думаю, это работает только в Firefox: developer.mozilla.org/en/docs/Web/API/Element/…
  • 3
    Поддержке действительно не хватает банкомата, но если это будет принято, то это будет здорово.
Показать ещё 2 комментария
10

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

$('#scroll').scrollTop(1000000);
  • 1
    Похоже, что ни одно из перечисленных выше решений, в том числе и ваше, не работает на Firefox на Android ... есть мысли, пожалуйста?
  • 0
    Не работает в IE 11
Показать ещё 4 комментария
6

Нашли это очень полезно, спасибо.

Для людей с угловым 1.X:

  angular.module('myApp'). controller ('myController', ['$ scope', '$ document' функция ($ scope, $document) {
   var overflowScrollElement = $document [0].getElementById('your_overflow_scroll_div');   overflowScrollElement [0].scrollTop = overflowScrollElement [0].scrollHeight;
 }
]);
Код>

Просто потому, что обтекание элементов jQuery и HTML DOM немного запутывается с угловыми.

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

6

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

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

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

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

Javascript или jquery:

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

Css:

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

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

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

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

  • 0
    Я подозреваю, что $ scope. $ Apply (callback) будет работать так же хорошо, как это вызывает дайджест и переоценку представления.
  • 0
    Спасибо! Мне действительно было интересно, почему я не смог заставить его работать, и проблема была в тайм-ауте.
4

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

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

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

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

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

3

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

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

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

Он использует 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/

  • 0
    как получить динамический идентификатор? как в <div class="abc"><div data-bind=attr : {'id': myId } ></div></div> В этом коде myId является переменной. Как я могу получить доступ к этому идентификатору в скрипте.
  • 0
    Я не совсем уверен, что понимаю ваш вопрос. В моем примере «myId» - это идентификатор контейнера прокрутки. Вы хотите создать более одной области, где пользователь может прокручивать?
1

Очень простой метод заключается в том, чтобы установить scroll to на высоту div.

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

Java Script:

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

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

0

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

myDiv.scrollTop = myDiv.lastChild.offsetTop
0

Чистый ответ Javascript на очень старый вопрос:

function scrollToElement(id) {
  let ele = document.getElementById(id);
  ele.scrollIntoView({behavior: "smooth"});
}

Передайте id нового элемента в функцию и вуаля.

0

Вы можете сделать следующее:

$('button').click(function(){
    $('.logs').animate({scrollTop:$(".logs")[0].scrollHeight}, 500, 'swing');
});
.logs {
  max-height: 100px;
  overflow-y: scroll;
  font-size: larger;
}
<script src="/jquery.min.js"></script>
<button>Button</button>

<div id="logs" class="logs" style="margin-top: 25px;">
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p><p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p><p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>
<p>blalblalfosd</p>


                        </div>

Важная ссылка: http://jsonwrapper.com/

0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню