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

Google Maps图例加载异常:先显示于地图下方再跳至目标位置

Google Maps 图例加载位置异常问题

地图构建正常,但图例加载时会先显示在地图下方,之后才跳转到目标位置,需要让图例在地图加载时直接处于指定位置(左下角)。


相关代码

HTML 代码

<div class="panel panel-primary">            
    <div id="map-section" class="panel-body">
        <div id="locationsMap"></div>
        <div id="legend"><h3 class="fw-semibold text-primary-dark text-center">Legend</h3></div>
    </div>            
</div>

CSS 代码

#locationsMap {
    width: 100%;
    height: 500px;    
}

#legend {
    font-family: Arial, sans-serif;
    background: #fff;
    padding: 10px;
    margin: 10px;
    border: 3px solid #000;
    display:none;
}

#legend h3 {
    margin-top: 0;
}

#legend img {
    vertical-align: middle;
}

主 JavaScript 代码(简化版)

'use strict'
let map;

function locationsMap() {
    // 初始化默认地图,以美国为中心
    map = getDefaultMap();
    // 初始化信息窗口
    const infoWindow = initializeInfoWindow();
    // 车辆位置数据数组
    const vehicleLocations = [
        {
            position: new google.maps.LatLng(29.63260, -95.59397),
            title: "Car #1 Houston, TX",
            info: ['Rosso Corsa', 'Beige', 'Castoro', 12103]
        },
        {
            position: new google.maps.LatLng(28.53833, -81.37923),
            title: "Car #2 Orlando, FL",
            info: ['Rosso Corsa', 'Beige', 'Castoro', 22500]
        },
        {
            position: new google.maps.LatLng(29.612833, -95.582365),
            title: "Car #3 Houston, TX",
            info: ['Rosso Corsa', 'Beige', 'Castoro', 67960]
        },
        {
            position: new google.maps.LatLng(26.714439, -80.054987),
            title: "Car #4 West Palm Beach, FL",
            info: ['Rosso Corsa', 'Beige', 'Castoro', 20913]
        },
        {
            position: new google.maps.LatLng(39.099728, -94.578568),
            title: "Car #5 Kansas City, MO",
            info: ['Rosso Corsa', 'Beige', 'Castoro', 4319]
        }
    ];
    // 创建所有标记和信息窗口内容
    for (let i = 0; i < vehicleLocations.length; i++) {
        const marker = new google.maps.Marker({
            position: vehicleLocations[i].position,
            title: vehicleLocations[i].title,
            animation: google.maps.Animation.DROP,
            icon: getMarkerImageUrl(vehicleLocations[i].info[0], vehicleLocations[i].info[1]),
            infoWindow: { content: buildInfoWindowContent(vehicleLocations[i].info, vehicleLocations[i].title) },
            map: map
        });
        // 为每个标记添加点击监听器,设置信息窗口
        marker.addListener("click", () => {
            infoWindow.close();
            infoWindow.setContent(marker.infoWindow.content);
            infoWindow.open(marker.getMap(), marker);
        });
    }
    // 构建地图图例
    buildLegend(coloredPins, map);
}

// 辅助函数
function getDefaultMap() {
    return new google.maps.Map(document.getElementById("locationsMap"), {
        zoom: 4,
        center: {lat: 41.23456, lng: -97.87654 },
    });
}
function initializeInfoWindow() {
    return new google.maps.InfoWindow({
        content: "",
        disableAutoPan: true
    });
}

图例构建函数

function buildLegend(pins, map) {
    const urlBase = "https://myblobstorage.blob.core.windows.net/ferrari-512m/images/google-map-icons/kraked/";
    const legend = document.getElementById("legend");
    const div = document.createElement("div");

    const innerHTML = `<img src="${urlBase}${pins.rossoBeige.icon}"> ${pins.rossoBeige.name}<br/>`
        + `<img src="${urlBase}${pins.rossoNero.icon}"> ${pins.rossoNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroBeige.icon}"> ${pins.neroBeige.name}<br/>`
        + `<img src="${urlBase}${pins.neroNero.icon}"> ${pins.neroNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroGrigio.icon}"> ${pins.neroGrigio.name}<br/>`
        + `<img src="${urlBase}${pins.gialloBlu.icon}"> ${pins.gialloBlu.name}<br/>`
        + `<img src="${urlBase}${pins.gialloNero.icon}"> ${pins.gialloNero.name}<br/>`
        + `<img src="${urlBase}${pins.canneBeige.icon}"> ${pins.canneBeige.name}<br/>`
        + `<img src="${urlBase}${pins.canneNero.icon}"> ${pins.canneNero.name}<br/>`
        + `<img src="${urlBase}${pins.maranelloNero.icon}"> ${pins.maranelloNero.name}<br/>`
        + `<img src="${urlBase}${pins.metallizatoBeige.icon}"> ${pins.metallizatoBeige.name}<br/>`;

    div.innerHTML = innerHTML;
    legend.appendChild(div);
    map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(legend);
}

