Я думаю, что вам просто не хватает нескольких вычислений и вспомогательных функций, чтобы определить как привязать.
Сначала нам понадобится обёртка:
const wrapper = document.querySelector('.stepper-wrapper');
Далее нам нужно вычислить несколько значений, которые будут использоваться для генерации точек нашего диапазона:
const containerWidth = wrapper.offsetWidth
const pixelsPerStep = Math.round(containerWidth / maxVal)
const totalSteps = Math.round(pixelsPerStep / step);
Быстрые вспомогательные функции пары позволяют сгенерировать наш диапазон и найти ближайшую точку, к которой можно привязаться:
const range = (start, stop, step = 1) =>
Array(Math.ceil((stop - start) / step)).fill(start).map((x, y) => x + y * step)
const closest = (range, goal) => {
return range.reduce((prev, curr) => {
return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev)
})
}
И в нашем mousedown
слушателе событий мы можем сгенерировать точку, через которую мы можем привязаться:
const snapTo = closest(rangePoints, newLeft);
Это можно использовать как свойство .left
элемента thumb
.
jsFiddle для иллюстрации.