You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模态框中的Google Maps仅显示灰色,双击后才正常显示的技术问题

解决模态框中Google Maps初始显示灰色、双击才正常的问题

这个问题我碰到过好多次啦,本质是Google Maps初始化时没法获取到隐藏模态框容器的正确尺寸,导致地图只渲染了灰色区域;而双击操作刚好触发了地图的resize事件,让它重新计算了容器尺寸,才显示正常。另外你的代码里还有个小bug,咱们一起修复:

先看你代码里的问题

你把google.maps.event.addDomListener(window, 'load', initMap);放在了initMap函数内部,这意味着只有当initMap被调用后,这个监听事件才会被绑定,但页面加载完成时window.load事件就已经触发了,这时候initMap还没执行,监听根本没加上,地图的初始化时机完全不对。

修复方案(两种可选)

方案一:推荐!模态框显示时再初始化地图(适合非默认显示的模态框)

如果你的模态框不是页面加载就显示的,最好等模态框真正显示、容器有了实际尺寸后再初始化地图,从根源避免尺寸问题:

var map;

// 封装地图初始化函数
function initMap() {
  var mapCanvas = document.getElementById('gmap_basic');
  var mapOptions = {
    center: new google.maps.LatLng(44.5403, -78.5463),
    zoom: 8
  };
  map = new google.maps.Map(mapCanvas, mapOptions);
}

// 监听模态框完全显示的事件
$('#myModal').on('shown.bs.modal', function () {
  // 如果地图还没初始化,先执行初始化
  if (!map) {
    initMap();
  } else {
    // 已经初始化过的话,触发resize重置尺寸,同时重置中心点(避免偏移)
    google.maps.event.trigger(map, "resize");
    map.setCenter(new google.maps.LatLng(44.5403, -78.5463));
  }
});

方案二:页面加载时初始化地图(适合必须提前初始化的场景)

如果一定要在页面加载时就初始化地图,那必须在模态框显示时强制触发resize并重置中心点,确保地图能正确适配容器尺寸:

var map;

function initMap() {
  var mapCanvas = document.getElementById('gmap_basic');
  var mapOptions = {
    center: new google.maps.LatLng(44.5403, -78.5463),
    zoom: 8
  };
  map = new google.maps.Map(mapCanvas, mapOptions);
}

// 把window加载监听移到函数外面,确保页面加载完成时触发初始化
google.maps.event.addDomListener(window, 'load', initMap);

$('#myModal').on('shown.bs.modal', function () {
  // 触发resize让地图重新计算容器尺寸
  google.maps.event.trigger(map, "resize");
  // 关键步骤:重置地图中心点,否则resize后中心点会偏移
  map.setCenter(new google.maps.LatLng(44.5403, -78.5463));
});

为什么要重置中心点?

触发resize事件后,Google Maps会重新计算容器尺寸,但原来的中心点位置可能会因为容器尺寸变化而偏移,所以必须手动重置一次中心点,保证地图显示的位置正确。

内容的提问来源于stack exchange,提问作者Vpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:40:32