Bagaimana membuat iframe responsif, tanpa mengasumsikan rasio aspek? Misalnya, konten mungkin memiliki lebar atau tinggi, yang tidak diketahui sebelum rendering.
Catatan, Anda bisa menggunakan Javascript.
Contoh:
<div id="iframe-container">
<iframe/>
</div>
Ukuran ini iframe-container
sehingga isinya hampir tidak muat di dalam tanpa ruang tambahan, dengan kata lain, ada cukup ruang untuk konten sehingga dapat ditampilkan tanpa menggulir, tetapi tidak ada ruang berlebih. Wadah membungkus iframe dengan sempurna.
Ini menunjukkan bagaimana membuat iframe responsif, dengan asumsi rasio aspek konten adalah 16: 9. Tetapi dalam pertanyaan ini, rasio aspek adalah variabel.
Jawaban:
Tidak mungkin berinteraksi dengan iFrame asal yang berbeda menggunakan Javascript sehingga untuk mendapatkan ukurannya; satu-satunya cara untuk melakukannya adalah dengan menggunakan
window.postMessage
dengantargetOrigin
set ke domain Anda atau wildchar*
dari sumber iFrame. Anda dapat mem-proksi konten dari situs asal yang berbeda dan menggunakansrcdoc
, tetapi itu dianggap sebagai peretasan dan itu tidak akan berfungsi dengan SPA dan banyak halaman lain yang lebih dinamis.Ukuran iFrame asal yang sama
Misalkan kita memiliki dua iFrames asal yang sama, satu dengan tinggi pendek dan lebar tetap:
dan iFrame tinggi panjang:
Kita bisa mendapatkan ukuran iFrame pada
load
acara menggunakaniframe.contentWindow.document
yang akan kami kirim ke jendela induk menggunakanpostMessage
:Kami akan mendapatkan lebar dan tinggi yang tepat untuk kedua iFrames; Anda dapat memeriksanya online di sini dan melihat tangkapan layar di sini .
Yang berbeda asal iFrame ukuran hack ( tidak direkomendasikan )
Metode yang dijelaskan di sini adalah peretasan dan harus digunakan jika benar-benar diperlukan dan tidak ada jalan lain; itu tidak akan berfungsi untuk sebagian besar halaman dan SPA yang dihasilkan dinamis. Metode ini mengambil halaman kode sumber HTML menggunakan proxy untuk memotong kebijakan CORS (
cors-anywhere
adalah cara mudah untuk membuat server proxy CORS sederhana dan memiliki demo onlinehttps://cors-anywhere.herokuapp.com
) lalu menyuntikkan kode JS ke HTML itu untuk menggunakanpostMessage
dan mengirim ukuran file. iFrame ke dokumen induk. Ia bahkan menangani event iFrameresize
( dikombinasikan dengan iFramewidth: 100%
) dan memposting ukuran iFrame kembali ke induknya.patchIframeHtml
:Sebuah fungsi untuk menambal kode HTML iFrame dan menyuntikkan Javascript khusus yang akan digunakan
postMessage
untuk mengirim ukuran iFrame ke orang tua terusload
dan terusresize
. Jika ada nilai untukorigin
parameter, maka<base/>
elemen HTML akan ditambahkan ke kepala menggunakan URL asal, dengan demikian, HTML URI seperti/some/resource/file.ext
akan diambil dengan benar oleh URL asal di dalam iFrame.getIframeHtml
:Sebuah fungsi untuk mendapatkan halaman HTML yang melewati CORS menggunakan proksi jika
useProxy
param diatur. Mungkin ada parameter tambahan yang akan diteruskan kepostMessage
saat mengirim data ukuran.Fungsi pengendali acara pesan sama persis dengan "Ukuran asal yang sama iFrame" .
Kami sekarang dapat memuat domain asal silang di dalam iFrame dengan kode JS khusus kami yang disuntikkan:
Dan kita akan mendapatkan ukuran iFrame dengan isi penuh tanpa menggulir vertikal bahkan menggunakan
overflow-y: auto
untuk tubuh iFrame ( seharusnyaoverflow-y: hidden
jadi kita tidak mendapatkan scrollbar berkedip pada ukuran ).Anda dapat memeriksanya online di sini .
Sekali lagi untuk memperhatikan bahwa ini adalah peretasan dan harus dihindari ; kami tidak dapat mengakses dokumen iFrame Cross-Origin atau menyuntikkan segala hal.
sumber
cors-anywhere
sedang down saat ini sehingga Anda tidak dapat melihat halaman demo . Saya tidak ingin menambahkan tangkapan layar situs eksternal karena alasan hak cipta. Saya akan menambahkan proxy CORS lainnya jika itu tetap lama.Mereka banyak komplikasi dengan menentukan ukuran konten dalam iframe, terutama karena CSS memungkinkan Anda untuk melakukan hal-hal yang dapat merusak cara Anda mengukur ukuran konten.
Saya menulis perpustakaan yang mengurus semua hal ini dan juga berfungsi lintas domain, Anda mungkin merasa terbantu.
https://github.com/davidjbradshaw/iframe-resizer
sumber
Solusi saya ada di GitHub dan JSFiddle .
Menghadirkan solusi iframe responsif tanpa asumsi rasio aspek.
NB: Jangan lupa memanggil fungsi pengubahan ukuran setelah halaman dimuat karena jendela tidak diubah ukurannya sendiri setelah memuat halaman.
Kode
index.html
style.css
main.js
Saya menghabiskan beberapa waktu untuk ini. Saya harap Anda akan menikmatinya =)
Sunting Ini mungkin solusi generik terbaik. Namun, ketika dibuat sangat kecil, iframe tidak diberi ukuran yang tepat. Ini khusus untuk iframe yang Anda gunakan. Tidak mungkin untuk kode jawaban yang tepat untuk fenomena ini kecuali Anda memiliki kode iframe, karena kode Anda tidak memiliki cara untuk mengetahui ukuran mana yang lebih disukai oleh iframe yang akan ditampilkan dengan benar.
Hanya beberapa peretasan seperti yang disajikan oleh @Christos Lytras yang dapat membuat trik tetapi tidak akan berhasil untuk setiap iframe. Hanya dalam situasi tertentu.
sumber
Lakukan satu hal untuk mengatur wadah iframe dengan lebar dan tinggi, setel properti CSS
sumber