Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resizing a leaflet map on container resize

I have a <div> containing a leaflet map. Upon certain events the height of the <div> will be altered. I'd like for the map to resize to the new dimensions of its surrounding <div> so that the old center is centered in the resized smaller or larger map. I tried using the invalidateSize() function, but it doesn't seem to work at all. How can I resize and center the map after that map-container-resize event?

$mapContainer.on('map-container-resize', function () {    map.invalidateSize(); // doesn't seem to do anything }); 

Edit to give more context:

The map container is styled initially as

#map-container {     width: 100%;     height: 100%;     position: absolute;     top: 0;     left: 0;      transition: height 0.5s ease-in-out; } 

After a user clicks a certain button, another panel shows at the bottom of the page and the map-container's height will be reduced to something less than 100% (say 80%).

Upon click on this button, the map-container-resize event is triggered so that I can make the map resize and center on its old (i.e. before the resizing happened) center. The map itself should then also be resized to 80% of its initial height.

The APi doc for invalidateSize seemed to be what I wanted:

"Checks if the map container size changed and updates the map if so [...]"

But having a look with the output of the getSize function before and after the call to invalidateSize, nothing is different, the map remains at its old size.

like image 775
rkcpi Avatar asked Jun 25 '14 15:06

rkcpi


People also ask

How do you refresh a leaflet map?

To refresh leaflet map when map container is already initialized with JavaScript, we call the off and remove methods before reloading the map. map. off(); map. remove();

Why is map not showing in leaflet?

There are a number of reasons why your map might not be displaying: You have an error in your JavaScript (most likely) - use whichever debugging tool is provided with your browser to verify. you are using Internet Explorer and you have Compatibility mode ON....


2 Answers

The problem is that the resizing of the #map-container div is done via a css transition. The transition hasn't started yet, let alone ended, when the call to invalidateSize happens so the leaflet map cannot recognize any change of dimensions of its surrounding div.

Triggering the map-container-resize event with a delay solved the problem. This way :

setTimeout(function(){ map.invalidateSize()}, 400); 
like image 124
rkcpi Avatar answered Oct 06 '22 06:10

rkcpi


L.Map.invalidateSize() only informs leaflet map object that its container size has been changed, and therefore is should draw less or more map tiles. It does not actually change any dimensions, e.g. of its containing <div>, and does not move the map. You should do it yourself.

like image 44
Ilja Zverev Avatar answered Oct 06 '22 07:10

Ilja Zverev