Ändern der Größe einer Broschürenkarte bei Größenänderung von Behältern
Lesezeit: 4 Minuten
rkcpi
Ich habe ein <div> enthält eine Flugblattkarte. Bei bestimmten Ereignissen wird die Höhe der <div> wird geändert. Ich möchte, dass die Karte an die neuen Dimensionen ihrer Umgebung angepasst wird <div> sodass das alte Zentrum in der verkleinerten oder größeren Karte zentriert ist. Ich habe versucht, die zu verwenden invalidateSize() funktionieren, aber es scheint überhaupt nicht zu funktionieren. Wie kann ich danach die Größe der Karte ändern und zentrieren? map-container-resize Veranstaltung?
$mapContainer.on('map-container-resize', function () {
map.invalidateSize(); // doesn't seem to do anything
});
Nachdem ein Benutzer auf eine bestimmte Schaltfläche geklickt hat, wird unten auf der Seite ein weiterer Bereich angezeigt, und die Höhe des Kartencontainers wird auf weniger als 100 % (z. B. 80 %) reduziert.
Wenn Sie auf diese Schaltfläche klicken, wird das Ereignis map-container-resize ausgelöst, sodass ich die Größe der Karte ändern und auf ihren alten Mittelpunkt (dh vor der Größenänderung) zentrieren kann. Die Karte selbst sollte dann ebenfalls auf 80 % ihrer ursprünglichen Höhe verkleinert werden.
Das API-Dokument für invalidateSize schien das zu sein, was ich wollte:
“Überprüft, ob sich die Größe des Kartencontainers geändert hat, und aktualisiert die Karte, wenn dies der Fall ist
[…]”
Aber schau mal bei der Ausgabe der getSize Funktion vor und nach dem Aufruf von invalidateSize ist nichts anders, die Karte bleibt in ihrer alten Größe.
Dazu braucht es mehr Kontext. Feuerst du eigentlich a map-container-resize Veranstaltung? Wie ist die Größe der Karte in CSS?
– tmw
25. Juni 2014 um 22:13 Uhr
Meinten Sie ‘resize’ event ? dieser funktioniert
– YaFred
26. Juni 2014 um 9:50 Uhr
on('resize') gilt nur für die Größenänderung von Fenstern und map-container-resize ist nicht vorhanden. Was war also das eigentliche Ereignis hier?
– phil294
1. August 2016 um 13:49 Uhr
rkcpi
Das Problem ist, dass die Größenänderung der #map-containerdiv erfolgt über einen CSS-Übergang. Der Übergang hat noch nicht begonnen, geschweige denn beendet, wenn der Aufruf von invalidateSize erfolgt, sodass die Leaflet-Karte keine Dimensionsänderung ihrer Umgebung erkennen kann div.
Auslösen der map-container-resize Ereignis mit einer Verzögerung löste das Problem. Diesen Weg :
L.Map.invalidateSize() informiert das Blattkartenobjekt nur darüber, dass seine Behältergröße geändert wurde und es daher weniger oder mehr Kartenkacheln zeichnen sollte. Es ändert eigentlich keine Dimensionen, zB seines Inhalts <div>, und verschiebt die Karte nicht. Sie sollten es selbst tun.
Das sollte die beste Antwort sein! Vielen Dank
– Achtball
29. August 2019 um 15:46 Uhr
Es verschiebt die Karte
– Hayden Thring
24. Juni 2021 um 2:50 Uhr
Mahdi Bashirpour
Sie können den folgenden Code danach verwenden Größe ändern das
Ich bin heute auf diese Frage gestoßen und wollte eine aktualisierte Antwort basierend auf der 2020 Browser API geben. Dieses Beispiel verwendet die des Browsers ResizeObserver um die Größe des div zu überwachen, das Leaflet ebenfalls gemountet ist. Angenommen, das folgende HTML-Snippet:
Dies sollte das Karten-Div überwachen und die Methode invalidateSize() auf der Leaflet-Karte aufrufen, wenn sich die Größe des Karten-Div ändert. Mit diesem Ansatz können Sie die Größenänderung “näher” am Kartencode handhaben, anstatt sich auf Fenstergrößenänderungen zu verlassen oder auf Änderungen zu warten, die an anderer Stelle in der Anwendung ausgelöst werden.
Offensichtlich muss das CSS für das Karten-Div selbst sicherstellen, dass die Größe so geändert wird, wie Sie es möchten. Dieses Code-Snippet stellt sicher, dass das Merkblatt in diesem Fall entsprechend aktualisiert wird.
dringender Scherz
Die akzeptierte Antwort ist insofern etwas hackig, als sie darauf beruht, dass der Schlaf länger ist als der Übergang.
Ich habe festgestellt, dass dies gut funktioniert:
$("body").on($.support.transition.end, '#main-navbar .nav-collapse', function(event){
console.log("end of the animation");
});
Beim Ausführen von VueJS, Leaflet 1.2.0, ist dieses Problem aufgetreten. Die Größenänderung schien nicht vollständig zu sein, wie andere oben erwähnt. Meine Lösung innerhalb von VueJS bestand darin, die nextTick-Funktion aufzurufen:
var vm = this
var container = vm.$refs.container
vm.mapStyle.width = `${vm.getElementContentWidth(container)}px`
vm.mapStyle.height = `${vm.getElementContentHeight(container)}px`
vm.$nextTick(() => {
if (vm.map) vm.map.invalidateSize()
if (vm.layerBase) vm.layerBase.redraw()
})
Ich glaube, reines Javascript wäre
Danke, dass nextTick mit invalidateSize mein Problem gelöst hat!
– Dan
9. Juli 2019 um 13:39 Uhr
10770400cookie-checkÄndern der Größe einer Broschürenkarte bei Größenänderung von Behälternyes
Dazu braucht es mehr Kontext. Feuerst du eigentlich a
map-container-resize
Veranstaltung? Wie ist die Größe der Karte in CSS?– tmw
25. Juni 2014 um 22:13 Uhr
Meinten Sie ‘resize’ event ? dieser funktioniert
– YaFred
26. Juni 2014 um 9:50 Uhr
on('resize')
gilt nur für die Größenänderung von Fenstern undmap-container-resize
ist nicht vorhanden. Was war also das eigentliche Ereignis hier?– phil294
1. August 2016 um 13:49 Uhr