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 iframe
là động, vì vậy tôi phải điều chỉnh lại chiều rộng và chiều cao của iframe
chí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 iframe
tôi đã thay đổi body
phong 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 width
và height
100% không hoạt động với tôi (tôi đoán vì iframe có mặc định width = 300px
và 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)