Kontekst
Musiałem to zrobić sam w kontekście rozszerzenia internetowego. To rozszerzenie internetowe wstrzykuje część interfejsu użytkownika na każdą stronę, a ten interfejs użytkownika znajduje się wewnątrz iframe. Zawartość wewnątrz iframejest dynamiczna, więc musiałem dostosować szerokość i wysokośćiframe samego siebie.
Używam React ale ta koncepcja dotyczy każdej biblioteki.
Moje rozwiązanie (zakłada się, że kontrolujesz zarówno stronę, jak i ramkę iframe)
Wewnątrz iframezmieniłem bodystyle, aby mieć naprawdę duże wymiary. Umożliwi to rozmieszczenie elementów w środku z wykorzystaniem niezbędnej przestrzeni. Tworzenie widthi height100% nie działało dla mnie (chyba dlatego, że iframe ma wartość domyślną width = 300pxi height = 150px)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Potem wstrzyknąłem interfejs użytkownika iframe do diva i nadałem mu trochę stylów
#ui-root {
display: 'inline-block';
}
Po renderowaniu mojej aplikacji w tym #ui-root(w React robię to w środku componentDidMount) obliczam wymiary tego div, jak i synchronizuję je ze stroną nadrzędną, używając window.postMessage:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
W ramce nadrzędnej robię coś takiego:
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)