Konteks
Saya harus melakukan ini sendiri dalam konteks ekstensi web. Ekstensi web ini menyuntikkan sebagian UI ke setiap halaman, dan UI ini tinggal di dalam sebuah iframe
. Konten di dalamnya iframe
dinamis, jadi saya harus menyesuaikan kembali lebar dan tinggi dari iframe
dirinya sendiri.
Saya menggunakan Bereaksi tetapi konsep ini berlaku untuk setiap perpustakaan.
Solusi saya (ini mengasumsikan bahwa Anda mengontrol halaman dan iframe)
Di dalam iframe
saya mengubah body
gaya untuk memiliki dimensi yang sangat besar. Ini akan memungkinkan elemen-elemen di dalam lay out menggunakan semua ruang yang diperlukan. Pembuatan width
dan height
100% tidak berfungsi untuk saya (saya kira karena iframe memiliki default width = 300px
dan height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Lalu saya menyuntikkan semua iframe UI di dalam div dan memberikannya beberapa style
#ui-root {
display: 'inline-block';
}
Setelah merender aplikasi saya di dalam ini #ui-root
(dalam Bereaksi saya melakukan ini di dalam componentDidMount
) saya menghitung dimensi div ini seperti dan menyinkronkannya ke halaman induk menggunakan window.postMessage
:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Dalam kerangka induk saya melakukan sesuatu seperti ini:
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)