Twitter Bootstrap modal на мобильных устройствах
Модальные бутстрэпы не работают должным образом на Android и iOS. Система отслеживания проблем признает проблему, но не предлагает рабочего решения:
Модалы в 2.0 не работают на мобильном телефоне.
Модальное окно в 2.0 не позиционируется должным образом
Экран темнеет, но сам модал не виден в области просмотра. Это можно найти в верхней части страницы. Проблема возникает, когда вы прокручиваете страницу вниз.
Вот соответствующая часть bootstrap-responseive.css:
.modal {
position:fixed;
top:50%;
left:50%;
z-index:1050;
max-height:500px;
overflow:auto;
width:560px;
background-color:#fff;
border:1px solid #999;
-webkit-border-radius:6px;
-moz-border-radius:6px;
border-radius:6px;
-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);
-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);
box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);
-webkit-background-clip:padding-box;
-moz-background-clip:padding-box;
background-clip:padding-box;
margin:-250px 0 0 -280px;
}
Могу ли я применить исправление?
Ответы
Ответ 1
EDIT: неофициальная модификация Bootstrap Modal была построена для решения проблем с ответом/передвижением. Это, пожалуй, самый простой и простой способ устранить проблему.
С тех пор было исправлено обнаружение в одной из проблем, которые вы обсуждали ранее
in bootstrap-responsive.css
.modal {
position: fixed;
top: 3%;
right: 3%;
left: 3%;
width: auto;
margin: 0;
}
.modal-body {
height: 60%;
}
и в bootstrap.css
.modal-body {
max-height: 350px;
padding: 15px;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
Ответ 2
Ответ Gil дает обещание (связанная с ним библиотека) --- но пока это пока не работает при прокрутке на мобильном устройстве.
Я решил проблему для себя, используя только фрагмент CSS в конце моих CSS файлов:
@media (max-width: 767px) {
#content .modal.fade.in {
top: 5%;
}
}
Селектор #content
- это просто идентификатор, который обертывает мой html, поэтому я могу переопределить специфичность Bootstrap (установить свой собственный идентификатор, обертывающий ваш модальный html).
Недостаток: Он не центрируется по вертикали на мобильных устройствах.
Потенциал: Он виден, а на более мелких устройствах мода размера будет занимать большую часть экрана, поэтому "не центрирование" будет не таким очевидным.
Почему это работает:
Когда вы находитесь на низких экранах с помощью Bootstrap отзывчивого CSS, для устройств с меньшими экранами он устанавливает .modal.fade.in 'top' в 'auto'. По какой-то причине браузеру мобильных веб-китов, похоже, нелегко разобраться с вертикальным размещением с присвоением "авто". Поэтому просто переключите его на фиксированное значение, и он отлично работает.
Поскольку модальное значение уже установлено в postition: absolute, это значение относительно высоты окна просмотра, а не высота документа, поэтому оно работает независимо от того, как долго длится страница или где вы прокручиваетесь.
Ответ 3
Решение niftylettuce в проблема 2130 кажется фиксировать модальности на всех мобильных платформах...
9/1/12 UPDATE: исправление было обновлено здесь: twitter bootstrap jquery plugins
(приведенный ниже код старше, но все еще работает)
// # Twitter Bootstrap modal responsive fix by @niftylettuce
// * resolves #407, #1017, #1339, #2130, #3361, #3362, #4283
// <https://github.com/twitter/bootstrap/issues/2130>
// * built-in support for fullscreen Bootstrap Image Gallery
// <https://github.com/blueimp/Bootstrap-Image-Gallery>
// **NOTE:** If you are using .modal-fullscreen, you will need
// to add the following CSS to `bootstrap-image-gallery.css`:
//
// @media (max-width: 480px) {
// .modal-fullscreen {
// left: 0 !important;
// right: 0 !important;
// margin-top: 0 !important;
// margin-left: 0 !important;
// }
// }
//
var adjustModal = function($modal) {
var top;
if ($(window).width() <= 480) {
if ($modal.hasClass('modal-fullscreen')) {
if ($modal.height() >= $(window).height()) {
top = $(window).scrollTop();
} else {
top = $(window).scrollTop() + ($(window).height() - $modal.height()) / 2;
}
} else if ($modal.height() >= $(window).height() - 10) {
top = $(window).scrollTop() + 10;
} else {
top = $(window).scrollTop() + ($(window).height() - $modal.height()) / 2;
}
} else {
top = '50%';
if ($modal.hasClass('modal-fullscreen')) {
$modal.stop().animate({
marginTop : -($modal.outerHeight() / 2)
, marginLeft : -($modal.outerWidth() / 2)
, top : top
}, "fast");
return;
}
}
$modal.stop().animate({ 'top': top }, "fast");
};
var show = function() {
var $modal = $(this);
adjustModal($modal);
};
var checkShow = function() {
$('.modal').each(function() {
var $modal = $(this);
if ($modal.css('display') !== 'block') return;
adjustModal($modal);
});
};
var modalWindowResize = function() {
$('.modal').not('.modal-gallery').on('show', show);
$('.modal-gallery').on('displayed', show);
checkShow();
};
$(modalWindowResize);
$(window).resize(modalWindowResize);
$(window).scroll(checkShow);
Ответ 4
Мы используем этот код для центрирования диалоговых окон Bootstrap при их открытии. У меня не было никаких проблем с ними на iOS при использовании этого, но я не уверен, что он будет работать для Android.
$('.modal').on('show', function(e) {
var modal = $(this);
modal.css('margin-top', (modal.outerHeight() / 2) * -1)
.css('margin-left', (modal.outerWidth() / 2) * -1);
return this;
});
Ответ 5
По общему признанию, я не пробовал ни одного из перечисленных выше решений, но я (в конце концов) прыгал от радости, когда я пробовал jschr Bootstrap-modal project в Bootstrap 3 (связанный с верхним ответом). Js вызывал у меня проблемы, поэтому я отказался от нее (возможно, у меня была уникальная проблема или она отлично работает для Bootstrap 2), но сами файлы CSS, похоже, делают трюк в собственном браузере 2.3.4 Android.
В моем случае я до сих пор прибегал к использованию (субоптимального) обнаружения пользовательского агента перед использованием переопределений для обеспечения ожидаемого поведения на современных телефонах.
Например, если вы хотите, чтобы все телефоны Android версии 3.x и ниже были использованы только для использования полного набора хаков, вы могли бы добавить к телу класс "oldPhoneModalNeeded" после обнаружения агента пользователя с помощью javascript, а затем изменить jschr Bootstrap-modal Свойства CSS всегда имеют .oldPhoneModalNeeded как предок.
Ответ 6
вы можете добавить это свойство глобально в javascript:
if( navigator.userAgent.match(/iPhone|iPad|iPod/i) ) {
var styleEl = document.createElement('style'), styleSheet;
document.head.appendChild(styleEl);
styleSheet = styleEl.sheet;
styleSheet.insertRule(".modal { position:absolute; bottom:auto; }", 0);
}
Ответ 7
ОК, это исправит, я попробовал это сегодня 5 сентября, но вы должны обязательно проверить демо
Решение niftylettuce в выпуске 2130, похоже, исправляет модальности во всех мобильные платформы...
9/1/12 UPDATE: исправление было обновлено здесь: twitter bootstrap jquery plugins
вот ссылка на Демо
Он отлично работает с кодом, который я использовал
title_dialog.modal();
title_dialog.modalResponsiveFix({})
title_dialog.touchScroll();
Ответ 8
Мое решение...
Ver en jsfiddle
//Fix modal mobile Boostrap 3
function Show(id){
//Fix CSS
$(".modal-footer").css({"padding":"19px 20px 20px","margin-top":"15px","text-align":"right","border-top":"1px solid #e5e5e5"});
$(".modal-body").css("overflow-y","auto");
//Fix .modal-body height
$('#'+id).on('shown.bs.modal',function(){
$("#"+id+">.modal-dialog>.modal-content>.modal-body").css("height","auto");
h1=$("#"+id+">.modal-dialog").height();
h2=$(window).height();
h3=$("#"+id+">.modal-dialog>.modal-content>.modal-body").height();
h4=h2-(h1-h3);
if($(window).width()>=768){
if(h1>h2){
$("#"+id+">.modal-dialog>.modal-content>.modal-body").height(h4);
}
$("#"+id+">.modal-dialog").css("margin","30px auto");
$("#"+id+">.modal-dialog>.modal-content").css("border","1px solid rgba(0,0,0,0.2)");
$("#"+id+">.modal-dialog>.modal-content").css("border-radius",6);
if($("#"+id+">.modal-dialog").height()+30>h2){
$("#"+id+">.modal-dialog").css("margin-top","0px");
$("#"+id+">.modal-dialog").css("margin-bottom","0px");
}
}
else{
//Fix full-screen in mobiles
$("#"+id+">.modal-dialog>.modal-content>.modal-body").height(h4);
$("#"+id+">.modal-dialog").css("margin",0);
$("#"+id+">.modal-dialog>.modal-content").css("border",0);
$("#"+id+">.modal-dialog>.modal-content").css("border-radius",0);
}
//Aply changes on screen resize (example: mobile orientation)
window.onresize=function(){
$("#"+id+">.modal-dialog>.modal-content>.modal-body").css("height","auto");
h1=$("#"+id+">.modal-dialog").height();
h2=$(window).height();
h3=$("#"+id+">.modal-dialog>.modal-content>.modal-body").height();
h4=h2-(h1-h3);
if($(window).width()>=768){
if(h1>h2){
$("#"+id+">.modal-dialog>.modal-content>.modal-body").height(h4);
}
$("#"+id+">.modal-dialog").css("margin","30px auto");
$("#"+id+">.modal-dialog>.modal-content").css("border","1px solid rgba(0,0,0,0.2)");
$("#"+id+">.modal-dialog>.modal-content").css("border-radius",6);
if($("#"+id+">.modal-dialog").height()+30>h2){
$("#"+id+">.modal-dialog").css("margin-top","0px");
$("#"+id+">.modal-dialog").css("margin-bottom","0px");
}
}
else{
//Fix full-screen in mobiles
$("#"+id+">.modal-dialog>.modal-content>.modal-body").height(h4);
$("#"+id+">.modal-dialog").css("margin",0);
$("#"+id+">.modal-dialog>.modal-content").css("border",0);
$("#"+id+">.modal-dialog>.modal-content").css("border-radius",0);
}
};
});
//Free event listener
$('#'+id).on('hide.bs.modal',function(){
window.onresize=function(){};
});
//Mobile haven't scrollbar, so this is touch event scrollbar implementation
var y1=0;
var y2=0;
var div=$("#"+id+">.modal-dialog>.modal-content>.modal-body")[0];
div.addEventListener("touchstart",function(event){
y1=event.touches[0].clientY;
});
div.addEventListener("touchmove",function(event){
event.preventDefault();
y2=event.touches[0].clientY;
var limite=div.scrollHeight-div.clientHeight;
var diff=div.scrollTop+y1-y2;
if(diff<0)diff=0;
if(diff>limite)diff=limite;
div.scrollTop=diff;
y1=y2;
});
//Fix position modal, scroll to top.
$('html, body').scrollTop(0);
//Show
$("#"+id).modal('show');
}
Ответ 9
Обнаружено очень хакерское решение этой проблемы, но оно работает.
Я добавил класс к ссылке, которая используется для открытия модального (с целью передачи данных), а затем с помощью Jquery добавила событие click к этому классу, который получает цель данных, находит модальный, который он должен открыть, и затем открывает его через Javascript. Для меня все отлично. Я также добавил мобильную проверку на мой, так что она работает только на мобильных устройствах, но это не требуется.
$('.forceOpen').click(function() {
var id = $(this).attr('data-target');
$('.modal').modal('hide');
$(id).modal('show');
});
Ответ 10
В основном модальная проблема Nexus 7, модальный шел по экрану
.modal:before {
content: '';
display: inline-block;
height: 50%; (the value was 100% for center the modal)
vertical-align: middle;
margin-right: -4px;
}
Ответ 11
Для меня просто $('[data-toggle="modal"]').click(function(){});
работает нормально.
Ответ 12
Хотя этот вопрос довольно старый, некоторые люди все еще могут наткнуться на него, когда ищут решение для улучшения UX модалов на мобильных телефонах.
Я сделал много, чтобы улучшить поведение модалов Bootrsrap на телефонах.
Bootstrap 3: https://github.com/keaukraine/bootstrap-fs-modal
Bootstrap 4: https://github.com/keaukraine/bootstrap4-fs-modal