Додавання піктограми відкритого / закритого типу в Twitter Bootstrap, що складається


87

Я створив цю просту версію гармошки Bootstrap :

Простий акордеон: http://jsfiddle.net/darrenc/cngPS/

В даний час піктограма вказує лише вниз , але чи хтось знає, який JS був би необхідний для реалізації, щоб змінити клас піктограми на:

<i class="icon-chevron-up"></i>

... так що при розгортанні він спрямовується вгору і знову перемикається вниз, коли згортається, і так четвертий?

Відповіді:


94

Тут це відповідь для тих, хто шукає рішення в Bootstrap 3 (як я).

Частина 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>

Частина 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");
});

Приклад гармошки:

Приклад аккордеона Bootply


6
саме те, що потрібно для bootstrap 3.x. якщо використовується 2.x видалити .bs.collapse. Я також змінився, shown and hidden to show and hideтому анімація відбувається до того, як відкриється акордеон.
user1881482

2
це повинна бути правильна відповідь, тому що вона працює і у версії 4
Андрес Феліпе

Як щодо вкладених гармошок? у дочірніх елементів немає шевронів, але я все ще отримую перемикач від батьківського.
езотеричний

48

Ось мій підхід до Bootstrap 2.x. Це лише деякі css. Не потрібно 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;
    }

Просто додайте клас акордеон-карету до div групи акордеонів, наприклад:

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

2
Мені дуже подобався такий підхід Мартін. Особливо тому, що дуже ненав’язливо.
J Castillo

4
Я виявив, що це працює за одним винятком - початкова карета завжди відображається розширеною для всіх розділів. Як тільки ви розширите, а потім знову згортаєте, це правильно.
Робб Садлер,

8
@Robb - я включив клас "згорнуто" до свого елемента "згортання" в html, щоб вирішити проблему початковою стрілкою. Мій html трохи інший, але, мабуть, спрацює
Mark B

1
Мені також подобається рішення css. Деяким моїм одноліткам зручніше користуватися CSS, ніж JavaScript, тому це було кращим рішенням для моєї команди. Дякуємо за звернення до частини ініціалізації. Тепер це чудово працює!
Hcabnettek

42

У Bootstrap Collapse є кілька подій, на які ви можете реагувати:

$(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");
    });
});

1
Муфеля, ти зірка! теж приємно і просто, дякую за це ;-)
Даррен

1
Ласкаво просимо! Ви також можете використовувати показ або приховання замість показаного та прихованого. Спробуй. Ви побачите, який з них вам більше подобається.
Філіп Хофманн,

1
Привіт Муфти, будь-які ідеї, чому це не буде працювати на моєму тестовому сайті? datascrew.co.uk/gordonedge.com
Даррен

додати $ (документ) .жом (... у вас main.js я розмістив код вище.
Філіп Хофманн,

8
Bootstrap3: У назвах подій має бути .bs.collapse, тому вони мають увімкнено ('hide.bs.collapse') і ввімкнено ('show.bs.collapse'), або показані / приховані, коли ви хочете додати більше CSS-переходів до це.
Langeleppel

21

Використовуйте псевдоселектор CSSes: після використання вбудованих Glyphicons Bootstrap 3 для відповіді без JS з незначними змінами у вашому 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

Додайте class="collapsed"до будь-яких прив'язок теги, які за замовчуванням закриті.

Це перетворить якорі, такі як

<a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">

в

<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo">

Приклад програми CodePen Live

http://codepen.io/anon/pen/VYobER

Знімок екрана

Як це виглядає в JSBin


1
повідомляється про це jsbin-посилання
Нік Бартлетт,

2
Перемістив його до CodePen. Дякуємо за повідомлення. Спробувати!
bafromca

16

Додано до відповіді @muffls, так що це працює з усіма згорнутими бутстрапами Twitter і вносить зміни до стрілки до початку анімації.

$('.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");
});

Залежно від вашої структури HTML, вам може знадобитися змінити файл parent().


1
+1 скинув це, і це спрацювало для мене - просто змінено, щоб використовувати icon-chevron-право замість ліворуч
azcoastal

1
Цей працює для мене. Інші коди змінюють клас для всіх вкладок при натисканні замість
клацаної

10

Я думаю, що найкращі коди:

  $('#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");
      });

2
Це єдине робоче рішення для мене, відпочинок перемикає клас усіх акордеонів. Вітаємо :)
максимум ツ

6

Якщо хтось зацікавлений, це те, як ви робите це з BS3, оскільки вони змінили назви подій:

$('.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');
});

Ви просто змінюєте назви класів у прикладі на ті, що використовуєте у вашому випадку.


1
Дякую b3rgstrom, вдячний. Я перевірю це при наступному використанні BS3.
Даррен

1
Немає проблем, думав, що хтось може знайти ваше питання в майбутньому з тією ж проблемою :)
rbsthlm

5

