我有一个大问题。我想在模态中打开传单地图。 但地图显示不正确。瓷砖没有加载。
这是脚本:
<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);
});
任何有用的帮助
答案 0 :(得分:38)
我认为发生的事情是,在创建地图时,“map-canvas”元素的容器宽度/高度尚未调整为模式对话框的宽度/高度。这会导致地图大小不正确(小于)。
您可以致电map.invalidateSize()
来解决此问题。这将重新调整L.Map容器的宽度/高度范围。
您可以通过挂钩显示Bootstrap模式的事件来自动调用它。
$('#myModal').on('show.bs.modal', function(){
setTimeout(function() {
map.invalidateSize();
}, 10);
});
将此代码插入JavaScript中。显示模态时,地图将使其大小无效。超时是因为模式可能会有一些动画/转换时间显示并添加到DOM中。
答案 1 :(得分:14)
您应该避免使用随机选择的延迟的setTimeout。使用'shown.bs.modal'事件而不是'show.bs.modal'的更好方法:
modal.on('shown.bs.modal', function(){
setTimeout(function() {
map.invalidateSize();
}, 1);
})
或使用下划线推迟:
modal.on('shown.bs.modal', function(){
_.defer(map.invalidateSize.bind(map));
})
答案 2 :(得分:6)
我使用此解决方法:
.modal {
visibility: hidden;
display: block;
}
.modal[aria-hidden='false'] {
visibility: visible;
display: block;
}
答案 3 :(得分:0)
这对我有用 -
$('#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();
})
答案 4 :(得分:0)
这对我有用,you can read here
map.whenReady(() => {
console.log('Map ready');
setTimeout(() => {
map.invalidateSize();
}, 0);
});
答案 5 :(得分:0)
在加载时传单地图显示不正确:
var mapid = $(this).find('[id^=leaflet-map]').attr('id');
var map = settings.leaflet[mapid].lMap;
map.invalidateSize();
答案 6 :(得分:0)
我如何解决此问题:主窗口中的初始化映射。然后将地图移至打开的模式。