复选框 checked/unchecked 时更新进度条的宽度

Updating width on progress bar when checkbox checked/unchecked

我想做什么

每次选中或取消选中列表中的复选框时,按百分比值增加或减少进度条。

例如,如果列表中有两个复选框,则当复选框为 checked/unchecked 时,条形图应增加或减少 50%。如果有 4 个复选框,则为 25% 等等

什么有效

我可以设置bar需要的百分比increase/decrease ok。而且我可以获得将宽度更改为例如的进度第一次选中复选框时为 50%。

什么不起作用:

我不知道如何 increase/decrease 每次按 checklistProgressInterval 百分比数量的进度。例如,如果值为 50%,则每次选中复选框时进度应增加 50%,未选中时进度应减少 50%。

我可以让它增加 到 50% 但不能 增加 50%。 += 似乎在每次检查后增加 1%。

谁能帮我解决我做错了什么?谢谢

let checklistItems = document.querySelectorAll('.list--checklist__item'),
    checklistProgressBar = document.querySelector('.progress-bar--checklist .progress-indicator'),
    checklistLen = checklistItems.length,
    checklistProgressInterval = 100 / checklistLen;

checklistItems.forEach((checklistItem) => {
    let checklistInput = checklistItem.querySelector('.input--checklist__input'),
        checklistContainer = checklistItem.querySelector('.input--checklist__container'),
        checklistText = checklistItem.querySelector('.list--checklist__item--text');
    checklistContainer.addEventListener('click', () => {
        if (checklistInput.checked == true) {
            checklistItem.classList.add('finished');
            checklistProgressBar.style.width += `${checklistProgressInterval}%`;
        } else {
            checklistItem.classList.remove('finished');
            checklistProgressBar.style.width -= `${checklistProgressInterval}%`;
        }
    })
});

我猜你做的 += 错了

Afaik,您不能为样式添加宽度,因为您使用的是字符串。 需要事先计算好并赋值给变量。

还要确保您的进度条父级有宽度,例如 100px。

检查这个例子:

因此,在此处添加变量而不是 0% 和 50%,并在分配之前计算 %。

function checkMe() {
  const checkBoxes = document.querySelectorAll(".myCheckBox");
  const progress = document.querySelector(".progress-inner");
  const checklistProgressInterval = 100 / checkBoxes.length;
  let width = 0;
  
  for(let i = 0; i < checkBoxes.length; i++){
    if(checkBoxes[i].checked){
      width += checklistProgressInterval;
    }
  }
  
    progress.style.width = `${width}%`;
}
.progress{
  width: 150px;
  height: 20px;
  background-color: #333;
  border: 1px solid black;
  }

.progress-inner{
  background-color: #f7f;
  width: 0%;
  height: 100%;
  }
<div class="progress">
  <div class="progress-inner"></div>
</div>

<input class="myCheckBox" type="checkbox" onclick="checkMe()" />
<input class="myCheckBox" type="checkbox" onclick="checkMe()" />
<input class="myCheckBox" type="checkbox" onclick="checkMe()" />
<input class="myCheckBox" type="checkbox" onclick="checkMe()" />
<input class="myCheckBox" type="checkbox" onclick="checkMe()" />