移动设备上的Twitter Bootstrap模态


69

引导程序模式在Android和iOS上无法正常工作。问题跟踪器已确认问题,但未提供有效的解决方案:

2.0中的模式在移动设备上已损坏。

2.0中的模态窗口无法正确定位

屏幕变暗,但模态本身在视口中不可见。可以在页面顶部找到它。当您向下滚动页面时,会发生此问题。

这是bootstrap-sensitive.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;
}

有可以应用的修复程序吗?

Answers:


64

编辑:非官方的Bootstrap Modal修改已建立,以解决响应/移动问题。这也许是解决问题的最简单,最简单的方法。

此后,您在前面讨论的问题之一中找到了修复程序

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; 
 }

解决了在装有ios 6(无论是Safari的哪个版本)的iPhone上的问题
Icarus 2012年

1
.modal中有一个错误。您的最高得分为3%,最低得分为3%。如果卸下底部:3%,它将按预期工作。
马丁·布卡·韦瑟

仅供参考,@ Maurice我更新了答案,以思考一个新的Github项目,该项目以更优雅的解决方案解决了这个问题。
acconrad

我发现有必要也添加底部:3%;在.modal类的移动版css版本中,因此在移动版上,可以滚动到模式的末尾。另外,请谨慎使用桌面版本的max-height。为了避免在桌面版本中,模态的主体很小,并且模态的页脚位于主屏幕上,我将max-height添加到1200 px;
martar

14

吉尔(Gil)的回答很有希望(他链接到的库)---但是暂时来说,当在移动设备上向下滚动时,它仍然不起作用。

我在CSS文件末尾仅使用了一小段CSS为自己解决了这个问题:

@media (max-width: 767px) {
  #content .modal.fade.in {
    top: 5%;
  }
}

#content选择很简单,就是围绕我的HTML,所以我可以重写引导的特异性的ID(设置为您自己的ID包裹你的HTML模式)。

缺点:它不在移动设备上垂直居中。

好处:它是可见的,在较小的设备上,合理大小的模式会占据屏幕的大部分位置,因此“非居中”不会那么明显。

工作原理:

当您使用Bootstrap的响应式CSS来缩小屏幕尺寸时,对于屏幕较小的设备,它会将.modal.fade.in的“顶部”设置为“自动”。出于某种原因,移动Webkit浏览器似乎很难用“自动”分配来确定垂直位置。因此,只需将其切换回固定值就可以了。

由于模态已设置为postition:absolute,因此该值是相对于视口的高度,而不是文档高度,因此无论页面多长时间或滚动到何处,它都有效。


4

niftylettuce问题2130提出的解决方案似乎修复了所有移动平台中的模式...

2012年9月1日更新:修复程序已在此处更新:twitter bootstrap jquery插件

(以下代码较旧,但仍然有效)

// # 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);

2

打开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;
});

1

诚然,我没有尝试过上面列出的任何解决方案,但是当我尝试jschr的Bootstrap-modal项目时,我(最终)为之欢欣鼓舞在Bootstrap 3中链接到。js给我带来了麻烦,所以我放弃了它(也许是我的一个独特问题,或者它对Bootstrap 2来说效果很好),但是CSS文件本身似乎可以在Android的本机2.3.4浏览器中解决问题。

就我而言,到目前为止,我一直使用(次优)用户代理检测,然后使用替代功能允许现代手机中出现预期的行为。

例如,如果您只希望所有3.x及以下版本的Android手机仅使用完整的黑客工具,则可以在使用JavaScript进行用户代理检测后向主体添加“ oldPhoneModalNeeded”类,然后将jschr的Bootstrap-modal CSS属性修改为始终需要.oldPhoneModal作为祖先。


1

您可以在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);
 }

0

好的,确实可以解决问题。我今天尝试了2012年9月5日,但您必须确保查看演示

niftylettuce在问题2130中提出的解决方案似乎修复了所有移动平台中的模式...

2012年9月1日更新:修复程序已在此处更新: twitter bootstrap jquery插件

这是演示的链接, 这很好用,这是我使用的代码

            title_dialog.modal();
            title_dialog.modalResponsiveFix({})
            title_dialog.touchScroll();

0

我的解决方案...

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');
}

0

找到了一个非常棘手的解决方案来解决此问题,但是它可以工作。我在用于打开模式(带有数据目标)的链接中添加了一个类,然后使用Jquery,向获取数据目标的类中添加了click事件,找到了应该打开的模式,然后然后通过Javascript打开它。对我来说很好。我还在我的设备上添加了移动支票,以便它只能在移动设备上运行,但这不是必需的。

$('.forceOpen').click(function() {
  var id = $(this).attr('data-target');
  $('.modal').modal('hide');
  $(id).modal('show');
});

0

主要是Nexus 7模态问题,模态正在屏幕上

  .modal:before {
    content: '';
    display: inline-block;
    height: 50%; (the value was 100% for center the modal)
    vertical-align: middle;
    margin-right: -4px;
  }


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.