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 iframe
jest 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 iframe
zmieniłem body
style, aby mieć naprawdę duże wymiary. Umożliwi to rozmieszczenie elementów w środku z wykorzystaniem niezbędnej przestrzeni. Tworzenie width
i height
100% nie działało dla mnie (chyba dlatego, że iframe ma wartość domyślną width = 300px
i 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)