Букстральный аккордеон прокручивается вверху заголовка активной панели

Я ищу код, который прокручивается вверху текущего активного заголовка панели моего бутстрапа 3 html/css аккордеона. Самое близкое решение, которое я нашел в stackoverflow, - это фрагмент js ниже.

Этот фрагмент работает достаточно хорошо, но когда заголовок панели нажимается, страница прокручивается так, что верх верхней части содержимого панели находится на одном уровне с верхней частью экрана. Есть ли способ изменить это, так что эффект прокрутки приведет к тому, что панель "заголовок" (в отличие от верхней части области содержимого панели) будет видна в верхней части экрана?

    $(function () {
    $('#accordion').on('shown.bs.collapse', function (e) {
    var offset = $('.panel.panel-default > .panel-collapse.in').offset();
    if(offset)$('html,body').scrollTop(offset.top); }); });

Сообщите мне, должен ли я также использовать html для бутстрапового аккордеона.

Ответ 1

Я использовал это, и он отлично работает, вы можете настроить -20 после .offset(). top, если вам нужно немного подправить его вверх или вниз.

$(function () {
    $('#accordion').on('shown.bs.collapse', function (e) {
        var offset = $('.panel.panel-default > .panel-collapse.in').offset();
        if(offset) {
            $('html,body').animate({
                scrollTop: $('.panel-title a').offset().top -20
            }, 500); 
        }
    }); 
});

Ответ 2

Это нацеливается на конкретный заголовок панели, нажав на комментарий Джеймса Уилсона относительно принятого ответа.

$(function () {
    $('#accordion').on('shown.bs.collapse', function (e) {
        var offset = $(this).find('.collapse.in').prev('.panel-heading');
        if(offset) {
            $('html,body').animate({
                scrollTop: $(offset).offset().top -20
            }, 500); 
        }
    }); 
});

Все, что я изменил с принятого ответа gigelsmith, это "var offset" и target scrollTop.

Ответ 3

Я не мог получить ответ выше, чтобы работать, возможно, мне что-то не хватает, но я не вижу, как строка scrollTop выше относится к текущему открытому аккордеонному элементу, поэтому вместо этого использовал следующий код. Надеюсь, это поможет кому-то еще:

$(function () {
$('#accordion').on('shown.bs.collapse', function (e) {
    var offset = $('.panel.panel-default > .panel-collapse.in').offset();
    if(offset) {
        $('html,body').animate({
            scrollTop: $('.panel-collapse.in').siblings('.panel-heading').offset().top
        }, 500); 
    }
});
});

Ответ 4

Всегда анимация выглядит слишком много, поэтому это моя версия, которая выполняет только задание, когда заголовок находится над видимой частью. (обратите внимание, что я использую data-accordion-focus для применения исправления)

$('[data-accordion-focus]').on('shown.bs.collapse', function (e) {
    var headingTop = $(e.target).prev('.panel-heading').offset().top - 5;
    var visibleTop = $(window).scrollTop();
    if (headingTop < visibleTop) {
        $('html,body').animate({
            scrollTop: headingTop
        }, 500);
    }
});

Ответ 5

Используя .panel-default в качестве селектора .on(), вы можете перейти к активной панели.

$('#accordion').on('shown.bs.collapse', '.panel-default', function (e) {
    $('html,body').animate({
        scrollTop: $(this).offset().top
    }, 500); 
}); 

Ответ 6

где и как я должен включить код для этой функции аккордеона?

$('#accordion').on('shown.bs.collapse', '.panel-default', function (e) {
$('html,body').animate({
    scrollTop: $(this).offset().top
}, 500); 

});

Спасибо