Почему слушатель событий вызывает функцию, и она работает корректно лишь один раз?

Делаю этапы прогресса через JS, пока что только изменяя длину специального div-а, который служит в роли полоски.

const buttonNext = document.getElementById('buttonNext')
buttonNext.addEventListener('click', nextStep)


function nextStep(){
    progressLine.style.width = `${progressLine.style.width + 175}px`
}
.progress-line {
    position: absolute;
    width: 1px;
    height: 6px;
    background-color: #ff9a9a;
    top: 50%;
    transform: translateY(-25%);
    z-index: -1;
    left: 0;
}
<div class="progress-steps" id="steps-wrapper">
  <div class="step active">1</div>
  <div class="step">2</div>
  <div class="step">3</div>
  <div class="step">4</div>
  <div class="progress-line-default"></div>
  <div class="progress-line"></div>
</div>

При клике должна изменяться ширина div-а .progress-line, но происходит это не несколько а один раз. Подскажите, почему так происходит?


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

Автор решения: Алексей Шиманский

progressLine.style.width возвращает строку с числом и постфиксом px (175px). Если к такой строке прибавлять число, то будет просто конкатенация и итог будет '175px175'. А потом ещё конкатенируется px и итог получается '175px175px', естесственно такой ширины не бывает.

Надо парсить строку и убирать px

const buttonNext = document.getElementById('buttonNext');
const progressLine = document.getElementById('progressLine');


buttonNext.addEventListener('click', nextStep)


function nextStep(){  
    progressLine.style.width = `${parseFloat(progressLine.style.width || 0) + 175}px`
}
.progress-line {
    position: absolute;
    width: 1px;
    height: 6px;
    background-color: #ff9a9a;
    top: 50%;
    transform: translateY(-25%);
    z-index: -1;
    left: 0;
}
<div class="progress-steps" id="steps-wrapper">
  <div class="step active">1</div>
  <div class="step">2</div>
  <div class="step">3</div>
  <div class="step">4</div>
  <div class="progress-line-default"></div>
  <div class="progress-line" id="progressLine"></div>
</div>


<button id="buttonNext">buttonNext</button>

→ Ссылка