it-swarm.com.ru

Bootstrap accordion: как избежать прокрутки страницы при свертывании или разворачивании элементов

У меня неожиданная прокрутка страниц при попытке свернуть или развернуть элементы аккордеона. Может быть, я просто что-то не так с системой сетки начальной загрузки? Вот пример страницы: 

Как я могу избежать этого раздражающего эффекта?
Доступно jsfiddle https://jsfiddle.net/Lfwvtyms/1/

<body>
<!--default navbar here-->
<main>
    <h1>Long long long long long long header header header header header header lng lasd lewq j</h1>
    <div class="container">
        <div class="row">
            <div class="col-xs-12">
                <div id="task-list">
                    <div id="accordion" role="tablist" aria-multiselectable="true" class="panel-group">

                        <div class="panel panel-default">
                            <div id="headingOne" role="tab" class="panel-heading"><h4 class="panel-title"><a
                                    data-toggle="collapse" data-target="#collapseOne" href="#collapseOne"
                                    aria-expanded="true" aria-controls="collapseOne">First list</a></h4></div>
                            <div id="collapseOne" role="tabpanel" aria-labelledby="headingOne"
                                 class="panel-collapse collapse in">
                                <ul class="list-group">
                                    <li class="list-group-item">Item1</li>
                                    <li class="list-group-item">Item2</li>
                                    <li class="list-group-item">Item3</li>
                                </ul>
                            </div>
                        </div>

                        <div class="panel panel-default">
                            <div id="headingTwo" role="tab" class="panel-heading"><h4 class="panel-title"><a
                                    data-toggle="collapse" data-target="#collapseTwo" href="#collapseTwo"
                                    aria-expanded="true" aria-controls="collapseTwo">Another list</a></h4></div>
                            <div id="collapseTwo" role="tabpanel" aria-labelledby="headingTwo"
                                 class="panel-collapse collapse in">
                                <ul class="list-group">
                                    <li class="list-group-item">Item1</li>
                                    <li class="list-group-item">Item2</li>
                                    <li class="list-group-item">Item3</li>
                                </ul>
                            </div>
                        </div>

                    </div>
                </div>

                <div id="someDiv">
                    <div class="row">
                        <div class="col-xs-12">
                            <div id="dummy">Div with fixed height here</div>
                        </div>
                    </div>
                </div>

            </div>
        </div>
    </div>
</main>
<footer class="container-fluid">my footer here</footer>
</body>
26
Alendorff

У меня была такая же проблема (переход наверх по клику по ссылке, которая вызывала переключение коллапса) href="#" был изменен на href="javascript:void(0);", и он отлично работает (переключение свертывания без прокрутки вверх)

18
Pavol Kolencin

Замените свойства href в элементах a на # вместо, например, #collapseOne

вместо этого:

<a data-toggle="collapse" data-target="#collapseTwo" href="#collapseTwo"
     aria-expanded="true" aria-controls="collapseTwo">

сделай это

<a data-toggle="collapse" data-target="#collapseTwo" href="#"
     aria-expanded="true" aria-controls="collapseTwo">
24
Diego López

Я была такая же проблема. Оказывается, href вызывает проблему. Если вы не хотите, чтобы при свертывании/развертывании страница вообще прокручивалась, а это именно то, что я хотел, просто удалите href. Оставив это как #, я все же сделал прокрутку экрана наверх для меня.

у меня не сработало

<a data-toggle="collapse" data-target="#collapseOne" href="#SectionOne"></a>
<a data-toggle="collapse" data-target="#collapseOne" href="#"></a>

работал:

<a data-toggle="collapse" data-target="#collapseOne"></a>

Смотрите мое обновление здесь: https://jsfiddle.net/Lfwvtyms/5/

8
Simmy

У меня была такая же проблема, и я нашел свое решение с этим ответом в другом посте. 

Ничто другое не сработало, за исключением этого крошечного кусочка Javascript, добавленного в мой пользовательский файл .js. Он плавно возвращает фокус к выбранному заголовку панели. Единственное, что я изменил в соответствии со своим дизайном, - это расстояние до вершины в строке 6.

https://stackoverflow.com/a/38180220/4844273

$('#accordion').on('shown.bs.collapse', function () {

    var panel = $(this).find('.in');

    $('html, body').animate({
        scrollTop: panel.offset().top - 130
    }, 500);
});
5
elarcoiris

Другой вариант - использовать кнопки вместо якорных ссылок, чтобы в первую очередь не вызывать href. Например, вместо первого <a>:

<button data-toggle="collapse" data-target="#collapseOne"
  aria-expanded="true" aria-controls="collapseOne">
  First list
</button>

Есть много примеров использования <button> вместо <a> в эта документация .

2
jtenclay

$('.panel-group').on('click', function(){ $('html,body').stop(); });

Это определенно будет работать, если у вас нет вариантов.

0
thebrownkid

Вы можете переопределить обработчик кликов и использовать метод preventDefault() для события click:

$('.aHandler').click( function(event) {
    event.preventDefault();
    ...
});

Где 'aHandler' - это класс в ваших тегах 'a': <a class="aHandler" ...>...</a>, или любой другой допустимый селектор jquery .

0
user2812481