Bối cảnh
Tôi đã phải tự làm điều này trong bối cảnh mở rộng web. Tiện ích mở rộng web này đưa một số giao diện người dùng vào mỗi trang và giao diện người dùng này nằm trong một iframe. Nội dung bên trong iframelà động, vì vậy tôi phải điều chỉnh lại chiều rộng và chiều cao của iframechính nó.
Tôi sử dụng React nhưng khái niệm này áp dụng cho mọi thư viện.
Giải pháp của tôi (điều này giả định rằng bạn kiểm soát cả trang và iframe)
Bên trong iframetôi đã thay đổi bodyphong cách để có kích thước thực sự lớn. Điều này sẽ cho phép các yếu tố bên trong bố trí bằng cách sử dụng tất cả các không gian cần thiết. Làm widthvà height100% không hoạt động với tôi (tôi đoán vì iframe có mặc định width = 300pxvà height = 150px)
/* something like this */
body {
width: 99999px;
height: 99999px;
}
Sau đó, tôi đã chèn tất cả giao diện người dùng iframe bên trong div và cung cấp cho nó một số kiểu
#ui-root {
display: 'inline-block';
}
Sau khi kết xuất ứng dụng của tôi bên trong này #ui-root(trong React tôi thực hiện điều này bên trong componentDidMount), tôi tính toán kích thước của div này và đồng bộ hóa chúng với trang mẹ bằng cách sử dụng window.postMessage:
let elRect = el.getBoundingClientRect()
window.parent.postMessage({
type: 'resize-iframe',
payload: {
width: elRect.width,
height: elRect.height
}
}, '*')
Trong khung cha mẹ tôi làm một cái gì đó như thế này:
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)