Le contexte
J'ai dû le faire moi-même dans le cadre d'une extension Web. Cette extension Web injecte une partie de l'interface utilisateur dans chaque page, et cette interface utilisateur vit à l'intérieur d'un iframe. Le contenu à l'intérieur du iframeest dynamique, j'ai donc dû réajuster la largeur et la hauteur de iframelui - même.
J'utilise React mais le concept s'applique à toutes les bibliothèques.
Ma solution (cela suppose que vous contrôlez à la fois la page et l'iframe)
À l'intérieur, iframej'ai changé de bodystyle pour avoir de très grandes dimensions. Cela permettra aux éléments à l'intérieur de se disposer en utilisant tout l'espace nécessaire. Faire widthet height100% n'a pas fonctionné pour moi (je suppose que l'iframe a un défaut width = 300pxet height = 150px)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Ensuite, j'ai injecté toute l'interface utilisateur iframe dans un div et lui ai donné quelques styles
#ui-root {
display: 'inline-block';
}
Après avoir rendu mon application à l'intérieur #ui-root(dans React, je le fais à l'intérieur componentDidMount), je calcule les dimensions de ce div comme et les synchronise avec la page parent en utilisant window.postMessage:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Dans le cadre parent, je fais quelque chose comme ceci:
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)