在bootstrap 3.0模态中未正确显示瓣叶图

vu8f3i0k  于 2022-12-07  发布在  Bootstrap
关注(0)|答案(9)|浏览(187)

我有一个很大的问题。我想打开一个传单Map在模态。但Map显示不正常。瓷砖没有加载。
脚本如下:
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>
$.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);

 });

非常感激的帮助

8i9zcol2

8i9zcol21#

我认为是这样的,当创建Map时,您的'map-canvas'元素的容器宽度/高度还没有调整到模式对话框的宽度/高度。这导致Map的大小不正确(小于)。
你可以通过调用map.invalidateSize()来修复这个问题。这将重新调整L.Map容器的宽度/高度边界。
您可以通过挂接到显示Bootstrap模态的事件来自动调用它。

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

将此代码插入JavaScript。当显示模态时,Map将使其大小无效。超时是因为模态显示和添加到DOM可能需要一些动画/过渡时间。

a0x5cqrl

a0x5cqrl2#

您可能应该避免将setTimeout与随机选择的延迟一起使用。使用'showed.bs.modal'事件而不是'show.bs. modal'的更好方法是:

modal.on('shown.bs.modal', function(){
    setTimeout(function() {
        map.invalidateSize();
   }, 1);
})

或者使用下划线的defer:

modal.on('shown.bs.modal', function(){
    _.defer(map.invalidateSize.bind(map));
})
rqcrx0a6

rqcrx0a63#

我使用以下解决方法:

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

.modal[aria-hidden='false'] {
  visibility: visible;
  display: block;
}
p5cysglq

p5cysglq4#

我尝试了map.invalidateSize(),但没有修复。
最后它被这样修正:
$('#map-modal').on('显示.bs.模态',函数(事件){});
在函数中,放置与加载Map相关的代码。

nwlqm0z1

nwlqm0z15#

这对我很有效-

$('#gmap').on('shown.bs.tab', function (e) {
    //call the clear map event first
    clearMap();
    //resize the map - this is the important part for you
   map.invalidateSize(true);
   //load the map once all layers cleared
   loadMap();
})
bfhwhh0e

bfhwhh0e6#

这对我很有效,你可以在这里阅读

map.whenReady(() => {
    console.log('Map ready');
    setTimeout(() => {
        map.invalidateSize();
    }, 0);
});
2w2cym1i

2w2cym1i7#

在加载时传单Map不正确显示可以通过以下方式解决:

var mapid = $(this).find('[id^=leaflet-map]').attr('id');
  var map = settings.leaflet[mapid].lMap;
  map.invalidateSize();
aiazj4mn

aiazj4mn8#

我如何解决此问题:在主窗口中初始化Map。然后将Map移动到打开的模式。

xv8emn3q

xv8emn3q9#

对于vue.js和nuxt.js开发人员,可能是因为使用了v-showv-if,但不必担心,您唯一要做的就是使用如下的客户端专用标记:

<client-only>
<div v-show="someVariable" id="vShowOrVIfExample">
<div id="map-wrap" style="height: 100vh">
   <l-map :zoom=13 :center="[55.9464418,8.1277591]">
     <l-tile-layer url="http://{s}.tile.osm.org/{z}/{x}/{y}.png"></l-tile-layer>
     <l-marker :lat-lng="[55.9464418,8.1277591]"></l-marker>
   </l-map>
 </div>
</div>
</client-only>

相关问题