首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不可见的div中创建lealetjs映射

在不可见的div中创建lealetjs映射
EN

Stack Overflow用户
提问于 2017-09-12 07:17:22
回答 1查看 389关注 0票数 0

我在leafletjs幻灯片中添加了一个remarkjs映射。如果包含地图div的幻灯片在网页初始加载时可见,则地图工作良好。但是,如果带有map div的幻灯片不是可见的幻灯片,那么map div是不可见的,因此传单地图不能正常工作,因为所有的贴图都不是在div中加载的。我想做的是加载幻灯片中的所有地图div,不管它们在哪一张幻灯片上,然后让它们在包含地图的幻灯片出现时正确地显示出来。

更新:建议的答案看起来确实应该回答我的问题,但是我仍然被困住了,并且不确定我是否在正确的轨道上。下面是更多的细节。

因为我可以将许多地图添加到幻灯片中,所以我使用了映射div的类名。

代码语言:javascript
复制
// 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()正确地启动和重新绘制映射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-12 14:17:44

leafletjs需要一个宽度和高度> 0px的div才能存在,也就是说,要下载所需的地图块并显示地图,必须是可见的,而不是隐藏的。将地图div添加到remarkjs幻灯片中意味着在启动幻灯片时会隐藏其中的一个或多个div。因此,在浏览器调整大小之前,leafletjs将无法在这些div中显示地图(将丢失随机块),迫使leafletjs重新计算映射div的大小并下载正确的贴片。解决方案是在显示带有映射div的幻灯片时触发map.invalidateSize()方法。这是我最后是怎么做到的

代码语言:javascript
复制
/* css ******************************/
.map { width: 100vh; height: 100vh; }


<!---------------------------------------------
html
map divs possibly on different slides, with a
`map: true` property on each slide with a map
----------------------------------------------->

---
map: true
<div class="map" data-lat="47" data-lon="106"></div>
---
map: true
<div class="map" data-lat="0" data-lon="0"></div>
---
map: true
<div class="map" data-lat="30" data-lon="28"></div>

// js /////////////////////////////////////////
var maps = []; // for storing leaflet map elements
var mapDivs = document.getElementsByClassName('map');

for (var i=0, j=mapDivs.length; i<j; i++) {

    // store map for later
    maps.push(L.map(mapDivs[i]).setView(
        [mapDivs[i].dataset.lat, mapDivs[i].dataset.lon], 
        zoomLevel
    ));

    // add map to the tileLayer
    L.tileLayer(…).addTo(maps[i]);
}

// use the 'afterShowSlide' event to ensure the 
// map div has been created
slideshow.on('afterShowSlide', function (slide) {

    // only if the slide has a 'map' property
    if (slide.properties.map) {
        for (var i=0, j=maps.length; i<j; i++) {
            maps[i].invalidateSize();
        }
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46170229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档