Kontext
Ich musste dies selbst im Rahmen einer Web-Erweiterung tun. Diese Web-Erweiterung fügt jeder Seite einen Teil der Benutzeroberfläche hinzu, und diese Benutzeroberfläche befindet sich in einer iframe
. Der Inhalt im iframe
ist dynamisch, daher musste ich die Breite und Höhe des iframe
selbst neu einstellen .
Ich benutze React, aber das Konzept gilt für jede Bibliothek.
Meine Lösung (dies setzt voraus, dass Sie sowohl die Seite als auch den Iframe steuern)
Innerhalb des habe iframe
ich body
Stile geändert , um wirklich große Dimensionen zu haben. Auf diese Weise können die Elemente im Inneren mit dem erforderlichen Platz angeordnet werden. Making width
und height
100% haben bei mir nicht funktioniert (ich denke, weil der Iframe einen Standard hat width = 300px
und height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Dann habe ich die gesamte Iframe-Benutzeroberfläche in ein Div eingefügt und ihm einige Stile gegeben
#ui-root {
display: 'inline-block';
}
Nachdem ich meine App darin gerendert habe #ui-root
(in React mache ich das drinnen componentDidMount
), berechne ich die Dimensionen dieses Divs wie folgt und synchronisiere sie mit der übergeordneten Seite mit window.postMessage
:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Im übergeordneten Frame mache ich so etwas:
window.addEventListener('message', (ev) => {
if(ev.data.type && ev.data.type === 'resize-iframe') {
iframe.style.width = ev.data.payload.width + 'px'
iframe.style.height = ev.data.payload.height + 'px'
}
}, false)