简体   繁体   English

Bootstrap 手风琴打开时旋转图标

[英]Bootstrap Accordion rotate icon when open

I have a bootstrap 4 accordion, What I need is the icon to rotate and point up conditionally when the accordion is "open" and back down when it is closed.我有一个 bootstrap 4 手风琴,我需要的是当手风琴“打开”时有条件地旋转和指向上的图标,当手风琴关闭时返回向下。 I was able to do this with css but I need it to happen conditionally as there are "active" states and not events that should trigger the accordions open if that makes sense.我能够用 css 做到这一点,但我需要它有条件地发生,因为存在“活动”状态而不是触发手风琴打开的事件(如果有意义的话)。

HTML: HTML:

<div class="accordion" id="accordion-nav">

    <div class="accordion-item">
        <div class="item-header" id="heading">
            <button class="btn btn-link btn-nav-accordion" type="button" data-toggle="collapse"
                data-target="#collapseDosing" aria-expanded="false" aria-controls="collapseDosing">
                <span>panel</span>
                <i class="fas fa-chevron-down "></i>
            </button>
        </div>

        <div id="collapseDosing" class="collapse collapse-nav-accordion"
            aria-labelledby="heading-dosing" data-parent="#accordion-nav">
            <div class="accordion-body">
                <div class="l-accordion-body">
                   <h1>Body</h1>>
                </div>
            </div>
        </div>
    </div>

    <div class="accordion-item accordion-item--savings">
        <div class="item-header" id="heading-savings">
            <button class="btn btn-link btn-nav-accordion" type="button" data-toggle="collapse"
                data-target="#collapseSavings" aria-expanded="false" aria-controls="collapseSavings">
                <span>panel</span>
                <i class="fas fa-chevron-down"></i>
            </button>
        </div>
        <div id="collapseSavings" class="collapse collapse-nav-accordion"
            aria-labelledby="heading-savings" data-parent="#accordion-nav">
            <div class="accordion-body">
                <div class="l-accordion-body">
                 <h1>Body</h1>
                </div>
            </div>
        </div>
    </div>
</div>

css: (did work on click event) but need another way conditionally (js) I would think css:(确实在点击事件上工作)但有条件地需要另一种方式(js)我认为

.btn-nav-accordion[aria-expanded="true"] {
  .fa-chevron-down {
    transform: rotate(180deg);
  }
}

js: currently works but does not remove the class when I click the accordion to close now js:当前有效,但当我单击手风琴现在关闭时不会删除该类

 $(".collapse-nav-accordion").each(function () {
      var currentAccordion = this;
      if ($(currentAccordion).hasClass("show")) {
        $(currentAccordion).parent().find("i").addClass("rotate");
      } else {
        $(currentAccordion).parent().find("i").removeClass("rotate");
      }
    });

Your issue is that you are using scss that needs compiling into css.您的问题是您正在使用需要编译成 css 的 scss。 Also your js isn't needed.也不需要你的js。

.btn-nav-accordion[aria-expanded="true"] .fa-chevron-down {
  transform: rotate(180deg);
}

 .fa-chevron-up { transition: all 0.3s ease; } .btn-nav-accordion.collapsed .fa-chevron-up { transform: rotate(180deg); }
 <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" rel="stylesheet"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet" /> <div class="accordion" id="accordion-nav"> <div class="accordion-item"> <div class="item-header" id="heading"> <button class="btn btn-link btn-nav-accordion collapsed" type="button" data-toggle="collapse" data-target="#collapseDosing" aria-expanded="false" aria-controls="collapseDosing"> <span>panel</span> <i class="fas fa-chevron-up"></i> </button> </div> <div id="collapseDosing" class="collapse collapse-nav-accordion" aria-labelledby="heading-dosing" data-parent="#accordion-nav"> <div class="accordion-body"> <div class="l-accordion-body"> <h1>Body</h1> </div> </div> </div> </div> <div class="accordion-item accordion-item--savings"> <div class="item-header" id="heading-savings"> <button class="btn btn-link btn-nav-accordion" type="button" data-toggle="collapse" data-target="#collapseSavings" aria-expanded="true" aria-controls="collapseSavings"> <span>panel</span> <i class="fas fa-chevron-up"></i> </button> </div> <div id="collapseSavings" class="collapse collapse-nav-accordion show" aria-labelledby="heading-savings" data-parent="#accordion-nav"> <div class="accordion-body"> <div class="l-accordion-body"> <h1>Body</h1> </div> </div> </div> </div> </div>

In your code:在您的代码中:

if ($(currentAccordion).hasClass("show")) {
    $(currentAccordion).parent().find("i").addClass("rotate");
  } else {
    $(currentAccordion).parent().find("i").removeClass("rotate");
  }

you're using class "rotate", but you haven't specified what "rotate" does - is it another css definition (like .rotate {transform: rotate(180deg);}) or is it a js behavior, (like if (el.hasClass('rotate')) { el.style.transform = rotate(180deg); } ?您正在使用“旋转”类,但您尚未指定“旋转”的作用 - 它是另一个 css 定义(如.rotate {transform: rotate(180deg);})还是一个 js 行为,(如if (el.hasClass('rotate')) { el.style.transform = rotate(180deg); } ?

Alternatively, I like to just toggle classes, switching between fa-chevron-down and fa-chevron-up:或者,我喜欢只切换类,在 fa-chevron-down 和 fa-chevron-up 之间切换:

if (el.hasClass('rotate') { 
    el.classList.replace('fa-chevron-down', 'fa-chevron-up');
} else {
    el.classList.replace('fa-chevron-up', 'fa-chevron-down');
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM