контекст
Я должен был сделать это сам в контексте веб-расширения. Это веб-расширение внедряет некоторый кусок пользовательского интерфейса в каждую страницу, и этот пользовательский интерфейс находится внутри iframe
. Содержимое внутри iframe
является динамическим, поэтому мне пришлось перенастроить ширину и высоту самого объекта iframe
.
Я использую React, но концепция применима к каждой библиотеке.
Мое решение (предполагается, что вы контролируете как страницу, так и фрейм)
Внутри iframe
я изменил body
стили, чтобы иметь действительно большие размеры. Это позволит расположить элементы внутри, используя все необходимое пространство. Создание width
и height
100% не работает для меня (я думаю, потому что у iframe есть значение по умолчанию width = 300px
и height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Затем я вставил весь интерфейс iframe в div и дал ему несколько стилей
#ui-root {
display: 'inline-block';
}
После рендеринга моего приложения внутри этого #ui-root
(в React я делаю это внутри componentDidMount
) я вычисляю размеры этого элемента div и синхронизирую их с родительской страницей, используя window.postMessage
:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
В родительском фрейме я делаю что-то вроде этого:
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)