Skonfigurowałem tę prostą wersję akordeonu Bootstrap :
Prosty akordeon: http://jsfiddle.net/darrenc/cngPS/
Obecnie ikona wskazuje tylko w dół , ale czy ktoś wie, jaki JS należałoby zaimplementować, aby zmienić klasę ikony na:
<i class="icon-chevron-up"></i>
... tak, aby wskazywał w górę po rozwinięciu i przełączał się z powrotem w dół po zwinięciu, a więc czwarty?
javascript
jquery
twitter-bootstrap
Darren
źródło
źródło
.bs.collapse
. Zmieniłem też,shown and hidden to show and hide
żeby animacja odbywała się przed otwarciem akordeonu.Oto moje podejście do Bootstrap 2.x. To tylko niektóre pliki CSS. Nie potrzeba JavaScript:
.accordion-caret .accordion-toggle:hover { text-decoration: none; } .accordion-caret .accordion-toggle:hover span, .accordion-caret .accordion-toggle:hover strong { text-decoration: underline; } .accordion-caret .accordion-toggle:before { font-size: 25px; vertical-align: -3px; } .accordion-caret .accordion-toggle:not(.collapsed):before { content: "▾"; margin-right: 0px; } .accordion-caret .accordion-toggle.collapsed:before { content: "▸"; margin-right: 0px; }
Po prostu dodaj klasę akordeon-daszek do elementu div grupy akordeonu, na przykład:
<div class="accordion-group accordion-caret"> <div class="accordion-heading"> <a class="accordion-toggle" data-toggle="collapse" href="#collapseOne"> <strong>Header</strong> </a> </div> <div id="collapseOne" class="accordion-body collapse in"> <div class="accordion-inner"> Content </div> </div> </div>
źródło
Bootstrap Collapse ma kilka zdarzeń, na które możesz zareagować:
$(document).ready(function(){ $('#accordProfile').on('shown', function () { $(".icon-chevron-down").removeClass("icon-chevron-down").addClass("icon-chevron-up"); }); $('#accordProfile').on('hidden', function () { $(".icon-chevron-up").removeClass("icon-chevron-up").addClass("icon-chevron-down"); }); });
źródło
Użyj pseudo-selektora CSS: po użyciu zintegrowanych glifów Bootstrap 3 w celu uzyskania odpowiedzi bez kodu JS z niewielkimi modyfikacjami kodu HTML ...
CSS
.panel-heading [data-toggle="collapse"]:after { font-family: 'Glyphicons Halflings'; content: "\e072"; /* "play" icon */ float: right; color: #b0c5d8; font-size: 18px; line-height: 22px; /* rotate "play" icon from > (right arrow) to down arrow */ -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -ms-transform: rotate(-90deg); -o-transform: rotate(-90deg); transform: rotate(-90deg); } .panel-heading [data-toggle="collapse"].collapsed:after { /* rotate "play" icon from > (right arrow) to ^ (up arrow) */ -webkit-transform: rotate(90deg); -moz-transform: rotate(90deg); -ms-transform: rotate(90deg); -o-transform: rotate(90deg); transform: rotate(90deg); }
HTML
Dodaj
class="collapsed"
do wszystkich znaczników zakotwiczenia, które są domyślnie zamknięte.Spowoduje to włączenie kotwic, takich jak
<a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">
w
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">
Przykład CodePen Live
http://codepen.io/anon/pen/VYobER
Zrzut ekranu
źródło
Dodano do odpowiedzi @muffls, aby działało to ze wszystkimi zwijaniami bootstrapów na Twitterze i powoduje zmianę strzałki przed rozpoczęciem animacji.
$('.collapse').on('show', function(){ $(this).parent().find(".icon-chevron-left").removeClass("icon-chevron-left").addClass("icon-chevron-down"); }).on('hide', function(){ $(this).parent().find(".icon-chevron-down").removeClass("icon-chevron-down").addClass("icon-chevron-left"); });
W zależności od struktury HTML może być konieczne zmodyfikowanie pliku
parent()
.źródło
Myślę, że najlepsze kody to:
$('#accordion1').collapse({ toggle: false }).on('show',function (e) { $(e.target).parent().find(".icon-chevron-down").removeClass("icon-chevron-down").addClass("icon-chevron-up"); }).on('hide', function (e) { $(e.target).parent().find(".icon-chevron-up").removeClass("icon-chevron-up").addClass("icon-chevron-down"); });
źródło
Jeśli ktoś jest zainteresowany, tak to robisz z BS3, ponieważ zmienili nazwy wydarzeń:
$('.collapse').on('show.bs.collapse', function(){ var i = $(this).parent().find('i') i.toggleClass('fa-caret-right fa-caret-down'); }).on('hide.bs.collapse', function(){ var i = $(this).parent().find('i') i.toggleClass('fa-caret-down fa-caret-right'); });
Po prostu zmieniasz nazwy klas w przykładzie na te, których używasz w swoim przypadku.
źródło
Najbardziej czytelnym rozwiązaniem tylko dla CSS byłoby prawdopodobnie użycie atrybutu rozszerzonego aria. Pamiętaj, że musisz dodać aria-expand = "false" do wszystkich elementów collapse, ponieważ nie jest to ustawiane podczas ładowania (tylko przy pierwszym kliknięciu).
HTML:
<h2 data-toggle="collapse" href="#collapseId" aria-expanded="false"> <span class="glyphicon glyphicon-chevron-right"></span> <span class="glyphicon glyphicon-chevron-down"></span> Title </h2>
CSS:
h2[aria-expanded="false"] span.glyphicon-chevron-down, h2[aria-expanded="true"] span.glyphicon-chevron-right { display: none; } h2[aria-expanded="true"] span.glyphicon-chevron-down, h2[aria-expanded="false"] span.glyphicon-chevron-right { display: inline; }
Działa z Bootstrap 3.x.
źródło
Oto moje rozwiązanie, które jest dalej udoskonalane na podstawie tego opublikowanego przez @ john-magnolia i rozwiązuje niektóre z jego problemów
/** * Toggle on/off arrow for Twitter Bootstrap collapsibles. * * Multi-collapsible-friendly; supports several collapsibles in the same group, on the same page. */ function animateCollapsibles() { $('.collapse').on('show', function() { var $t = $(this); var header = $("a[href='#" + $t.attr("id") + "']"); header.find(".icon-chevron-right").removeClass("icon-chevron-right").addClass("icon-chevron-down"); }).on('hide', function(){ var $t = $(this); var header = $("a[href='#" + $t.attr("id") + "']"); header.find(".icon-chevron-down").removeClass("icon-chevron-down").addClass("icon-chevron-right"); }); }
A oto przykładowe znaczniki:
<div class="accordion" id="accordion-send"> <div class="accordion-group"> <div class="accordion-heading"> <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion-send" href="#collapse-refund"> <i class="icon icon-chevron-right"></i> Send notice </a> </div> <div id="collapse-refund" class="accordion-body collapse"> <div class="accordion-inner"> <p>Lorem ipsum Toholampi city</p> </div> </div> </div> </div>
źródło
Rozwiązanie bootstrap v3 (gdzie zdarzenia mają różne nazwy), również używające tylko jednego selektora jQuery (jak widać tutaj ):
$('.accordion').on('hide.bs.collapse show.bs.collapse', function (n) { $(n.target).siblings('.panel-heading').find('i.glyphicon').toggleClass('glyphicon-chevron-down glyphicon-chevron-up'); });
źródło
Tak to robię bez js.
Użyłem ikony glyphicon-triangle-right, ale działa z każdą inną ikoną, co robi, to obrót ikony o 90 stopni, gdy panel jest otwarty lub nie. Używam Bootstrap 3.3.5 .
Kod CSS
h4.panel-title a { display: block; } h4.panel-title a.collapsed .glyphicon-triangle-right { color: #ada9a9 !important; transform: rotate(0deg); } h4.panel-title a .glyphicon-triangle-right { color: #515e64 !important; transform: rotate(90deg); }
To jest struktura HTML zaczerpnięta z przykładu Bootstrap
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> <div class="panel panel-default"> <div class="panel-heading" role="tab" id="headingOne"> <h4 class="panel-title"> <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne"> Proven Expertise <span class="glyphicon glyphicon-triangle-right pull-right" aria-hidden="true"></span> </a> </h4> </div> <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne"> <div class="panel-body"> Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. </div> </div> </div> </div>
źródło
Żadne z powyższych nie działało dla mnie, ale wymyśliłem to i zadziałało:
function toggleChevron(el) { if ($(el).find('i').hasClass('icon-chevron-left')) $(el).find('.icon-chevron-left').removeClass("icon-chevron-left").addClass("icon-chevron-down"); else $(el).find('.icon-chevron-down').removeClass("icon-chevron-down").addClass("icon-chevron-left"); }
Implementacja HTML:
<div class="accordion" id="accordion-send"> <div class="accordion-group"> <div class="accordion-heading" onClick="toggleChevron(this)"> <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion-send" href="#collapse-refund"> <i class="icon icon-chevron-right"></i> Send notice </a> ...
źródło
@RobSadler:
Tylko wersja CSS firmy RE Martina Wickmana ...
Możesz obejść ten problem, umieszczając akordeon-karetkę na tagu kotwicy i domyślnie nadając mu zwiniętą klasę. Tak jak to:
<div class="accordion-group"> <div class="accordion-heading"> <a class="accordion-toggle accordion-caret collapsed" data-toggle="collapse" href="#collapseOne"> <strong>Header</strong> </a> </div> <div id="collapseOne" class="accordion-body collapse in"> <div class="accordion-inner"> Content </div> </div>
To zadziałało dla mnie.
źródło
Dla Bootstrup 3.2 + FontAwesome
$(document).ready(function(){ $('#accordProfile').on('shown.bs.collapse', function () { $(".fa-chevron-down").removeClass("fa-chevron-down").addClass("fa-chevron-up"); }); $('#accordProfile').on('hidden.bs.collapse', function () { $(".fa-chevron-up").removeClass("fa-chevron-up").addClass("fa-chevron-down"); }); });
Czasami trzeba tak napisać. W takim razie
$('.collapsed span').removeClass('fa-minus').addClass('fa-plus');
Generowane automatycznie (class = "collapsed") po naciśnięciu menu ukrywania.
ps, gdy chcesz utworzyć menu drzewiaste
źródło
Odpowiadało na to wiele sposobów, ale to, co wymyśliłem, było dla mnie najprostsze i najłatwiejsze dzięki Bootstrap 3 i niesamowitej czcionce. właśnie zrobiłem
$('a.toggler').on('click', function () {$('i', this).toggleClass('fa-caret-up');});
To tylko przełącza klasę CSS ikony, którą chcę pokazać. I dodać klasę Toggler do elementu chcę zastosować to do. Można to dodać do dowolnego elementu, dla którego chcesz przełączyć ikonę.
źródło
Kolejne rozwiązanie bez javascript, które wykorzystuje samą funkcję zwijania:
/* Prevent block display and transition animation */ .expand-icon.collapse.in, .collapse-icon.collapse.in { display: inline; } .expand-icon.collapsing { display: none; } /* HTML Toggler with glyphicons */ <a data-toggle="collapse" href=".my-collapse"> <span class="my-collapse collapse-icon collapse in"> <span class="glyphicon glyphicon-collapse-up"></span> </span> <span class="my-collapse expand-icon collapse"> <span class="glyphicon glyphicon-expand"></span> </span> </a>
źródło
W przypadku rozwiązania opartego tylko na CSS (i bez ikon) przy użyciu Bootstrap 3 musiałem trochę majstrować w oparciu o powyższą odpowiedź Martina Wickmana.
Nie użyłem notacji akordeonowej *, ponieważ jest to zrobione z panelami w BS3.
Musiałem również dołączyć do początkowego kodu HTML aria-extended = "true" w elemencie, który jest otwarty podczas ładowania strony.
Oto CSS, którego użyłem.
.accordion-toggle:hover { text-decoration: none; } .accordion-toggle:hover span, .accordion-toggle:hover strong { text-decoration: underline; } .accordion-toggle:before { font-size: 25px; } .accordion-toggle[data-toggle="collapse"]:before { content: "+"; margin-right: 0px; } .accordion-toggle[aria-expanded="true"]:before { content: "-"; margin-right: 0px; }
Oto mój oczyszczony HTML:
<div id="acc1"> <div class="panel panel-default"> <div class="panel-heading"> <span class="panel-title"> <a class="accordion-toggle" data-toggle="collapse" aria-expanded="true" data-parent="#acc1" href="#acc1-1">Title 1 </a> </span> </div> <div id=“acc1-1” class="panel-collapse collapse in"> <div class="panel-body"> Text 1 </div> </div> </div> <div class="panel panel-default"> <div class="panel-heading"> <span class="panel-title"> <a class="accordion-toggle" data-toggle="collapse" data-parent="#acc1” href=“#acc1-2”>Title 2 </a> </span> </div> <div id=“acc1-2” class="panel-collapse collapse"> <div class="panel-body"> Text 2 </div> </div> </div> </div>
źródło
Najkrótsza możliwa odpowiedź.
HTML
<a data-toggle="collapse" data-parent="#panel-quote-group" href="#collapseQuote"> <span class="toggle-icon glyphicon glyphicon-collapse-up"></span> </a>
JS:
<script type="text/javascript"> $(function () { $('a[data-toggle="collapse"]').click(function () { $(this).find('span.toggle-icon').toggleClass('glyphicon-collapse-up glyphicon-collapse-down'); }) }) </script>
Oczywiście możesz użyć dowolnego selektora zamiast tagu kotwicy,
a
a także możesz użyć określonego selektora zamiast tego,this
czy ikona znajduje się poza klikniętym elementem.źródło
Oto rozwiązanie, które tworzy sekcję, którą można rozbudowywać za pomocą nieco Material Design, bootstrap 4.5 / 5 alpha i całkowicie bez JavaScript.
Styl dla sekcji głowy
<style> [data-toggle="collapse"] .fa:before { content: "\f077"; } [data-toggle="collapse"].collapsed .fa:before { content: "\f078"; } </style>
Treść html
<div class="pt-3 pb-3" style="border-top: 1px solid #eeeeee; border-bottom: 1px solid #eeeeee; cursor: pointer;"> <a href="#expandId" class="text-dark float-right collapsed" data-toggle="collapse" role="button" aria-expanded="false" aria-controls="expandId"> <i class="fa" aria-hidden="false"></i> </a> <a href="#expandId" class="text-dark collapsed" data-toggle="collapse" role="button" aria-expanded="false" aria-controls="expandId">Expand Header</a> <div class="collapse" id="expandId"> CONTENT GOES IN HERE </div>
źródło