@Itvanya

Как сделать кастомный scrollbar для списка, используя js?

Всем привет, друзья. Учусь писать кастомный скроллбар на чистом js. Проблема в том, что никак не могу понять алгоритм того, как двигать скроллбар
Структура html такая :
<div class="wrapper">
  <ul class="list">
    <div class="list-scroller"></div>
    <li class="list-item">text content</li>
    <li class="list-item">text content</li>
    <li class="list-item">text content</li>
  </ul>
</div>

Кол-во .list-item произвольное и их суммарное количество обычно высотой около 1000px, .list имеет фиксированную высоту 300px, position:relative и overflow:hidden, что позволит мне самостоятельно скролить элемент, используя мой скроллбар. Сам скроллбар позиционирован абсолютно относительно .list и прижат к правому боку(как любой нормальный скроллбар).

Суть в том, что мой скроллбар идеально двигается, ударяясь об границы и останавливаясь, но я не могу понять, как создать зависимость scrollTop для .list от моего скроллбара, чтобы scrollTop двигался симметрично моему скроллбару. Т.е. чтобы все было так, как и в обычном скроллбаре. Я пробовал сделать так :
list.scrollTop = parseInt(scrollBar.style.top) * (list.scrollHeight/list.clientHeight) ;

Т.е. попылся двигать scrollTop относительно моего скролбара. Оно вышло - список скоролится, но сам скроллбар за ним не успевает, потому что он абсолютно позиционирован.

Буду очень благодарен тому, кто даст наводку, как связать list.scrollTop и scrollbar.style.top так, чтобы они двигались правильно относительно друг друга(скроллбар двигался по клиентской высоте контейнера .list, а list.scrollTop при это двигался относительно полной своей высоты .list.scrollHeight).
Спасибо.
  • Вопрос задан
  • 1038 просмотров
Пригласить эксперта
Ответы на вопрос 1
AMar4enko
@AMar4enko
Ну потому что у вас должна быть пропорция.
var scrollBarHandleHeight = scrollBar.offsetHeight;
var scrollBarHandleTop = +scrollBar.style.top;
var listHeight = list.clientHeight;
var scrollPosition = scrollBarHandleTop / (listHeight - scrollBarHandleHeight); 
list.scrollTop = (list.scrollHeight - list.clientHeight) * scrollPosition;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы