Держите overflow div прокрученным вниз, если пользователь не прокручивает вверх
У меня есть div, который составляет всего 300 пикселей, и я хочу, чтобы он, когда страница загружается, прокручивался в нижней части содержимого. Этот div имеет динамически добавляемый к нему контент и должен оставаться прокрученным до конца. Теперь, если пользователь решит прокрутить вверх, я не хочу, чтобы он возвращался вниз, пока пользователь не прокручивает весь путь вниз снова
возможно ли иметь div, который будет прокручиваться вниз, если пользователь не прокручивается вверх и когда пользователь прокручивается обратно вниз он должен оставаться внизу, даже когда добавляется новый динамический контент. Как я могу это создать?
8 ответов
ну хотя это может помочь вам:
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
[EDIT], чтобы соответствовать комментарию...
function updateScroll(){
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
}
всякий раз, когда содержимое добавляется, вызовите функцию updateScroll () или установите таймер:
//once a second
setInterval(updateScroll,1000);
если вы хотите обновить только если пользователь не двигался:
var scrolled = false;
function updateScroll(){
if(!scrolled){
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
}
}
$("#yourDivID").on('scroll', function(){
scrolled=true;
});
Я только что реализовал это, и, возможно, вы можете использовать мой подход.
у нас есть следующий HTML-код:
<div id="out" style="overflow:auto"></div>
тогда мы можем проверить, прокрутился ли он вниз с:
var out = document.getElementById("out");
// allow 1px inaccuracy by adding 1
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;
scrollHeight дает вам высоту элемента, включая любую не видимую область из-за переполнения. clientHeight дает вам высоту CSS или сказал по-другому, фактическую высоту элемента. Оба метода возвращают высоту без margin
, так что вам не нужно беспокоиться об этом. scrollTop дает вам положение вертикальной прокрутки. 0-верх, а max-высота прокрутки элемента минус высота самого элемента. При использовании полосы прокрутки может быть трудно (это было в Chrome для меня), чтобы получить полосу прокрутки до самого дна. поэтому я бросил неточность 1px. Так что isScrolledToBottom
будет true, даже если полоса прокрутки 1px снизу. Ты можешь сделать все, что считаешь правильным. вы.
тогда это просто вопрос установки прокрутки элемента в нижней части.
if(isScrolledToBottom)
out.scrollTop = out.scrollHeight - out.clientHeight;
я сделал скрипку для вас, чтобы показать концепцию:http://jsfiddle.net/dotnetCarpenter/KpM5j/
изменить:
Добавлен фрагмент кода для уточнения, когда isScrolledToBottom
is true
.
придерживайтесь полосы прокрутки вниз
const out = document.getElementById("out")
let c = 0
setInterval(function() {
// allow 1px inaccuracy by adding 1
const isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1
const newElement = document.createElement("div")
newElement.textContent = format(c++, 'Bottom position:', out.scrollHeight - out.clientHeight, 'Scroll position:', out.scrollTop)
out.appendChild(newElement)
// scroll to bottom if isScrolledToBottom is true
if (isScrolledToBottom) {
out.scrollTop = out.scrollHeight - out.clientHeight
}
}, 500)
function format () {
return Array.prototype.slice.call(arguments).join(' ')
}
#out {
height: 100px;
}
<div id="out" style="overflow:auto"></div>
<p>To be clear: We want the scrollbar to stick to the bottom if we have scrolled all the way down. If we scroll up, then we don't want the content to move.
</p>
я смог заставить это работать только с CSS.
фокус в том, чтобы использовать display: flex;
и flex-direction: column-reverse;
браузер рассматривает дно, как его верхнюю часть. Предполагая, что браузеры, на которые вы нацелены, поддерживают flex-box
, единственный нюанс заключается в том, что разметка должна быть в обратном порядке.
вот рабочий пример. https://codepen.io/jimbol/pen/YVJzBg
$('#yourDiv').scrollTop($('#yourDiv')[0].scrollHeight);
Live demo:http://jsfiddle.net/KGfG2/
$('#div1').scrollTop($('#div1')[0].scrollHeight);
Or animated:
$("#div1").animate({ scrollTop: $('#div1')[0].scrollHeight}, 1000);
$('#yourDivID').animate({ scrollTop: $(document).height() }, "slow");
return false;
Это позволит рассчитать положение прокрутки с высоты #yourDivID
С помощью $(document).height()
свойство так, что даже если динамическое содержимое добавляется в div, скроллер всегда будет в нижней позиции. Надеюсь, это поможет. Но у него также есть небольшая ошибка, даже если мы прокручиваем вверх и оставляем указатель мыши из скроллера, он автоматически придет в нижнее положение. Если бы кто-нибудь мог это исправить, было бы здорово.
//Make sure message list is scrolled to the bottom
var container = $('#MessageWindowContent')[0];
var containerHeight = container.clientHeight;
var contentHeight = container.scrollHeight;
container.scrollTop = contentHeight - containerHeight;
вот мой вариант ответа dotnetCarpenter по. Мой подход чисто jQuery и я назвал переменные, чтобы сделать вещи немного яснее.. Что происходит, если высота содержимого больше, чем контейнер, мы прокручиваем дополнительное расстояние вниз для достижения желаемого результата.
работает в IE и chrome..
ответ Джима Холла предпочтителен, потому что, хотя он действительно не прокручивается вниз, когда вы прокручиваете вверх, это также чистый CSS.
очень к сожалению, однако, это не стабильное решение: в chrome (возможно, из-за 1-px-проблемы, описанной dotnetCarpenter выше),scrollTop
ведет себя неточно на 1 пиксель, даже без взаимодействия с Пользователем (при добавлении элемента). Вы можете установить scrollTop = scrollHeight - clientHeight
, но это сохранит div в положении, когда будет добавлен другой элемент, он же функция "keep itself at bottom" больше не работает.
Итак, короче говоря, добавление небольшого количества Javascript (вздох) исправит это и выполнит все требования:
что-то вроде https://codepen.io/anon/pen/pdrLEZ это (пример по Coo), и после добавления элемента в список, также следующее:
container = ...
if(container.scrollHeight - container.clientHeight - container.scrollTop <= 29) {
container.scrollTop = container.scrollHeight - container.clientHeight;
}
где 29-высота одной линии.
Итак, когда пользователь прокручивает половину строки (если это вообще возможно?), этот Javascript проигнорирует его и прокрутит вниз. Но, думаю, этим пренебрегают. И, он исправляет Chrome 1 px thingy.