我在幻灯片中添加leafletjs
地图。remarkjs
如果包含地图 div 的幻灯片在网页初始加载时可见,则地图可以正常工作。但是,如果带有地图 div 的幻灯片不是可见幻灯片,则地图 div 是不可见的,因此传单地图无法正常工作,因为所有图块都未加载到 div 中。我想做的是在幻灯片中加载所有地图 div,无论它们在哪张幻灯片上,然后在包含地图的幻灯片出现时让它们正确显示。
更新:建议的答案似乎应该回答我的问题,但我仍然卡住,不确定我是否走在正确的轨道上。以下是更多细节。
因为我可以在幻灯片中添加许多地图,所以我使用地图 div 的类名。
// css
.map { width: 100vh; height: 100vh; }
// html
<div class="map" data-lat="47" data-lon="106"></div>
<div class="map" data-lat="0" data-lon="0"></div>
<!-- possibly on a different slide -->
<div class="map" data-lat="30" data-lon="28"></div>
// js
var maps = []; // for storing map elements
var mapDivs = document.getElementsByClassName('map');
for (var i=0, j=mapDivs.length; i<j; i++) {
var map = L.map(mapDivs[i]).setView(
[mapDivs[i].dataset.lat, mapDivs[i].dataset.lon],
13
);
// store map for later
maps.push(map);
L.tileLayer(…).addTo(map);
}
slideshow.on('showSlide', function (slide) {
for (var i=0, j=maps.length; i<j; i++) {
maps[i].invalidateSize();
}
});
我的逻辑说上面应该有效,但它没有。我究竟做错了什么?
Update2:答案map.invalidateSize()
确实是解决方案的一部分。我的错是我在打电话slideshow.on('showSlide', fn)
,但我真的应该打电话slideshow.on('afterShowSlide', fn)
。后者提供remarkjs
了实际创建当前幻灯片的机会,该幻灯片可能具有地图 div,这反过来又允许map.invalidateSize()
正确触发和重新绘制地图。