leafletjs
マップをスライドショーremarkjs
に追加しています。 Webページの初期ロード時にマップdivを含むスライドが表示されていれば、マップは正常に動作します。ただし、マップdivのスライドが表示されていないスライドの場合、マップdivは表示されないため、divにすべてのタイルがロードされないため、リーフレットマップは正しく機能しません。私がしたいのは、どのスライドに関係なく、スライドショーのすべてのマップdivをロードしてから、地図を含むスライドが表示されたら正しく表示されるようにすることです。目に見えないdivにlealetjsマップを作成する
更新:それは私の質問に答える必要がありますように提案答えは思えんが、私は正しい軌道に乗っていた場合、私はまだ立ち往生して確認していません。以下は詳細です。
私はスライドショーに多くのマップを追加することができたので、マップの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();
}
});
ロジックによれば、上記はうまくいくはずですが、そうではありません。私は間違って何をしていますか?
更新2:map.invalidateSize()
の回答は確かに解決策の一部でした。私のせいで、私はslideshow.on('showSlide', fn)
と呼んでいたが、実際にはslideshow.on('afterShowSlide', fn)
と呼んでいるはずだった。後者はremarkjs
にマップdivを持つ現在のスライドを実際に作成する機会を与え、map.invalidateSize()
はマップを正しく作成して再描画できます。
(リーフレットマップをダウンロードしていないデータ・トグルタブ]の可能性のある重複https://stackoverflow.com/questions/36246815/data-toggle-tab-does-not- download-leaflet-map) – ghybs
あなたの提案された回答が私の問題を解決するはずですが、私が詳細に説明するように、私は成功していません。 – punkish
最初に、マップのスライドが表示された後にブラウザウィンドウのサイズを変更した場合、地図のサイズが正しくないために問題が発生していることを確認してください。 – ghybs