Resizing a leaflet map on container resize

后端 未结 6 886
渐次进展
渐次进展 2020-12-08 02:30

I have a

containing a leaflet map. Upon certain events the height of the
will be altered. I\'d like for the map to resize t
相关标签:
6条回答
  • 2020-12-08 02:42

    the accepted answer is a bit hacky in that it relies on the sleep being longer than the transition.

    I have found this to work well:

    $("body").on($.support.transition.end, '#main-navbar .nav-collapse', function(event){    
        console.log("end of the animation");
    });
    
    0 讨论(0)
  • 2020-12-08 02:42

    Ran into this problem running VueJS, Leaflet 1.2.0. The resizing didn't appear complete as others mentioned above. My solution within VueJS was to call the nextTick function:

      var vm = this
      var container = vm.$refs.container
      vm.mapStyle.width = `${vm.getElementContentWidth(container)}px`
      vm.mapStyle.height = `${vm.getElementContentHeight(container)}px`
      vm.$nextTick(() => {
        if (vm.map) vm.map.invalidateSize()
        if (vm.layerBase) vm.layerBase.redraw()
      })
    

    I believe pure javascript would be

    0 讨论(0)
  • 2020-12-08 02:44

    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);
    
    0 讨论(0)
  • 2020-12-08 02:50

    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.

    0 讨论(0)
  • 2020-12-08 02:54

    After resize, use this

    map.invalidateSize()
    

    https://github.com/Leaflet/Leaflet/issues/690

    0 讨论(0)
  • 2020-12-08 03:04

    I came across this question today and wanted to provide an updated answer based on 2020 Browser API. This example uses the Browser's ResizeObserver to monitor the size of the div that Leaflet is mounted too. Assuming the following HTML Snippet:

    <div id="map" />
    

    With the following JavaScript:

    const mapDiv = document.getElementById("map");
    const map = L.map(mapDiv).setView([51.505, -0.09], 13);
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
    
    const resizeObserver = new ResizeObserver(() => {
      map.invalidateSize();
    });
    
    resizeObserver.observe(mapDiv);
    

    This should monitor the map div, and call the invalidateSize() method on the Leaflet map when the map div size changes. This approach allows you to handle the resizing "closer" to the map code, rather than trying to rely on window resize events or listening for changes triggered elsewhere in the application.

    Obviously the CSS for the map div itself will need to ensure that it resizes in whatever way you want it to. This code snippet will ensure the Leaflet is appropriately updated when that happens.

    0 讨论(0)
提交回复
热议问题