Map isn't showing on Google Maps JavaScript API v3 when nested in a div tag

JavascriptGoogle Maps-Api-3

Javascript Problem Overview


I'm trying to put the div tag that shows the map (<div id="map-canvas"></div>) inside another div, but it doesn't show the map that way. Is it a CSS or a JavaScript problem? Or is it just the way the API works?

Here's my code with the the nested div:

<!DOCTYPE html>
<html>
  <head>
	<title>Simple Map</title>
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
	<meta charset="utf-8">
	<style>
		html, body, #map-canvas {
			margin: 0;
			padding: 0;
			height: 100%;
		}
	</style>
	<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false">
    </script>
	<script>
		var map;
		function initialize() {
		  var mapOptions = {
			zoom: 8,
			center: new google.maps.LatLng(-34.397, 150.644),
			mapTypeId: google.maps.MapTypeId.ROADMAP
		  };
		  map = new google.maps.Map(document.getElementById('map-canvas'),
			  mapOptions);
		}

		google.maps.event.addDomListener(window, 'load', initialize);
	</script>
</head>
<body>
	<div> <!-- ommiting this div will show the map -->
		<div id="map-canvas"></div>
	</div>
</body>
</html>

Javascript Solutions


Solution 1 - Javascript

The problem is with percentage sizing. You are not defining the size of the parent div (the new one), so the browser can not report the size to the Google Maps API. Giving the wrapper div a specific size, or a percentage size if the size of its parent can be determined, will work.

See this explanation from Mike Williams' Google Maps API v2 tutorial:

> If you try to use style="width:100%;height:100%" on your map div, you get a map div that has zero height. That's > because the div tries to be a percentage of the size of the <body>, but by default the <body> has an indeterminate > height.

> There are ways to determine the height of the screen and use that number of pixels as the height of the map div, > but a simple alternative is to change the <body> so that its height is 100% of the page. We can do this by > applying style="height:100%" to both the <body> and the <html>. (We have to do it to both, otherwise the > <body> tries to be 100% of the height of the document, and the default for that is an indeterminate height.)

Add the 100% size to html and body in your css

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

Add it inline to any divs that don't have an id:

<body>
  <div style="height:100%; width: 100%;"> 
    <div id="map-canvas"></div>
  </div>
</body>

Solution 2 - Javascript

Add style="width:100%; height:100%;" to the div see what that does

not to the #map_canvas but the main div

example

<body>
    <div style="height:100%; width:100%;">
         <div id="map-canvas"></div>
    </div>
</body> 

There are some other answers on here the explain why this is necessary

Solution 3 - Javascript

I solved this problem with:

    <div id="map" style="width: 100%; height: 100%; position: absolute;">
				 <div id="map-canvas"></div>
	 </div>

Solution 4 - Javascript

FIXED

Give initial height of div and specify height in percentage in your style;

#map {
   height: 100%;
}

<div id="map" style="clear:both; height:200px;"></div> 

Solution 5 - Javascript

In my case I was getting the grey background and it turned out to be inclusion of a zoom value in the map options. Yup, makes no sense.

Solution 6 - Javascript

Wizard

Have you tried setting the height and width of the extra div, I know that on a project I am working on JS won't put anything in the div unless I have the height and width already set.

I used your code and hard coded the height and width and it shows up for me and without it doesn't show.

<body>
    <div style="height:500px; width:500px;"> <!-- ommiting the height and width will not show the map -->
         <div id="map-canvas"></div>
    </div>
</body> 

I would recommend either hard coding it in or assigning the div an ID and then add it to your CSS file.

Solution 7 - Javascript

I just want to add what worked for me, I added height and width to both divs and used bootstrap to make it responsive

   <div class="col-lg-1 mapContainer">
       <div id="map"></div>
   </div>

   #map{
        height: 100%;
        width:100%;
   }
   .mapContainer{
        height:200px;
        width:100%
   }

in order for col-lg-1 to work add bootstrap reference located Here

Solution 8 - Javascript

Understand this has been solved, but the solution provided above might not work in all situation.

For my case,

<div style="height: 490px; position:relative; overflow:hidden">
    <div id="map-canvas"></div>
</div>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser2315898View Question on Stackoverflow
Solution 1 - JavascriptgeocodezipView Answer on Stackoverflow
Solution 2 - JavascriptNodeDadView Answer on Stackoverflow
Solution 3 - Javascriptramazan polatView Answer on Stackoverflow
Solution 4 - JavascriptYergalemView Answer on Stackoverflow
Solution 5 - JavascriptJosef.BView Answer on Stackoverflow
Solution 6 - JavascriptNick DarleyView Answer on Stackoverflow
Solution 7 - JavascriptwilaponceView Answer on Stackoverflow
Solution 8 - JavascriptSemView Answer on Stackoverflow