[英]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.