自定义谷歌地图API V3缩放按钮

18

我如何将谷歌地图 API(v3 JavaScript)的缩放按钮自定义为我的图片?

4个回答

24

我很晚才到派对,但这里是我的想法。

你基本上有两个选择:

选择1:你可以使用HTML/CSS自己创建控件,然后使用绝对位置或类似手段将其放置在地图的正确位置。尽管这在生产中可行,但我不喜欢这种方法,因为你的元素的HTML/CSS与地图显示的时间不同步加载。而且你会将控件的HTML/CSS代码分离出来,所以在不同页面上重用相同的地图更加困难。例如:“我是否忘记添加控件了?”

选择2:您可以创建自定义控件,看起来和感觉像你想要的缩放控件。下面是一个关于如何实现这一点的代码。

简而言之,你需要先调用以下命令来禁用正常的UI控制器:

var mapOptions = {
    zoom: 12,
    center: chicago,
    /* Disabling default UI widgets */
    disableDefaultUI: true // <-- see this line
}

然后你只需创建控制器并使用它。

HTML:

... 
<div id="map-canvas"></div>
...

CSS:

html, body, #map-canvas {
    height: 100%;
    margin: 0px;
    padding: 0px;
}

JavaScript:

var map;
var chicago = new google.maps.LatLng(41.850033, -87.6500523);

/**
 * The ZoomControl adds +/- button for the map
 *
 */
function ZoomControl(controlDiv, map) {

  // Creating divs & styles for custom zoom control
  controlDiv.style.padding = '5px';

  // Set CSS for the control wrapper
  var controlWrapper = document.createElement('div');
  controlWrapper.style.backgroundColor = 'white';
  controlWrapper.style.borderStyle = 'solid';
  controlWrapper.style.borderColor = 'gray';
  controlWrapper.style.borderWidth = '1px';
  controlWrapper.style.cursor = 'pointer';
  controlWrapper.style.textAlign = 'center';
  controlWrapper.style.width = '32px'; 
  controlWrapper.style.height = '64px';
  controlDiv.appendChild(controlWrapper);

  // Set CSS for the zoomIn
  var zoomInButton = document.createElement('div');
  zoomInButton.style.width = '32px'; 
  zoomInButton.style.height = '32px';
  /* Change this to be the .png image you want to use */
  zoomInButton.style.backgroundImage = 'url("http://placehold.it/32/00ff00")';
  controlWrapper.appendChild(zoomInButton);

  // Set CSS for the zoomOut
  var zoomOutButton = document.createElement('div');
  zoomOutButton.style.width = '32px'; 
  zoomOutButton.style.height = '32px';
  /* Change this to be the .png image you want to use */
  zoomOutButton.style.backgroundImage = 'url("http://placehold.it/32/0000ff")';
  controlWrapper.appendChild(zoomOutButton);

  // Setup the click event listener - zoomIn
  google.maps.event.addDomListener(zoomInButton, 'click', function() {
    map.setZoom(map.getZoom() + 1);
  });

  // Setup the click event listener - zoomOut
  google.maps.event.addDomListener(zoomOutButton, 'click', function() {
    map.setZoom(map.getZoom() - 1);
  });  

}

function initialize() {
  var mapDiv = document.getElementById('map-canvas');

  var mapOptions = {
    zoom: 12,
    center: chicago,
    /* Disabling default UI widgets */
    disableDefaultUI: true
  }

  map = new google.maps.Map(mapDiv, mapOptions);

  // Create the DIV to hold the control and call the ZoomControl() constructor
  // passing in this DIV.
  var zoomControlDiv = document.createElement('div');
  var zoomControl = new ZoomControl(zoomControlDiv, map);

  zoomControlDiv.index = 1;
  map.controls[google.maps.ControlPosition.TOP_LEFT].push(zoomControlDiv);
}

initialize();
注意:这段代码不包含任何花哨的图标和类似的东西,只有占位符。因此,您可能需要调整它以适应您的需求。此外,请记得添加HTML5常规标签和google maps api v3 javascript的脚本引用。我只添加了<div id="map-canvas"></div>,因为其他部分的需求非常明显。
要查看实时效果:这里是工作的jsfiddle示例 祝福。

