開發者設置地圖容器 div 寬高,但調用 new Map() 初始化後,地圖實際渲染尺寸變為 400px × 400px。
ArcGIS API for JavaScript 在構造 Map 時,會立即讀取容器元素的 offsetWidth/offsetHeight。若此時:
display: none則獲取到的尺寸為 0 或默認值,API 內部回退到默認 400×400。
| 方案 | 適用場景 | 核心代碼 |
|---|---|---|
| CSS 顯式尺寸 | 固定布局 | #map { width: 100%; height: 500px; } |
| 延遲初始化 | 動態布局/Tab 切換 | setTimeout(() => new Map(...), 0) |
| resize 事件監聽 | 響應式/彈性布局 | window.addEventListener('resize', () => map.resize()) |
| CSS 內容撐開 | Flex/Grid 容器 | 父容器 min-height: 0 允許子元素收縮 |
// HTML
// CSS
#map { width: 100%; height: 100%; }
// JS - 確保 DOM 就緒
require(["esri/Map", "esri/views/MapView", "dojo/domReady!"],
function(Map, MapView) {
const map = new Map({ basemap: "topo-vector" });
const view = new MapView({
container: "map",
map: map,
center: [116.39, 39.9],
zoom: 10
});
// 響應式 resize
window.addEventListener('resize', () => {
view.resize(); // 4.x API 使用 view.resize()
});
}
);
display: none 會導致尺寸 0,改用 visibility: hidden 或延遲初始化html, body { height: 100% }border-box 導致內容區縮小,設置 box-sizing: content-box 或調整 paddingmap.resize(),4.x 用 view.resize()
// 初始化前檢查容器尺寸
const container = document.getElementById('map');
console.log('Container size:', container.offsetWidth, container.offsetHeight);
// 監聽地圖載入事件
view.when(() => {
console.log('View size:', view.width, view.height);
console.log('Map loaded');
});
ArcGIS 地圖初始化尺寸異常,核心在於CSS 布局計算滞後於 JS 執行。解決關鍵:CSS 顯式尺寸 + DOM 就緒初始化 + resize 事件響應。理解「容器尺寸確定 → API 讀取尺寸 → 渲染地圖」這一時序依賴,配合現代前端框架(Vue/React)的掛載鉤子(mounted/useEffect),可徹底避免此類問題。