Contexto
Tuve que hacer esto yo mismo en un contexto de extensión web. Esta extensión web inyecta una parte de la interfaz de usuario en cada página, y esta interfaz de usuario vive dentro de un iframe
. El contenido dentro del iframe
es dinámico, así que tuve que reajustar el ancho y la altura del iframe
mismo.
Uso React pero el concepto se aplica a todas las bibliotecas.
Mi solución (esto supone que controlas tanto la página como el iframe)
En el interior iframe
cambié los body
estilos para tener dimensiones realmente grandes. Esto permitirá que los elementos en el interior se distribuyan utilizando todo el espacio necesario. Hacer width
y height
100% no funcionó para mí (supongo que porque el iframe tiene un valor predeterminado width = 300px
y height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Luego inyecté toda la interfaz de usuario de iframe dentro de un div y le di algunos estilos
#ui-root {
display: 'inline-block';
}
Después de renderizar mi aplicación dentro de esto #ui-root
(en React hago esto dentro componentDidMount
) calculo las dimensiones de este div como y las sincronizo con la página principal usando window.postMessage
:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
En el marco principal hago algo como esto:
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)