Я создаю чат, используя ajax-запросы в rails, и я пытаюсь получить div для прокрутки вниз без большой удачи.
Я обертываю все в этом div:
#scroll {
height:400px;
overflow:scroll;
}
Есть ли способ сохранить его прокруткой вниз по умолчанию с помощью JS?
Есть ли способ, чтобы он прокручивался вниз после запроса ajax?
Вот то, что я использую на своем сайте:
var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
Это намного проще, если вы используете jQuery:
$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);
используя jQuery aimate:
$('#DebugContainer').stop().animate({
scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);
Вы можете использовать следующий код:
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
И как это работает:
Ссылка: scrollTop, scrollHeight, clientHeight
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));
Работает от jQuery 1.6
Более новый метод, который работает во всех текущих браузерах:
this.scrollIntoView(false);
Если вы не хотите полагаться на scrollHeight
, следующий код помогает:
$('#scroll').scrollTop(1000000);
Нашли это очень полезно, спасибо.
Для людей с угловым 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 немного запутывается с угловыми.
Также для приложения чата я нашел выполнение этого задания после того, как ваши чаты были загружены, чтобы быть полезными, вам также может понадобиться пощелкать и короткий тайм-аут.
С помощью 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);
Javascript или jquery:
var scroll = document.getElementById('messages');
scroll.scrollTop = scroll.scrollHeight;
scroll.animate({scrollTop: scroll.scrollHeight});
Css:
.messages
{
height: 100%;
overflow: auto;
}
Как бонусный фрагмент. Я использую angular и пытался прокрутить поток сообщений до низа, когда пользователь выбрал разные разговоры с пользователями. Чтобы убедиться, что прокрутка работает после того, как новые данные были загружены в div с помощью сообщений ng-repeat для сообщений, просто заверните фрагмент прокрутки в тайм-аут.
$timeout(function(){
var messageThread = document.getElementById('message-thread-div-id');
messageThread.scrollTop = messageThread.scrollHeight;
},0)
Это позволит убедиться, что событие прокрутки запускается после того, как данные были вставлены в DOM.
небольшое добавление: прокручивается только, если последняя строка уже видна. если прокручивать крошечный бит, оставляет содержимое там, где оно (внимание: не тестировалось с разными размерами шрифта, возможно, некоторые корректировки внутри " >= сравнение" ):
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;
Вы также можете, используя jQuery, прикрепить анимацию к html,body
документа с помощью:
$("html,body").animate({scrollTop:$("#div-id")[0].offsetTop}, 1000);
что приведет к плавной прокрутке вверху div с id "div-id".
Это позволит вам прокрутить весь путь вниз относительно высоты документа
$('html, body').animate({scrollTop:$(document).height()}, 1000);
Я столкнулся с той же проблемой, но с дополнительным ограничением: у меня не было контроля над кодом, который добавлял новые элементы в контейнер прокрутки. Ни один из примеров, которые я нашел здесь, не позволил мне сделать именно это. Вот решение, в котором я закончил.
Он использует 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/
<div class="abc"><div data-bind=attr : {'id': myId } ></div></div>
В этом коде myId является переменной. Как я могу получить доступ к этому идентификатору в скрипте.
Очень простой метод заключается в том, чтобы установить scroll to
на высоту div.
var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);
Java Script:
document.getElementById('messages').scrollIntoView(false);
Прокрутка до последней строки содержимого.
Прокрутите до последнего элемента внутри div:
myDiv.scrollTop = myDiv.lastChild.offsetTop
Чистый ответ Javascript на очень старый вопрос:
function scrollToElement(id) {
let ele = document.getElementById(id);
ele.scrollIntoView({behavior: "smooth"});
}
Передайте id нового элемента в функцию и вуаля.
Вы можете сделать следующее:
$('button').click(function(){
$('.logs').animate({scrollTop:$(".logs")[0].scrollHeight}, 500, 'swing');
});
.logs {
max-height: 100px;
overflow-y: scroll;
font-size: larger;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/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/
Я знаю, что это старый вопрос, но ни одно из этих решений не разработано для меня. Я закончил использовать offset(). Top, чтобы получить желаемые результаты. Вот что я привык мягко прокрутить экран вниз до последнего сообщения в приложении чата:
$("#html, body").stop().animate({
scrollTop: $("#last-message").offset().top
}, 2000);
Я надеюсь, что это поможет кому-то другому.