Contesto
Ho dovuto farlo da solo in un contesto di estensione web. Questa estensione web inietta una parte dell'interfaccia utente in ogni pagina e questa interfaccia utente vive all'interno di un iframe. Il contenuto all'interno di iframeè dinamico, quindi ho dovuto regolare nuovamente la larghezza e l'altezza di iframese stesso.
Uso React ma il concetto si applica a tutte le librerie.
La mia soluzione (questo presuppone che tu controlli sia la pagina che l'iframe)
All'interno iframeho cambiato bodystile per avere dimensioni davvero grandi. Ciò consentirà agli elementi interni di disporre utilizzando tutto lo spazio necessario. Fare widthe il height100% non ha funzionato per me (suppongo perché l'iframe ha un valore predefinito width = 300pxe height = 150px)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Quindi ho iniettato tutta l'interfaccia utente iframe all'interno di un div e gli ho dato alcuni stili
#ui-root {
display: 'inline-block';
}
Dopo aver eseguito il rendering della mia app all'interno di questo #ui-root(in React lo faccio all'interno componentDidMount) computo le dimensioni di questo div come e le sincronizzo con la pagina padre usando window.postMessage:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Nel frame genitore faccio qualcosa del genere:
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)