我有一个<div>
包含传单Map。在某些情况下,<div>
的高度将被改变。我想为Map调整其周围的<div>
新的尺寸,使旧的中心是在调整大小较小或较大的Map中心。我尝试使用invalidateSize()
函数,但它似乎根本不工作。在map-container-resize
事件发生后,我如何调整Map的大小并使其居中?
$mapContainer.on('map-container-resize', function () {
map.invalidateSize(); // doesn't seem to do anything
});
- 编辑以给予更多上下文:*
Map容器的初始样式为
#map-container {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
transition: height 0.5s ease-in-out;
}
在用户点击某个按钮后,另一个面板显示在页面底部,Map容器的高度将减少到小于100%(比如80%)。
单击此按钮后,将触发map-container-resize事件,以便我可以调整Map大小并将其集中在旧的(即,在发生事故之前)中心。Map本身也应该调整到其初始高度的80%。invalidateSize
的API文档似乎是我想要的:
“检查Map容器大小是否更改,如果更改,则更新Map[...]”
但是看看getSize
函数在调用invalidateSize之前和之后的输出,没有什么不同,map仍然保持原来的大小。
8条答案
按热度按时间ttp71kqs1#
只需调用resize window事件,而不是定时加载Map。
f0brbegy2#
公认的答案有点古怪,因为它依赖于睡眠时间长于过渡时间。
我发现this工作得很好:
pkwftd7m3#
运行VueJS,Leaflet 1.2.0时遇到了这个问题。这张照片并不像上面提到的其他人那样完整。我在VueJS中的解决方案是调用nextTick函数:
我相信纯JavaScript
q9rjltbz4#
在2023年的
mapbox-gl
(v1.13.x)和Vue
(v2.7)中,答案是相似的。我把这段代码放在mounted()
处理程序中:vi4fp9gy5#
问题是
#map-container
div
的转换是通过css转换完成的。当调用invalidateSize时,转换还没有开始,更不用说结束了,因此传单Map无法识别其周围div
的尺寸的任何变化。延迟触发
map-container-resize
事件解决了这个问题。这样:blmhpbnm6#
我今天遇到了这个问题,想根据2020浏览器API提供一个更新的答案。这个例子使用浏览器的ResizeObserver来监视Leaflet也被挂载的div的大小。假设下面的HTML脚本:
使用以下JavaScript:
这应该监视map div,并在map div大小更改时调用Leaflet map上的invalidateSize()方法。这种方法允许您在“更接近”Map代码的地方处理对象,而不是试图依赖于窗口调整大小事件或侦听应用程序中其他地方触发的更改。
显然,Mapdiv本身的CSS需要确保它可以按照您想要的方式调整大小。此代码片段将确保在发生这种情况时适当更新传单。
vatpfxk57#
L.Map.invalidateSize()
仅通知单张Map对象其容器大小已更改,因此应绘制更少或更多的Map瓦片。它实际上不会改变任何尺寸,例如。它包含<div>
,并且不移动Map。你应该自己来。bxfogqkk8#
你可以在resize后使用下面的代码,
https://github.com/Leaflet/Leaflet/issues/690