Не работает progress bar

Рейтинг: 0Ответов: 1Опубликовано: 05.06.2023

Суть его в том что у меня 10 вопросов(в проекте), и 11 квадратиков в прогресс баре, прогресс бар прибавляется и меняет ширину в положительную сторону, а "пустая часть" меняется в отрицательную(изменения с помощью анимации). Но у меня перестала работать анимация "пустой" части.

.bar1 {
    width: 32px;
    height: 30px;
    background: #7cbe68;
}

.bar2 {
    width: 30px;
    height: 30px;
    margin-left: 30px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar3 {
    width: 30px;
    height: 30px;
    margin-left: 60px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar4 {
    width: 30px;
    height: 30px;
    margin-left: 90px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar5 {
    width: 30px;
    height: 30px;
    margin-left: 120px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar6 {
    width: 30px;
    height: 30px;
    margin-left: 150px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar7 {
    width: 30px;
    height: 30px;
    margin-left: 180px;
    margin-top: -30px;
    background: #7cbe68;
}

.bar8 {
    width: 30px;
    height: 30px;
    margin-left: 210px;
    margin-top: -30px;
    background: #7cbe68;
    animation-name: bar;
    animation-duration: 3s;
}

.bar9 {
    width: 30px;
    height: 30px;
    margin-right: 195px;
    margin-top: -30px;
    background: #313131;
    float: right;
    animation-name: bar0;
    animation-duration: 3s;
}

.bar10 {
    width: 30px;
    height: 30px;
    margin-left: 240px;
    margin-top: -30px;
    background: #313131;
}

.bar11 {
    width: 30px;
    height: 30px;
    margin-left: 270px;
    margin-top: -30px;
    background: #313131;
}

@keyframes bar {
    0% {
      width: 0px;  
    }

    100% {
      width: 30px;  
    }
}

@keyframes bar0 {
    0% {
      width: 60px;  
    }

    100% {
      width: 30px;  
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Тест</title>
    <link rel="stylesheet" href="style9.css">
</head>
<body>
    <div class="hat">
        <h1 class="h11">Questionnaire</h1>
        <div class="ProgressBar">
            <div class="bar1"></div>
            <div class="bar2"></div>
            <div class="bar3"></div>
            <div class="bar4"></div>
            <div class="bar5"></div>
            <div class="bar6"></div>
            <div class="bar7"></div>
            <div class="bar8"></div>
            <div class="bar9"></div>
            <div class="bar10"></div>
            <div class="bar11"></div>
        </div>
</body>

Ответы

▲ 0

Хочу предложить вариант прогресс бара на основе Вашей задумки, с небольшим тестом, для того чтобы Вы могли увидеть его работу и решить подойдет ли он Вам или нет:

Основная идея заключена в том что мы можем использовать классы для того чтобы определять место для анимации, так же с помощью селекторов определять соседние и последующие элементы чтобы делать либо раскрашивание либо анимацию перехода.

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

const cmd = document.querySelector('.cmd');
const pg = document.querySelector('.ProgressBar');
const btns = Array.from(cmd.children) // все кнопки
const bars = Array.from(pg.children)  // все бары прогрессбара

/* делегируем нажатие на кнопку блоку .cmd*/
cmd.addEventListener('click', ({target})=> {
  if (target.tagName === 'BUTTON'){
    /* получаем индекс кнопки */
    const index = btns.indexOf(target)
    /* находим элемент .active */
    const old = pg.querySelector('.active')
    /* cнимаем с элемента .active */
    old.classList.remove('active')
    /* назначаем новый .active */
    bars[index + 1].classList.add('active')
  }
}, false)
/* прогресс бару задаем размер и фон */
.ProgressBar {
  display: flex;
  background: #313131; /* фон важен для последней части */
  width: 300px;
}

/* пребар используется для того чтобы прогресс бар был
темным до начала прогресса */
.prebar {
    width: 0px;
}
/* задает заполненный бар */
.bar {
    width: 30px;
    height: 30px;
    background: #7cbe68;
}
/* задает заполняющийся бар */
.bar.active {
  animation-name: bar_grow;
  animation-duration: 3s;
}
/* задает убывающий бар после заполняющегося */
.bar.active + .bar {
  background: #313131;
  animation-name: bar_shrink;
  animation-duration: 3s;
}
/* задает все бары после активного темными */
.active ~ .bar   {
  background: #313131;
}

@keyframes bar_grow {
    0% {
      width: 0px;  
    }
    100% {
      width: 30px;  
    }
}

@keyframes bar_shrink {
    0% {
      width: 60px;  
    }
    100% {
      width: 30px;  
    }
}
<div class="hat">
<h1 class="h11">Questionnaire</h1>
<div class="ProgressBar">
  <div class="prebar active"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
  <div class="bar"></div>
</div>
<div class="cmd">
  <button>1</button>
  <button>2</button>
  <button>3</button>
  <button>4</button>
  <button>5</button>
  <button>6</button>
  <button>7</button>
  <button>8</button>
  <button>9</button>
  <button>10</button>
</div>