Не корректное изменение input range

Я создаю input с типом range.

slider           = document.createElement('input');
slider.type      = 'range';
slider.min       = 0.25;
slider.max       = 2.5;
slider.step      = 0.05;
slider.value     = playbackSpeed; // переменная хранит 1.5
slider.className = 'sliderSpeed';

Дальше на него вешаю прослушиватели:

slider.addEventListener('wheel', (e) =>
{
    console.log(e.deltaY, Math.sign(e.deltaY));

    if (Math.sign(e.deltaY) == 1)
    {
        console.log(slider.value, '-=', slider.step);
        slider.value -= slider.step;
    }
    else
    {
        console.log(slider.value, '+=', slider.step);
        slider.value += slider.step;
    }

    slider.dispatchEvent(new Event('input', { bubbles: true }));

    e.preventDefault();
});

slider.addEventListener('input', (e) =>
{
    video.playbackRate = parseFloat(e.target.value);
});

То есть при прокрутке колесика вниз, мы отнимаем от value, шаг. Это работает. Но почему-то при прокрутке вверх, value устанавливается в 1.4, всегда.

slider           = document.createElement('input');
slider.type      = 'range';
slider.min       = 0.25;
slider.max       = 2.5;
slider.step      = 0.05;
slider.value     = 1.5; // переменная хранит 1.5
slider.className = 'sliderSpeed';
document.body.append(slider);

slider.addEventListener('wheel', (e) =>
{
    console.log(e.deltaY, Math.sign(e.deltaY));

    if (Math.sign(e.deltaY) == 1)
    {
        console.log(slider.value, '-=', slider.step);
        slider.value -= slider.step;
        console.log('new value', slider.value);
    }
    else
    {
        console.log(slider.value, '+=', slider.step);
        slider.value += slider.step;
        console.log('new value', slider.value);
    }

    slider.dispatchEvent(new Event('input', { bubbles: true }));

    e.preventDefault();
});

//slider.addEventListener('input', (e) =>
//{
//  video.playbackRate = parseFloat(e.target.value);
//});


Кхм.. Решением проблемы оказалось parseFloat для value и step. Догадывался что где-то здесь зарыто..


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

Автор решения: Oliver Patterson

Дело оказалось в типах данных. slider.value хранит строку, как и slider.step, по этому += просто складывало строки.

Так же в комментариях подсказал @teran, что конструкцию с if ... else можно сократить до:

slider.value = value - sign * step;

(В данном случае минус, ибо при скроле вниз, число положительно, на что Math.sign возвращает положительно число, но по логике нам нужно отнимать при скроле вниз.)

Итого:

slider.addEventListener('wheel', (e) =>
{
    const value = parseFloat(slider.value);
    const step = parseFloat(slider.step);
    const sign = Math.sign(e.deltaY);

    slider.value = value - sign * step;

    slider.dispatchEvent(new Event('input', { bubbles: true }));

    e.preventDefault();
});
→ Ссылка