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 iframe
est dynamique, j'ai donc dû réajuster la largeur et la hauteur de iframe
lui - 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, iframe
j'ai changé de body
style 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 width
et height
100% n'a pas fonctionné pour moi (je suppose que l'iframe a un défaut width = 300px
et 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)