【问题标题】:Make all selected css circles active使所有选定的 css 圆圈处于活动状态
【发布时间】:2020-03-28 21:13:33
【问题描述】:

我正在尝试创建一个 css 圆圈的进度条,其中单击每个圆圈(如 1、2、3)后,所有三个圆圈及其连接线将被红色填充,如果返回如 3、2 , 1 那么颜色应该被移除。

HTML:

<div class="row well" id="rows">
        <ul id="progressbar" class="progressbar">
            <li class="cir danger">THOUGHFUL</li>
            <li class="cir">PASSION</li>
            <li class="cir">POWER OF DESIGN</li>
            <li class="cir">BUILDING RELATIONSHIPS</li>
            <li class="cir">ENHANCE HUMAN INTERATION</li>
        </ul>
    </div>

JS:

var header = document.getElementById("rows");
        var bar = document.getElementsByClassName("progressbar");
        var btns = header.getElementsByClassName("cir");
        for (var i = 0; i < btns.length; i++) {
            btns[i].addEventListener("click", function () {
                var danger = document.getElementsByClassName("danger");
                danger[0].className = danger[0].className.replace("danger", "");
                this.className += " danger";
            });
        }

示例图片:

参考上图,如果我单击圆圈 3,则圆圈 1、2、3 应为红色,然后如果我单击圆圈 2,则圆圈 3 应为白色,1 和 2 应为红色,反之亦然。 我试图通过 JS 来实现它,但是 classnotfound 错误。

对此的任何帮助将不胜感激。

【问题讨论】:

  • 你能发布完整的错误
  • 现在没有错误,我添加了错误的类名,现在红色填充不起作用
  • 您需要定位上一个兄弟姐妹和下一个兄弟姐妹,以确保以前的兄弟姐妹被着色,并且任何之后的兄弟姐妹都被脱色。有关定位上一个和下一个兄弟姐妹的帮助,请参阅How to find all Siblings of the currently selected DOM object
  • 另外,GIF 是否只是为了让您移动光标,因为它似乎没有比图像更有帮助?
  • 是的,gif 在这里不起作用,我已经将视频转换为 gif,我通过你分享的链接获得了但是我怎样才能让它们着色,你能请教一下吗?

标签: javascript html css


【解决方案1】:

每次单击一个圆圈时,获取其 data-id 并激活所有具有相同或较小 data-id 的圆圈。

let circles = document.querySelectorAll(".circle")
circles.forEach(el => {
   el.addEventListener("click", (e) => {
     let id = e.target.dataset.id
     circles.forEach(el2 => {
        if(el2.dataset.id <= id){
            el2.classList.add("active")
        }else{
            el2.classList.remove("active")
        }
     })   
   })
})
.circled{display:flex}
.circle{
   border-radius:50%;
   width:50px;
   height:50px;
   border: solid 2px #333;
   display:inline-flex;
   align-items:center;
   justify-content:center;
   position:relative;
   margin-left: 44px;
   cursor:pointer;
}

.circle:not(:first-of-type)::before{
   height: 2px;
   width: 50px;
   content:"";
   background-color: #333;
   position:absolute;
   left:-50px;
}

.circle.active{
   border-color: #f00;
}

.circle.active:not(:first-of-type)::before{
   background-color: #f00;
}
<div class="circles">
   <div class="circle active" data-id="1">1</div>
   <div class="circle" data-id="2">2</div>
   <div class="circle" data-id="3">3</div>
   <div class="circle" data-id="4">4</div>
   <div class="circle" data-id="5">5</div>
</div>

【讨论】:

  • 我们可以把圆圈1默认变成红色吗?
  • @PrathameshDoke 查看我的编辑,我刚刚在第一个圈子的课程中添加了“活动”
【解决方案2】:

不以此为荣

var header = document.getElementById("rows");
var bar = document.getElementsByClassName("progressbar");
var btns = header.getElementsByClassName("cir");

Array.prototype.forEach.call(btns,function(btn){
    btn.addEventListener('click', function(e){
    updateProgress(btn,e)
  })
});

function updateProgress(btn,e){
    removeDangerFromAll();

  for( let btnToCheck of btns){
    btnToCheck.classList.add('danger');

    if (btnToCheck == btn) {
      break;
    }
  }
}

function removeDangerFromAll(){
    Array.prototype.forEach.call(btns,function(btn){
    btn.classList.remove('danger');
  });
}

更新:切换到更清洁的 classList 作为其他答案

【讨论】:

  • 感谢@Shaun 的回答,它正在工作,但是当单击上一个兄弟时,它的颜色不会改变。
  • 你的 CSS 或 jsfiddle 的任何机会?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多