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 iframe
se 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 iframe
ho cambiato body
stile per avere dimensioni davvero grandi. Ciò consentirà agli elementi interni di disporre utilizzando tutto lo spazio necessario. Fare width
e il height
100% non ha funzionato per me (suppongo perché l'iframe ha un valore predefinito width = 300px
e 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)