Dodawanie ikony otwartej / zamkniętej do collapsibles Twitter Bootstrap (akordeony)

87

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?

Darren
źródło

Odpowiedzi:

94

Oto odpowiedź dla tych, którzy szukają rozwiązania w Bootstrap 3 (jak ja).

Część HTML:

<div class="btn-group">
  <button type="button" class="btn btn-danger">Action</button>
  <button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#demo">
    <span class="glyphicon glyphicon-minus"></span>
  </button>
</div>
<div id="demo" class="collapse in">Some dummy text in here.</div>

Część js:

$('.collapse').on('shown.bs.collapse', function(){
$(this).parent().find(".glyphicon-plus").removeClass("glyphicon-plus").addClass("glyphicon-minus");
}).on('hidden.bs.collapse', function(){
$(this).parent().find(".glyphicon-minus").removeClass("glyphicon-minus").addClass("glyphicon-plus");
});

Przykładowy akordeon:

Przykład akordeonu Bootply

Andrei Veve
źródło
6
dokładnie to, czego potrzeba do bootstrap 3.x. jeśli używasz 2.x usuń .bs.collapse. Zmieniłem też, shown and hidden to show and hideżeby animacja odbywała się przed otwarciem akordeonu.
user1881482
2
to powinna być właściwa odpowiedź, ponieważ działa również w wersji 4
Andres Felipe
Co powiesz na zagnieżdżone akordeony? elementy potomne nie mają szewronów, ale nadal otrzymuję przełącznik na rodzicu.
ezoteryczny
48

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>
Martin Wickman
źródło
2
Bardzo podobało mi się to podejście Martin. Szczególnie dlatego, że jest bardzo dyskretny.
J Castillo,
4
Zauważyłem, że to działa z jednym wyjątkiem - początkowy kursor zawsze pokazuje rozwinięty dla wszystkich sekcji. Po rozwinięciu i ponownym zwinięciu jest poprawne.
Robb Sadler
8
@Robb - Dodałem klasę „collapsed” do mojego elementu „collapse” w kodzie HTML, aby rozwiązać problem ze strzałką początkową. Mój kod HTML jest trochę inny, ale prawdopodobnie zadziała
Mark B
1
Podoba mi się również rozwiązanie CSS. Niektórzy moi rówieśnicy czują się bardziej komfortowo w css niż w javascript, więc było to lepsze rozwiązanie dla mojego zespołu. Dziękujemy za zajęcie się częścią dotyczącą inicjalizacji. Teraz działa świetnie!
Hcabnettek
42

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");
    });
});
Philipp Hofmann
źródło
1
Muffls, jesteś gwiazdą! ładne i proste, dzięki za to ;-)
Darren
1
nie ma za co! możesz także użyć pokaż lub ukryj zamiast pokazania i ukrycia. Wypróbuj to. Zobaczysz, który wolisz.
Philipp Hofmann
1
Cześć Muffinki, jakieś pomysły, dlaczego to nie zadziała w mojej witrynie testowej na żywo? datascrew.co.uk/gordonedge.com
Darren,
dodaj $ (document) .ready (... w tobie main.js umieściłem kod powyżej.
Philipp Hofmann
8
Bootstrap3: Nazwy wydarzeń muszą mieć rozszerzenie .bs.collapse, więc są włączone („hide.bs.collapse”) i włączone („show.bs.collapse”) lub widoczne / ukryte, jeśli chcesz dodać więcej przejść CSS do to.
Langeleppel,
21

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

Jak to wygląda w JSBin

bafromca
źródło
1
ten link jsbin został zgłoszony
Nick Bartlett
2
Przeniesiono go do CodePen. Dzięki za zgłoszenie. Spróbuj!
bafromca
16

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().

John Magnolia
źródło
1
+1 wrzuciło to i działało dla mnie - po prostu zmodyfikowano, aby używać ikony-chevron-right zamiast lewej
azcoastal
1
Ten działa dla mnie. Inne kody zmieniają klasę dla wszystkich zakładek po kliknięciu zamiast klikniętej zakładki :)
vignesh
10

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");
      });
user2273425
źródło
2
To jedyne działające rozwiązanie dla mnie, reszta przełącza klasę wszystkich grup akordeonów. Pozdrawiam :)
maximus ツ
6

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.

rbsthlm
źródło
1
Dzięki b3rgstrom, doceniane. Sprawdzę to, kiedy następnym razem użyję BS3.
Darren
1
Nie ma sprawy, pomyślałem, że w przyszłości ktoś może znaleźć twoje pytanie z tym samym problemem :)
rbsthlm
5

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.

Andreas Bergström
źródło
1
To działa doskonale. Ponieważ moim tagiem kotwicy był przełącznik danych, po prostu zmieniłem h2 na a w CSS
MC9000
3

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>
Mikko Ohtamaa
źródło
1
Dobrzy ludzie - czuję się wielkim idiotą, ale nie mogę uruchomić żadnego z tych rozwiązań: -S jedyną różnicą, o której przychodzi mi do głowy, jest to, że używam nowego bootstrap3, a zatem otrzymuję klasy „glificon glyphicon-chevron-right. wskaźniki?
benteh
2
Wersja Bootstrap 3 nie jest zgodna wstecz. Zapoznaj się z dokumentacją Bootstrap 3, jak przeprowadzić migrację kodu.
Mikko Ohtamaa,
1
Cześć, Mikko, dziękuję, tak, zebrałem to i otrzymałem dobrą pomoc tutaj: stackoverflow.com/questions/18147338/...
benteh
3

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');
});
Geert
źródło
Doskonała odpowiedź
Naveen DA
3

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>
General Electric
źródło
Ta metoda działa w moim przypadku, ale stan początkowy jest obracany o 90 stopni. Czy mógłbyś zasugerować, jak ustawić stan początkowy bez zmiany (0 stopni)? Dzięki!
Tsung-Ting Kuo
1
W elementach kotwicy dodaj klasę = "collapsed", aby uniknąć tego, co się z tobą dzieje
General Electric,
Dzięki za odpowiedzi! Próbowałem "<h4 class =" panel-title collapsed ">", ale nie miałem szczęścia. Czy to byłoby poprawne?
Tsung-Ting Kuo
1
Musi znajdować się na tagu kotwicy, ponieważ to, co bootstrap js zmienia, gdy uruchamia się zdarzenie onClick, sprawdź na tej stronie, działa z rozwiązaniem, o którym
General Electric
2

Ż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>
      ...
Joshua Benson
źródło
1

@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.

RioBrewster
źródło
1

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

Popov Andrey
źródło
1

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ę.

Micah Montoya
źródło
0

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>
Sebastian Sangervasi
źródło
0

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>
JessycaFrederick
źródło
0

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, aa także możesz użyć określonego selektora zamiast tego, thisczy ikona znajduje się poza klikniętym elementem.

Junaid
źródło
0

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>
William Worley
źródło