Блог

Горизонтальная прокрутка с помощью колеса мыши в JavaScript

12 июня 2023

Нативная горизонтальная прокрутка с помощью колеса мыши не так тривиальна для пользователя. Однако это поведение можно изменить с помощью прослушивания событий (event listener).

JavaScript
JavaScript

Существует несколько событий, связанных с прокруткой и колесом мыши, например, mousewheel и DOMMouseScroll. В примере ниже я буду использовать событие для колеса мыши.

Итак, чтобы реализовать это поведение, код JavaScript будет выглядеть следующим образом:

element.addEventListener('wheel', (event) => {
  event.preventDefault();

  element.scrollBy({
    left: event.deltaY < 0 ? -30 : 30,
  });
});

Где element — это HTML-элемент, в котором пользователь будет прокручивать содержимое.

Вы можете спросить, почему left имеет статические значения. Это потому, что разные браузеры предоставляют разные значения для event.deltaY. Поэтому лучше поставить только одно значение, меняющееся только при прокрутке элемента в ту или иную сторону.

Результат:

Еще один вариант, который посоветовали пользователи в комментариях:

// Only works if scroll was _started inside the element_.

function force_scroll_sideways(element) {
  element.addEventListener("wheel", (event) => {
    event.preventDefault();

    let [x, y] = [event.deltaX, event.deltaY];
    let magnitude;

    if (x === 0) {
      magnitude = y > 0 ? -30 : 30;
    } else {
      magnitude = x;
    }

    //console.log({ x, y, magnitude });
    element.scrollBy({
      left: magnitude
    });
  });
}

Здесь смысл в том, чтобы сделать прокрутку вбок менее неудобной для людей с мышью, не мешая людям, использующим трекпад.

Проблема этого решения заключается в том, что если пользователь действительно прокручивает страницу влево или вправо, содержимое всегда будет прокручиваться вправо (event.deltaY будет равен 0).

Оригинал статьи
Опубликовано 12 июня 2023 в 15:37
Обновлено 30 апреля 2024 в 00:43
Категория: Блог
Теги:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Реклама

Связь со мной

uzabila@yandex.ru