解决方案

问题根源是图例初始属于页面DOM流中的元素(位于地图下方),之后才被添加到Google Maps的控件容器,导致视觉上的位置跳转。以下两种方法可解决:

方法一:直接在JS中创建图例元素

  1. 移除HTML中的#legend元素:
<div class="panel panel-primary">            
    <div id="map-section" class="panel-body">
        <div id="locationsMap"></div>
    </div>            
</div>
  1. 修改buildLegend函数,直接创建图例元素并添加到地图控件:
function buildLegend(pins, map) {
    const urlBase = "https://myblobstorage.blob.core.windows.net/ferrari-512m/images/google-map-icons/kraked/";
    // 创建legend元素
    const legend = document.createElement("div");
    legend.id = "legend";
    // 添加标题
    const title = document.createElement("h3");
    title.className = "fw-semibold text-primary-dark text-center";
    title.textContent = "Legend";
    legend.appendChild(title);

    const div = document.createElement("div");
    const innerHTML = `<img src="${urlBase}${pins.rossoBeige.icon}"> ${pins.rossoBeige.name}<br/>`
        + `<img src="${urlBase}${pins.rossoNero.icon}"> ${pins.rossoNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroBeige.icon}"> ${pins.neroBeige.name}<br/>`
        + `<img src="${urlBase}${pins.neroNero.icon}"> ${pins.neroNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroGrigio.icon}"> ${pins.neroGrigio.name}<br/>`
        + `<img src="${urlBase}${pins.gialloBlu.icon}"> ${pins.gialloBlu.name}<br/>`
        + `<img src="${urlBase}${pins.gialloNero.icon}"> ${pins.gialloNero.name}<br/>`
        + `<img src="${urlBase}${pins.canneBeige.icon}"> ${pins.canneBeige.name}<br/>`
        + `<img src="${urlBase}${pins.canneNero.icon}"> ${pins.canneNero.name}<br/>`
        + `<img src="${urlBase}${pins.maranelloNero.icon}"> ${pins.maranelloNero.name}<br/>`
        + `<img src="${urlBase}${pins.metallizatoBeige.icon}"> ${pins.metallizatoBeige.name}<br/>`;

    div.innerHTML = innerHTML;
    legend.appendChild(div);
    legend.style.display = "block";
    // 添加到地图控件
    map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(legend);
}

方法二:提前移除原有图例元素

保留原有HTML,在buildLegend开头先将图例从原父容器移除:

function buildLegend(pins, map) {
    const urlBase = "https://myblobstorage.blob.core.windows.net/ferrari-512m/images/google-map-icons/kraked/";
    const legend = document.getElementById("legend");
    // 先从原父容器移除
    legend.parentNode.removeChild(legend);
    
    const div = document.createElement("div");
    const innerHTML = `<img src="${urlBase}${pins.rossoBeige.icon}"> ${pins.rossoBeige.name}<br/>`
        + `<img src="${urlBase}${pins.rossoNero.icon}"> ${pins.rossoNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroBeige.icon}"> ${pins.neroBeige.name}<br/>`
        + `<img src="${urlBase}${pins.neroNero.icon}"> ${pins.neroNero.name}<br/>`
        + `<img src="${urlBase}${pins.neroGrigio.icon}"> ${pins.neroGrigio.name}<br/>`
        + `<img src="${urlBase}${pins.gialloBlu.icon}"> ${pins.gialloBlu.name}<br/>`
        + `<img src="${urlBase}${pins.gialloNero.icon}"> ${pins.gialloNero.name}<br/>`
        + `<img src="${urlBase}${pins.canneBeige.icon}"> ${pins.canneBeige.name}<br/>`
        + `<img src="${urlBase}${pins.canneNero.icon}"> ${pins.canneNero.name}<br/>`
        + `<img src="${urlBase}${pins.maranelloNero.icon}"> ${pins.maranelloNero.name}<br/>`
        + `<img src="${urlBase}${pins.metallizatoBeige.icon}"> ${pins.metallizatoBeige.name}<br/>`;

    div.innerHTML = innerHTML;
    legend.appendChild(div);
    legend.style.display = "block";
    map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(legend);
}

两种方法都能让图例直接加载到地图指定位置,避免视觉跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:45:33