Как делается такой слайдер?

Есть следующий слайдер, который можно зажимать курсором и передвигать машкой влево/вправо.

введите сюда описание изображения

Как делаются такие слайдеры? Не могу понять, в какую сторону копать.


Ответы (1 шт):

Автор решения: Grundy

Подход с тасканием может быть следующим:

  1. сохранять точку, где зацепились для начала перетягивания
  2. отслеживать движение мыши рассчитывая на сколько нужно изменить положение
  3. при отпускании кнопки мыши прекратить отслеживание движения

Пример:

let mouseCoordX = undefined;
let itemsShift = 0;

const sliderElem = document.querySelector('.slider');
const itemsElem = sliderElem.querySelector('.items');
itemsElem.addEventListener('mousedown', (e) => {
  itemsElem.style.cursor = 'grabbing'; // меняем курсор

  mouseCoordX = e.screenX; // сохраняем место куда кликнули
  window.addEventListener('mousemove', onDrag); // начинаем отслеживать перемещение мышки
});

window.addEventListener('mouseup', (e) => {
  itemsElem.style.cursor = ''; // меняем курсор обратно

  mouseCoord = undefined;
  itemsShift = itemsShift + e.screenX - mouseCoordX; // запоминаем текущее смещение
  window.removeEventListener('mousemove', onDrag); // прекращаем отслеживать перемещение мышки
});

itemsElem.addEventListener('dragstart', (e) => {
  e.preventDefault();
  e.stopPropagation()
}, false);

function onDrag(e) {
  itemsElem.style.transform = `translateX(${ // вычисляем смещение после движения мышки
    clamp(itemsShift + e.screenX - mouseCoordX, // новое значение
    sliderElem.offsetWidth - itemsElem.scrollWidth, // максимальное смещение вправо
    0)}px)`; // максимальное смещение влево
}

function clamp(value, min, max) { // функция гарантирующая что значение будет в заданном интервале.
  if (value < min) return min;
  if (value > max) return max;
  return value;
}
.slider {
  width: 600px;
  border: 1px solid black;
  overflow: hidden;
}

.items {
  display: flex;
  gap: 6px;
  cursor: grab;
}
<div class="slider">
  <div class="items">
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
    <div class="item">
      <img src="https://placehold.co/200x400" />
    </div>
  </div>
</div>

→ Ссылка