Найчитабельнішим рішенням лише для CSS було б, мабуть, використання атрибута aria-extension. Пам'ятайте, що вам потрібно буде додати aria-expand = "false" до всіх елементів згортання, оскільки це не встановлено при завантаженні (лише при першому клацанні).

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;
}

Працює з Bootstrap 3.x.


1
Це працює чудово. Оскільки моїм прив'язним тегом був перемикач даних, я просто змінив h2 на a у CSS
MC9000

3

Ось моє рішення, яке вдосконалено далі від рішення, опубліковане @ john-magnolia, і вирішує деякі його проблеми

/**
 * 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");
    });
}

І ось приклад розмітки:

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

1
Хороші люди - я відчуваю себе великим ідіотом, але не можу задіяти жодне з цих рішень: -S Єдина відмінність, яку я можу придумати, полягає в тому, що я використовую новий bootstrap3, а отже, отримую класи "glyphicon glyphicon-chevron-right". Будь-який покажчики?
бентех

2
Bootstrap 3 - це не сумісна версія із зворотним зв'язком. Будь ласка, зверніться до документації Bootstrap 3, як перенести код.
Mikko Ohtamaa

1
Привіт, Мікко, спасибі, так я зрозумів , що і отримав хорошу допомогу тут: stackoverflow.com/questions/18147338 / ...
benteh

3

Рішення bootstrap v3 (де події мають різні імена), також використовуючи лише один селектор jQuery (як показано тут ):

$('.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');
});

Відмінна відповідь
Naveen DA

3

Ось як я це роблю без жодного js.

Я використовував піктограму гліфікон-трикутник-праворуч, але вона працює з будь-якою іншою піктограмою, а застосовується обертання на 90 градусів до піктограми, коли панель відкрита чи ні. Я використовую Bootstrap 3.3.5 для цього.

Код 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);
}

Це структура HTML, взята з прикладу 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>

Цей метод працює для мене, але початковий статус повертається на 90 градусів. Не могли б ви підказати, як зробити початковий статус скасованим (0deg)? Дякую!
Tsung-Ting Kuo

1
У якірних елементах додайте class = "collapsed", щоб уникнути того, що з вами відбувається
General Electric

Дякуємо за відповідь! Я насправді спробував '<h4 class = "panel-title collapsed">', але мені не пощастило. Чи це було б правильно?
Tsung-Ting Kuo

1
Це має бути на тегу прив'язки, оскільки саме те, що змінюється при завантаженні події onClick, перевіряється на цій сторінці, працює bootstrap js, перевіряючи на цій сторінці, працює з рішенням, про яке я згадав acubavoy.com/preguntas-frequentes
General Electric

2

Жодне з перерахованого не працювало для мене, але я це придумав, і це спрацювало:

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");
}

Реалізація 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>
      ...

1

@RobSadler:

RE Лише версія CSS Мартіна Вікмана ...

Ви можете обійти цю проблему, поставивши акордеон-каретку на анкерний тег і надавши йому згорнутий клас за замовчуванням. Подобається так:

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

Це спрацювало для мене.


1

Для 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");
    });
});

Іноді доводиться писати так. Якщо так

$('.collapsed span').removeClass('fa-minus').addClass('fa-plus');

Автоматично генерується (клас = "згорнуто") при натисканні меню приховування.

ps, коли потрібно створити деревоподібне меню


1

На це дано відповіді безліччю способів, але те, що я придумав, було для мене найпростішим і найпростішим із Bootstrap 3 та чудовими шрифтами. я тільки що зробив

$('a.toggler').on('click', function () {$('i', this).toggleClass('fa-caret-up');});

Це просто перемикає клас CSS значка, який я хочу показати. Я додаю перемикач класів до елемента, до якого я хочу застосувати це. Його можна додати до будь-якого елемента, який потрібно перемкнути піктограмою.


0

Ще одне рішення без javascript, яке використовує саму функціональність згортання:

/* 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>

0

Для рішення, яке стосується лише CSS (і без іконок) із використанням Bootstrap 3, мені довелося трохи повозитись на основі відповіді Мартіна Вікмана вище.

Я не використовував позначення акордеону *, оскільки це зроблено з панелями в BS3.

Крім того, мені довелося включити в початковий HTML aria-expand = "true" на елемент, який відкривається при завантаженні сторінки.

Ось CSS, яким я користувався.

.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; }

Ось мій дезінфікований 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>

0

Найкоротша можлива відповідь.

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>

І звичайно, ви можете використовувати будь-що для селектора замість прив’язувального тегу, aа також можете використовувати конкретний селектор замість того, thisякщо ваша піктограма лежить поза натиснутим елементом.


0

Ось рішення, яке створює розділ, який можна розширити, використовуючи дещо матеріальний дизайн, bootstrap 4.5 / 5 alpha та повністю не javascript.

Стиль для головної секції

<style>
[data-toggle="collapse"] .fa:before {
    content: "\f077";
}

[data-toggle="collapse"].collapsed .fa:before {
    content: "\f078";
}
</style>

Основний 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.