小册子地图在bootstrap 3.0模式中没有正确显示

use*_*100 14 modal-dialog twitter-bootstrap leaflet

我有一个大问题.我想在模态中打开传单地图.但地图显示不正确.瓷砖没有加载.

这是脚本:

http://bootply.com/98730

<a href="#myModal" role="button" class="btn btn-primary" data-toggle="modal">Open Map</a>

<div id="myModal" class="modal">
<div class="modal-dialog">
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
      <h4 class="modal-title">Map</h4>
    </div>
    <div class="modal-body">
      <div class="modal-body" id="map-canvas"></div>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">OK</button>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

$.getScript('http://cdn.leafletjs.com/leaflet-0.7/leaflet.js',function(){

 /* map settings */
 var map = new L.Map('map-canvas');
 var cloudmade = new    L.TileLayer('http://{s}.tile.cloudmade.com/f1376bb0c116495e8cb9121360802fb0/997/256/{z}/{x} /{y}.png', {
 attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a>   contributors, Imagery © <a href="http://cloudmade.com">CloudMade</a>',
 maxZoom: 18
 });
 map.addLayer(cloudmade).setView(new L.LatLng(41.52, -71.09), 13);


 });
Run Code Online (Sandbox Code Playgroud)

任何帮助很多apreciated

Pat*_*k D 39

我认为发生的事情是,在创建地图时,"map-canvas"元素的容器宽度/高度尚未调整到模态对话框的宽度/高度.这会导致地图大小不正确(小).

您可以通过致电解决此问题map.invalidateSize().这将重新调整L.Map容器​​的宽度/高度范围.

您可以通过挂钩显示Bootstrap模式的事件来自动调用它.

$('#myModal').on('show.bs.modal', function(){
  setTimeout(function() {
    map.invalidateSize();
  }, 10);
 });
Run Code Online (Sandbox Code Playgroud)

将此代码插入JavaScript.显示模态时,地图将使其大小无效.超时是因为模式可能会有一些动画/转换时间显示并添加到DOM.

  • 在某些情况下,考虑到模态完全加载所需的时间,10毫秒可能是非常短的时间.在调用invalidateSize()之前增加时间是一个好主意,并且/或者在模式中放置一个刷新按钮以在单击它时调用该函数. (2认同)

小智 16

您应该避免使用随机选择的延迟的setTimeout.使用'shown.bs.modal'事件而不是'show.bs.modal'的更好方法:

modal.on('shown.bs.modal', function(){
    setTimeout(function() {
        map.invalidateSize();
   }, 1);
})
Run Code Online (Sandbox Code Playgroud)

或者使用下划线的延迟:

modal.on('shown.bs.modal', function(){
    _.defer(map.invalidateSize.bind(map));
})
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案.另外,因为一旦模态可见就会触发'shown'事件,你不再需要对invalidateSize()方法进行排队吗?你可以使用modal.on('shown.bs.modal',function(){map.invalidateSize();}); (来源:http://getbootstrap.com/javascript/#modals-events) (8认同)

小智 6

我用这个解决方法:

.modal {
  visibility: hidden;
  display: block;
}

.modal[aria-hidden='false'] {
  visibility: visible;
  display: block;
}
Run Code Online (Sandbox Code Playgroud)