Bootstrap аккордеон прокрутка до верхней части заголовка активной панели

Я ищу код, который прокручивается до верхней части текущего активного заголовка панели моего аккордеона bootstrap 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-кодом аккордеона bootstrap.

5 ответов


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

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

это предназначено для конкретного .заголовок панели щелкнул в соответствии с комментарием Джеймса Уилсона к принятому ответу.

$(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 является ВАР смещения и цель 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); 
    }
});
});

Always animate выглядит слишком много, поэтому это моя версия, чтобы выполнять работу только тогда, когда заголовок находится над видимой частью. (обратите внимание, что я использую 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);
    }
});

С помощью .panel-default как селектор .on(), вы можете перейти к активной панели.

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