Контекст
Я повинен був зробити це сам у контексті веб-розширення. Це веб-розширення вводить частину інтерфейсу користувача на кожну сторінку, і цей інтерфейс працює всередині iframe
. Вміст всередині iframe
динамічний, тому мені довелося змінити ширину і висоту самого iframe
себе.
Я використовую React, але ця концепція стосується кожної бібліотеки.
Моє рішення (передбачається, що ви керуєте і сторінкою, і рамкою iframe)
Всередині iframe
я змінив body
стилі, щоб мати дійсно великі розміри. Це дозволить елементам всередині викластись, використовуючи весь необхідний простір. Створення width
та height
100% не працювали для мене (я думаю, тому що в кадрі є стандартний width = 300px
і height = 150px
)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Потім я ввів весь інтерфейс iframe всередині div і надав йому кілька стилів
#ui-root {
display: 'inline-block';
}
Після надання мого додатка всередині цього #ui-root
(в React я це роблю всередині componentDidMount
) я обчислюю розміри цього діва, як і синхронізує їх на батьківську сторінку, використовуючи 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)