Pembaruan pada tahun 2019
TL; DR: Hari ini pilihan terbaik adalah yang terakhir dalam jawaban ini - flexbox. Semuanya mendukungnya dengan baik dan telah bertahun-tahun. Pergi untuk itu dan jangan melihat ke belakang. Sisa jawaban ini dibiarkan karena alasan historis.
Kuncinya adalah memahami apa yang 100% diambil. Membaca spesifikasi CSS dapat membantu Anda di sana.
Untuk membuat cerita panjang pendek - ada yang namanya "mengandung blok" - yang tidak perlu elemen induk. Sederhananya, itu adalah elemen pertama hingga hierarki yang memiliki posisi: relatif atau posisi: absolut. Atau elemen tubuh itu sendiri jika tidak ada yang lain. Jadi, ketika Anda mengatakan "lebar: 100%", itu memeriksa lebar "blok yang mengandung" dan mengatur lebar elemen Anda ke ukuran yang sama. Jika ada sesuatu yang lain di sana, maka Anda mungkin mendapatkan konten dari "blok berisi" yang lebih besar dari itu sendiri (dengan demikian "meluap").
Tinggi bekerja dengan cara yang sama. Dengan satu pengecualian. Anda tidak bisa mendapatkan tinggi hingga 100% dari jendela browser. Elemen level paling atas, yang bisa dihitung 100%, adalah elemen body (atau html? Tidak yakin), dan yang membentang cukup untuk memuat isinya. Menentukan tinggi: 100% di atasnya tidak akan berpengaruh, karena tidak memiliki "elemen induk" untuk mengukur 100%. Jendela itu sendiri tidak masuk hitungan. ;)
Untuk membuat peregangan sesuatu persis 100% dari jendela, Anda memiliki dua pilihan:
- Gunakan JavaScript
- Jangan gunakan DOCTYPE. Ini bukan praktik yang baik, tetapi menempatkan browser dalam "mode quirks", di mana Anda dapat melakukan tinggi = "100%" pada elemen dan itu akan meregangkan mereka ke ukuran jendela. Perhatikan, bahwa sisa halaman Anda mungkin harus diubah juga untuk mengakomodasi perubahan DOCTYPE.
Pembaruan: Saya tidak yakin apakah saya sudah salah ketika saya memposting ini, tetapi ini sudah usang sekarang. Hari ini Anda bisa melakukan ini di stylesheet Anda: html, body { height: 100% }
dan itu benar-benar akan merentang ke seluruh viewport Anda. Bahkan dengan DOCTYPE. min-height: 100%
bisa juga bermanfaat, tergantung situasi Anda.
Dan saya tidak akan menyarankan siapa pun untuk membuat dokumen quirks-mode lagi, karena itu menyebabkan lebih banyak sakit kepala daripada menyelesaikannya. Setiap browser memiliki mode quirks yang berbeda, sehingga membuat halaman Anda terlihat secara konsisten di seluruh browser menjadi lebih sulit. Gunakan DOCTYPE. Selalu. Lebih disukai yang HTML5 - <!DOCTYPE html>
. Mudah diingat dan berfungsi seperti pesona di semua browser, bahkan yang berusia 10 tahun.
Satu-satunya pengecualian adalah ketika Anda harus mendukung sesuatu seperti IE5 atau sesuatu. Jika Anda ada di sana, berarti Anda sendirian. Browser kuno itu tidak seperti browser saat ini, dan sedikit saran yang diberikan di sini akan membantu Anda. Sisi baiknya, jika Anda di sana, Anda mungkin hanya perlu mendukung SATU jenis browser, yang menghilangkan masalah kompatibilitas.
Semoga berhasil!
Pembaruan 2: Hei, sudah lama! 6 tahun kemudian, opsi baru muncul. Saya baru saja berdiskusi dalam komentar di bawah ini, berikut adalah lebih banyak trik untuk Anda yang berfungsi di peramban hari ini.
Opsi 1 - penentuan posisi absolut. Bagus dan bersih ketika Anda tahu ketinggian yang tepat dari bagian pertama.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
Beberapa catatan - second-row
wadah diperlukan karena bottom: 0
dan right: 0
tidak berfungsi pada iframe karena alasan tertentu. Ada hubungannya dengan menjadi elemen "diganti". Tapi width: 100%
dan height: 100%
berfungsi dengan baik. display: block
diperlukan karena itu adalah inline
elemen secara default dan spasi putih mulai membuat aliran aneh sebaliknya.
Opsi 2 - tabel. Bekerja ketika Anda tidak tahu ketinggian bagian pertama. Anda dapat menggunakan <table>
tag aktual atau melakukannya dengan cara mewah display: table
. Saya akan memilih yang terakhir karena sepertinya sedang mode akhir-akhir ini.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
</div>
Beberapa catatan - overflow: auto
memastikan bahwa baris selalu menyertakan semua isinya. Kalau tidak, elemen apung terkadang bisa meluap. Yang height: 100%
di baris kedua memastikan itu mengembang sebanyak yang bisa meremas baris pertama sekecil itu.
Opsi 3 - flexbox. Yang terbersih dari semuanya, tetapi dengan dukungan browser yang kurang dari bintang. IE10 akan membutuhkan -ms-
awalan untuk properti flexbox, dan apa pun yang kurang tidak akan mendukung sama sekali.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
Beberapa catatan - overflow: hidden
ini karena iframe masih menghasilkan semacam overflow bahkan display: block
dalam kasus ini. Itu tidak terlihat dalam tampilan layar penuh atau editor cuplikan, tetapi jendela pratinjau kecil mendapat bilah gulir tambahan. Tidak tahu apa itu, iframe itu aneh.
Kami menggunakan JavaScript untuk menyelesaikan masalah ini; di sini adalah sumbernya.
Catatan:
ifm
adalah ID iframepageY()
dibuat oleh John Resig (penulis jQuery)sumber
Cara lain untuk melakukannya adalah dengan menggunakan
position: fixed;
simpul orangtua.Jika saya tidak salah,
position: fixed;
mengikat elemen ke viewport, sehingga, setelah Anda memberikan nodewidth: 100%;
danheight: 100%;
properti ini, itu akan menjangkau seluruh layar. Dari titik ini, Anda dapat meletakkan<iframe>
tag di dalamnya dan merentangkannya di atas ruang yang tersisa (baik lebar dan tinggi) dengan mudahwidth: 100%; height: 100%;
instruksi CSS .Kode contoh
sumber
position: fixed
iframe.Berikut adalah beberapa pendekatan modern:
Pendekatan 1 - Kombinasi unit relatif viewport /
calc()
.Ekspresi
calc(100vh - 30px)
mewakili ketinggian yang tersisa. Di mana100vh
ketinggian browser dan penggunaancalc()
secara efektif menggantikan ketinggian elemen lainnya.Contoh Di Sini
Dukungan untuk di
calc()
sini ; dukungan untuk unit relatif viewport di sini .Pendekatan 2 - Pendekatan Flexbox
Contoh Di Sini
Setel
display
elemen induk yang umum menjadiflex
, bersama denganflex-direction: column
( dengan asumsi Anda ingin elemen menumpuk di atas satu sama lain). Kemudian atur elemenflex-grow: 1
anakiframe
agar mengisi ruang yang tersisa.Karena pendekatan ini kurang mendukung 1 , saya sarankan untuk pergi dengan pendekatan yang disebutkan di atas.
1 Meskipun tampaknya bekerja di Chrome / FF, itu tidak berfungsi di IE (metode pertama bekerja di semua browser saat ini).
sumber
flexbox
opsi karena dengancalc
Anda perlu tahu jumlah ruang untuk mengurangi darivh
. Denganflexbox
sederhanaflex-grow:1
lakukan itu.Anda dapat melakukannya dengan
DOCTYPE
, tetapi Anda harus menggunakannyatable
. Lihat ini:sumber
Mungkin ini sudah dijawab (beberapa jawaban di atas adalah cara yang "benar" untuk melakukan ini), tetapi saya pikir saya akan menambahkan solusi saya juga.
IFrame kami dimuat dalam div, maka saya membutuhkan sesuatu yang lain kemudian window.height. Dan melihat proyek kami sudah sangat bergantung pada jQuery, saya menemukan ini menjadi solusi yang paling elegan:
Di mana tentu saja "#middle" adalah id dari div. Satu-satunya hal tambahan yang perlu Anda lakukan adalah mengingat perubahan ukuran ini setiap kali pengguna mengubah ukuran jendela.
sumber
Inilah yang saya lakukan. Saya memiliki masalah yang sama dan akhirnya mencari sumber daya web selama berjam-jam.
Saya menambahkan ini ke bagian kepala.
Harap perhatikan bahwa iframe saya terletak di dalam sel tengah tabel yang memiliki 3 baris dan 1 kolom.
sumber
Kode MichAdel bekerja untuk saya, tetapi saya membuat beberapa modifikasi kecil agar berfungsi dengan benar.
sumber
Benar, Anda menunjukkan iframe dengan ketinggian 100% terhadap wadahnya: bodi.
Coba ini:
Tentu saja, ubah ketinggian div kedua ke ketinggian yang Anda inginkan.
sumber
coba yang berikut ini:
itu berhasil untuk saya
sumber
Anda dapat melakukan ini dengan html / css seperti ini:
sumber
Baru di HTML5: Gunakan calc (ketinggian)
sumber
Saya menggunakan display: table untuk memperbaiki masalah yang sama. Ini hampir berfungsi untuk ini, meninggalkan bilah gulir vertikal kecil. Jika Anda mencoba mengisi kolom fleksibel itu dengan sesuatu selain iframe berfungsi dengan baik (tidak
Ambil HTML berikut
Ubah div luar untuk menggunakan tampilan: tabel dan pastikan memiliki lebar dan tinggi yang ditetapkan.
Jadikan spanduk sebagai baris tabel dan atur tingginya sesuai keinginan Anda:
Tambahkan div tambahan di sekitar iframe Anda (atau konten apa pun yang Anda butuhkan) dan buatlah baris-tabel dengan ketinggian diatur ke 100% (pengaturan tingginya sangat penting jika Anda ingin menanamkan iframe untuk mengisi ketinggian)
Di bawah ini adalah jsfiddle yang menunjukkannya di tempat kerja (tanpa iframe karena sepertinya tidak berfungsi di biola)
https://jsfiddle.net/yufceynk/1/
sumber
Saya pikir Anda memiliki masalah konseptual di sini. Untuk mengatakan "Saya mencoba mengatur tinggi: 100% pada iframe, hasilnya cukup dekat tetapi iframe mencoba mengisi seluruh halaman" , yah, kapan "100%" tidak sama dengan "keseluruhan"?
Anda telah meminta iframe untuk mengisi seluruh ketinggian wadahnya (yang merupakan bodi) tapi sayangnya ia memiliki saudara kandung level blok di <div> di atas yang Anda minta besar 30px. Jadi total kontainer induk sekarang diminta untuk ukuran hingga 100% + 30px> 100%! Karenanya scrollbar.
Maksud saya maksud Anda adalah bahwa Anda ingin iframe mengkonsumsi apa yang tersisa seperti bingkai dan sel tabel, yaitu height = "*". IIRC ini tidak ada.
Sayangnya sejauh pengetahuan saya tidak ada cara untuk secara efektif mencampur / menghitung / mengurangi unit absolut dan relatif, jadi saya pikir Anda dikurangi menjadi dua opsi:
Benar-benar posisikan div Anda, yang akan mengeluarkannya dari wadah sehingga iframe sendiri akan mengkonsumsi tinggi wadah itu. Ini membuat Anda dengan segala macam masalah lain, tetapi mungkin untuk apa yang Anda lakukan opacity atau alignment akan baik-baik saja.
Atau Anda harus menentukan% tinggi untuk div dan mengurangi ketinggian iframe sebanyak itu. Jika ketinggian absolut benar-benar penting, Anda harus menerapkannya pada elemen anak dari div.
sumber
Setelah mencoba rute css untuk sementara waktu, saya akhirnya menulis sesuatu yang cukup mendasar di jQuery yang melakukan pekerjaan untuk saya:
Diuji dalam IE8, Chrome, Firefox 3.6
sumber
Ini akan bekerja dengan kode yang disebutkan di bawah ini
sumber
Jawaban serupa dari @MichAdel, tapi saya menggunakan JQuery dan lebih elegan.
iframe_id
adalah ID dari tag iframesumber
Anda dapat melakukan ini dengan mengukur ukuran tubuh saat memuat / mengubah ukuran acara dan mengatur ketinggian ke (tinggi penuh - tinggi spanduk).
Perhatikan bahwa saat ini di IE8 Beta2 Anda tidak dapat melakukan ini onresize karena peristiwa itu saat ini rusak di IE8 Beta2.
sumber
atau Anda bisa menjadi old-school dan menggunakan frameset mungkin:
sumber
Meskipun saya setuju JS tampaknya merupakan pilihan yang lebih baik, saya punya solusi yang hanya berfungsi untuk CSS. Kelemahannya adalah bahwa jika Anda harus menambahkan konten ke dokumen html iframe Anda sesering mungkin, Anda harus menyesuaikan satu persen dari waktu ke waktu.
Larutan:
Cobalah untuk tidak menentukan ketinggian untuk KEDUA dokumen html Anda,
maka hanya kode ini:
Catatan: div harus menjadi bagian utama Anda.
Ini seharusnya relatif bekerja. iframe benar-benar menghitung 300% dari tinggi jendela yang terlihat. Jika Anda mengambil konten html dari dokumen ke-2 (dalam iframe) lebih kecil daripada 3 kali tinggi browser Anda, itu berfungsi. Jika Anda tidak perlu sering menambahkan konten ke dokumen itu, ini adalah solusi permanen dan Anda bisa menemukan sendiri% yang dibutuhkan sesuai dengan tinggi konten Anda.
Ini berfungsi karena mencegah dokumen html ke-2 (yang tertanam) untuk mewarisi tingginya dari dokumen induk html. Ini mencegahnya karena kami tidak menentukan ketinggian untuk keduanya. Ketika kami memberikan% kepada anak itu mencari orang tuanya, jika tidak, ia membutuhkan tinggi kontennya. Dan hanya jika wadah lain tidak diberi ketinggian, dari apa yang saya coba.
sumber
The " mulus " atribut standar baru yang bertujuan untuk memecahkan masalah ini:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Ketika menetapkan atribut ini, itu akan menghapus batas dan gulir bar dan ukuran iframe dengan ukuran kontennya. meskipun hanya didukung di Chrome dan Safari terbaru
lebih lanjut tentang ini di sini: Atribut Seamless HTML5 iFrame
sumber
Solusi jQuery sederhana
Gunakan ini dalam skrip di dalam halaman iframed
sumber
Anda tidak dapat mengatur tinggi iframe di% karena tinggi badan orang tua Anda tidak 100% sehingga menjadikan tinggi orangtua sebagai 100% dan kemudian menerapkan tinggi iframe 100%
sumber
Jika Anda memiliki akses ke konten iframe yang akan dimuat, Anda dapat memberi tahu orang tuanya untuk mengubah ukuran kapan pun ia mengubah ukuran ..
Jika Anda memiliki lebih dari satu iframe di halaman, Anda mungkin perlu menggunakan id atau metode pintar lainnya untuk meningkatkan .find ("iframe") sehingga Anda memilih yang benar.
sumber
Saya pikir cara terbaik untuk mencapai skenario ini menggunakan posisi css. atur posisi relatif ke div orang tua Anda dan posisi: mutlak untuk iframe Anda.
untuk masalah padding dan margin lainnya sekarang css3 hari () sangat canggih dan sebagian besar juga kompatibel untuk semua browser.
periksa calc ()
sumber
Mengapa tidak melakukan ini (dengan penyesuaian kecil untuk body padding / margin)
sumber
-0
dengan+'px'
di akhir. Apakah ini berfungsi di ponsel?