🧱 Суть
overflow-anchor – это CSS-свойство, которое управляет scroll anchoring (якорением прокрутки).
Оно позволяет браузеру сохранять позицию скролла при изменениях контента и может использоваться для создания эффекта “приклеенного” скролла в чатах.
Пример:
<div id="scroller">
...
<div id="anchor"></div>
</div>#scroller * {
overflow-anchor: none;
}
#anchor {
overflow-anchor: auto;
height: 1px;
}📦 Проблема
1. Обычно для чатов используют JavaScript
Например:
scrollTo(0, element.scrollHeight);или отслеживание изменений:
MutationObserverПроблемы:
- дополнительный JavaScript-код
- необходимость вручную следить за изменениями DOM
- возможные скачки скролла
2. Новые сообщения могут сдвигать позицию прокрутки
Когда в список добавляется контент, браузер пытается сохранить текущую позицию.
Это удобно для чтения страниц, но не всегда подходит для чатов.
✅ Решение
Использовать встроенный механизм браузера:
overflow-anchorИ создать специальный элемент-якорь в конце списка.
💻 Код
По умолчанию браузеры используют scroll anchoring:
изменение контента → браузер сохраняет текущую позицию скроллаЧтобы изменить поведение:
- отключаем якорение у всех элементов:
#scroller * {
overflow-anchor: none;
}- включаем его только у последнего элемента:
#anchor {
overflow-anchor: auto;
}Теперь браузер использует этот элемент как точку привязки.
Пример структуры чата
<div id="scroller">
<div class="message">Hello</div>
<div class="message">Hi</div>
<div class="message">How are you?</div>
<div id="anchor"></div>
</div>Когда добавляется новое сообщение:
новое сообщение
↓
anchor остаётся внизу
↓
скролл следует за нимВажный момент
Этот подход не заменяет все сценарии.
Для сложных чатов могут понадобиться:
- ручное управление скроллом
- виртуализация списка
IntersectionObserver
Но для простого списка сообщений CSS может быть достаточно.
🎯 Вывод
overflow-anchorуправляет поведением скролла при изменении контента- позволяет закрепить скролл без
MutationObserverиscrollTo() - используется через специальный элемент-якорь в конце списка
- уменьшает количество JavaScript-логики
- подходит для простых чат-интерфейсов