1
非常感谢您。 - Barlas Apaydin
1
这个很好用,谢谢!一个小的改进可以是给缩放控件添加类名,例如 controlWrapper.setAttribute("class", "custom-zoom-wrapper"); 等等。这意味着样式可以在 CSS 中添加而不是 JS 中,从而使代码更加清晰,并允许媒体查询,即在较小的屏幕上使用较小的按钮。 - Davey

18

经过数小时的搜索,我终于找到了解决方法。请确保替换您的 API ID!祝使用愉快!

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0 }
      #map-canvas { height: 60%; width:60%; margin:20px auto; border:1px solid; padding-left:100px; }
    </style>
    <script type="text/javascript"
      src="https://maps.googleapis.com/maps/api/js?key=YOUR-MAP_API-ID&sensor=false&region=AU">
    </script>



<script type="text/javascript">

function HomeControl(controlDiv, map) {

 google.maps.event.addDomListener(zoomout, 'click', function() {
   var currentZoomLevel = map.getZoom();
   if(currentZoomLevel != 0){
     map.setZoom(currentZoomLevel - 1);}     
  });

   google.maps.event.addDomListener(zoomin, 'click', function() {
   var currentZoomLevel = map.getZoom();
   if(currentZoomLevel != 21){
     map.setZoom(currentZoomLevel + 1);}
  });

}

var map;
var markersArray = [];


function initialize() {

  var mapDiv = document.getElementById('map-canvas');
  var myLatlng = new google.maps.LatLng(-33.90224, 151.20215);
  var mapOptions = {
    zoom: 15,
    center: myLatlng,
    Marker: true,
    panControl: false,
    zoomControl: false,
    streetViewControl: false,
    overviewMapControl: false,
     mapTypeControl: false,
     mapTypeControl: false,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }

  map = new google.maps.Map(mapDiv, mapOptions);
  var marker = new google.maps.Marker({
      position: myLatlng,
      map: map,
      title:"Hello World!"
  });

  // Create the DIV to hold the control and
  // call the HomeControl() constructor passing
  // in this DIV.
  var homeControlDiv = document.createElement('div');
  var homeControl = new HomeControl(homeControlDiv, map);

}

google.maps.event.addDomListener(window, 'load', initialize);    

</script>

</head>




  <body>
    <div id="map-canvas"></div>
    <div id="zoomout" style="border:1px solid; width:150px; cursor:pointer; margin-bottom:20px;">ZOOM ME OUT</div>
    <div id="zoomin" style="border:1px solid; width:150px; cursor:pointer; ">ZOOM ME IN</div>
  </body>
</html>

5

我是用CSS的方法完成的:

#map-container .gm-style > .gmnoprint > .gmnoprint { background: url(/images/map-zoom-controls.png) no-repeat center center !important; width: 42px !important; height: 68px !important; }
#map-container .gm-style > .gmnoprint > .gmnoprint > div > img { display: none !important; }
#map-container .gm-style > .gmnoprint > .gmnoprint div[title="Zoom in"] { top: 2px !important; left: 2px !important; width: 38px !important; height: 31px !important; }
#map-container .gm-style > .gmnoprint > .gmnoprint div[title="Zoom out"] { top: 35px !important; left: 2px !important; width: 38px !important; height: 30px !important; }

这是针对一个图片的尺寸设置:

宽度:42像素;

高度:68像素。

你可以根据需要进行调整。

注意事项:

此内容仅适用于使用英文版本,因为涉及标题属性。


非常好!对我来说完美无缺! - SquareCat
2
只要Google Maps UI所提供的结构保持不变,这将起作用。您永远不应该依赖硬编码规则来实现您的目标。 - torresomar

-4

这是不可能的。您可以使用一组预定义的选项参数微调它们的外观,或者您可以实现自定义地图控件,提供与缩放控件相同的功能。

有关更多信息,请参见此页面

更新:链接已修复。感谢反馈!


请修复您的链接或将相关说明发布到您的答案中。 - Sparky
这里是程序相关内容的翻译:修复的链接。他只是在“htm”后面漏掉了一个“L”。 - RASG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接