How to embed a Leaflet map into a Reveal.js presentation?

前端 未结 2 1841
慢半拍i
慢半拍i 2021-01-19 07:35

I am trying to create a presentation running on top of Reveal.js, which would include a Leaflet.js map within one of the slides. I have included all necessary Javascript &am

相关标签:
2条回答
  • 2021-01-19 08:02

    I found it easily to do it with a web component, this way, the shadow dom will protect my leaflet map from the evil hands of reveals css

    here is a repo with an example

    <link rel="import" href="./leaflet-map.html">
    ...
    <div class="reveal">
      <div class="slides">
        <section data-state="map">
           <leaflet-map></leaflet-map>
        </section>
      </div>
    </div>
    

    Here is the web component

    <template id="leaflet-map-template">
    <link rel="stylesheet" href="./bower_components/leaflet/dist/leaflet.css">
    <div id="mapid" style="height: 500px"></div>
        <!-- LEAFLET JS -->
    </template>
    <script src="./bower_components/leaflet/dist/leaflet.js"></script>
    <script>
        class LeafletMap extends HTMLElement {
            constructor () {
                super();
                let tmpl = document.currentScript.ownerDocument.querySelector('template')
                let shadowRoot = this.attachShadow({mode: 'open'})
                shadowRoot.appendChild(tmpl.content.cloneNode(true))
    
                let mapDiv = this.shadowRoot.getElementById('mapid')
                this.map = L.map(mapDiv).setView([19.39682052576622, -99.13478851318361], 13)
                // this.setAttribute('map', map)
                // Tiles de open street maps
                //L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png").addTo(map)
    
                L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
                    maxZoom: 18,
                    attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
                        '<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
                        'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
                    id: 'mapbox.streets'
                }).addTo(this.map)
                let myIcon = L.icon({
                    iconUrl: './lentes.png',
    
                    iconSize:     [40, 40], // size of the icon
                    iconAnchor:   [20, 20], // point of the icon which will correspond to marker's location
                    tooltipAnchor: [20,0]
                })
                L.marker(
                    [19.418657758792698, -99.14065182209016],
                    {icon: myIcon}
                ).bindTooltip('Ranchito').addTo(this.map)
            }
    
            resize() {
                this.map.invalidateSize()
            }
        }
        window.customElements.define('leaflet-map', LeafletMap)
    </script>
    
    0 讨论(0)
  • 2021-01-19 08:05

    It might be happening because the #map element is hidden (due to the hidden slide) when it is initialized, so it cannot read the dimensions..

    Try using map.invalidateSize(false); once your slide becomes visible..

    Reveal.addEventListener( 'slidechanged', function( event ) {
        // event.previousSlide, event.currentSlide, event.indexh, event.indexv
        if (event.indexh == 5){ // assuming your 5th slide is the one with the map
            map.invalidateSize(false); // assuming that map holds the the reference to your leaflet instance
        }
    } );
    
    0 讨论(0)
提交回复
热议问题