bağlam
Bunu bir web uzantısı bağlamında kendim yapmak zorunda kaldım. Bu web uzantısı, her sayfaya bir parça kullanıcı arayüzü enjekte eder ve bu kullanıcı arayüzü bir iframe
. İçindeki içerik iframe
dinamiktir, bu yüzden kendi genişliğini ve yüksekliğini yeniden ayarlamak zorunda kaldım iframe
.
Kullandığım Tepki ancak kavram her kütüphane için geçerlidir.
Çözümüm (bu, hem sayfayı hem de iframe'i kontrol ettiğinizi varsayar)
İçinde iframe
Değiştim body
stilleri gerçekten büyük boyutlara sahip olması. Bu, içerideki elemanların gerekli tüm alanı kullanarak yerleşmesine izin verecektir. Yapma width
ve height
% 100 benim için işe yaramadı (sanırım iframe'in bir varsayılanı var width = 300px
ve height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Sonra tüm iframe kullanıcı arayüzünü bir div içine enjekte ettim ve bazı stiller verdim
#ui-root {
display: 'inline-block';
}
Bu #ui-root
( benim içinde bunu yapmak React içinde componentDidMount
) benim app render sonra Bu div gibi boyutları hesaplamak ve kullanarak ana sayfaya onları senkronize window.postMessage
:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Üst çerçevede böyle bir şey yapıyorum:
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)