Допустим, у вас есть базовая c структура разметки, такая как
<main id="msgs">
<div>Message #0</div>
<div>Message #1</div>
<div>Message #2</div>
<div>Message #3</div>
<div>Message #4</div>
<!-- new messages are appended here -->
</main>
Используя Flexbox, вы можете расположить их в обратном порядке, чтобы каждое новое сообщение отображалось в верхней части страницы
main {
display: flex;
flex-flow: column-reverse nowrap;
}
Затем с помощью Javascript, после добавления нового сообщения вам необходимо прокрутить основной элемент с помощью scrollTo(0, 0);
Прокрутка может быть даже улучшена с помощью CSS с помощью scroll-behavior: smooth;
Здесь под фрагментом который имитирует новое сообщение каждые 5s
:
var messageArea = document.getElementById('msgs');
messageArea.scrollTo(0, 0);
setInterval(() => {
/* create a new message element */
var msgEl = document.createElement('div');
/* create a string with the message */
var msgText = 'Message #' + messageArea.children.length;
/* set the textContent of the element with the message */
msgEl.textContent = msgText;
/* append the new message in the container of the messages */
messageArea.appendChild(msgEl);
/* finally scroll the message area to (0, 0) coords. */
messageArea.scrollTo(0, 0);
}, 5000)
main {
height: 100vh;
display: flex;
overflow: auto;
padding: 1em .5em;
flex-flow: column-reverse nowrap;
scroll-behavior: smooth;
}
div {
border: 1px #ccc solid;
border-radius: 10px;
padding: 1em;
margin-top: 1.5em;
width:60%;
align-self: flex-start;
}
div:nth-child(2n) {
align-self: flex-end;
}
<main id="msgs">
<div>Message #0</div>
<div>Message #1</div>
<div>Message #2</div>
<div>Message #3</div>
<div>Message #4</div>
</main>