Twitter Bootstrap Модальная прокрутка страницы вверх
Нажав на ссылку, которая вызывает всплывающее окно загрузки Bootstrap Modal, браузер просматривает страницу. Это поведение происходит только в Chrome.
Вот демонстрационная страница:
http://www.turizmburosu.com/test2.aspx
Страница содержит 600 строк ссылок, в результате чего тело страницы превышает высоту окна. Если какая-либо из этих ссылок нажата, отображается модальное диалоговое окно. Когда в Chrome, нажав любую из ссылок ниже первоначального представления, будет прокручиваться фоновая страница (не всегда полностью вверх).
Я использую следующую функцию для запуска отображения модала:
function test(id, imp) {
$("#modalLabel").html("Header");
$("#modalBody").html("Body");
$("#myModal").modal("show");
}
и ссылки имеют вид:
<a href="" onclick="test();return false;">Test Link ###</a>
Я вижу это поведение в Chrome 22.0.1229.94 м.
Любые предложения/идеи относительно того, почему это происходит и как его предотвратить?
Дополнительный пример
Это можно воссоздать на странице документации Twitter Bootstrap для плагина Modal.
Как только на странице просто переопределите существующий data-api, вместо этого используйте api-скрипт JavaScript:
$('#modals a[data-toggle="modal"]').on('click',
function(e) {
$('#myModal').modal('toggle');
return false
});
Теперь, если нажата кнопка Запустить демонстрационный модальный, страница будет прокручиваться, когда будет показан модальный режим.
Опять же, это использование Chrome.
Ответы
Ответ 1
Исправлено (10/29/2012)
Эта проблема исправлена с момента загрузки Bootstrap v2.2.0. Подробнее см. commit e24b46....
(оригинальный ответ)
Это связано с ошибкой в реализации Twitter Bootstrap Modal (с 2.1.1). Корень проблемы заключается в том, что фокус устанавливается на модальный до его завершения. Это произойдет только при условии, что
- браузер поддерживает переходы CSS (и вы используете bootstrap-transition.js);
- модальный имеет класс
fade
; и
- Когда фокус установлен на элемент за пределами текущего представления, браузер будет прокручивать его, чтобы переместить его в режим просмотра (например, Chrome, Safari).
Следует отметить, что это влияет как на API данных (на основе разметки), так и на API-интерфейс Programmatic (JS-based). Тем не менее, причина, по которой это более заметно при использовании программного подхода, заключается в том, что, в отличие от API данных, он автоматически не восстанавливает фокус на элемент запуска и, следовательно, не прокручивает вид назад, когда модаль скрыт.
Дополнительная информация доступна в Twitter Bootstrap repo под Проблема № 5336: Модальные прокрутки Фоновый контент.
Исправление было объединено с веткой 2.1.2-wip, которая должна быть выпущена для любого день.
Вот демонстрационная версия с использованием патча bootstrap-modal.js:
Ответ 2
Такая же проблема. Это вызвано "#", и анкер выполняет прокрутку.
Я исправил это, удалив привязную метку и поместив ее:
<span onclick="$('#umisteni_modal').modal('show');" style="cursor:pointer;">Změnit místo dodání</span>
Ответ 3
У меня была аналогичная проблема на моем сайте, которая была вызвана другим плагином jquery (sidr).
Когда боковая панель присутствовала, и я открыл модальное окно, я был бы отправлен назад.
В jquery.sidr.js я изменил строку 102-106 на:
// Prepare page if container is body
if($body.is('body')){
scrollTop = $html.scrollTop();
$html.css('overflow-x', 'hidden').scrollTop(scrollTop);
}
To:
// Prepare page if container is body
if($body.is('body') && !$('#modal').hasClass('in')){
scrollTop = $html.scrollTop();
$html.css('overflow-x', 'hidden').scrollTop(scrollTop);
}
Если вы используете этот плагин вместе с модулем twitter bootstrap, возможно, это может вам помочь.
Ответ 4
У меня была такая же проблема из-за этих строк CSS, которые, как полагали, постоянно отображали полосы прокрутки в браузере. Удаление двух линий решило проблему:
html,
body {
min-height: 100%;
height: 101%;
}
Ответ 5
чтобы вернуть фокус на закрытии
var triggerOffset=0;
$('.modal').on('show.bs.modal', function() {
triggerOffset=$(window).scrollTop();
});
$('.modal').on('hidden.bs.modal', function() {
var animationTime=1;
$('html, body').animate({
scrollTop: (triggerOffset)
}, animationTime);
});
Ответ 6
У меня была эта проблема так долго, но моим решением было удалить href из тега привязки
то есть.
<a onclick="test();return false;">Test Link ###</a>
Теперь я не прыгаю
Надеюсь, что это поможет кому-то в будущем