อัพเดทในปี 2562
TL; DR:วันนี้ตัวเลือกที่ดีที่สุดคือตัวเลือกสุดท้ายในคำตอบนี้ - flexbox ทุกอย่างรองรับอย่างดีและมีมานานหลายปี ไปเพื่อสิ่งนั้นและอย่ามองย้อนกลับไป ส่วนที่เหลือของคำตอบนี้ถูกทิ้งไว้ด้วยเหตุผลทางประวัติศาสตร์
เคล็ดลับคือการเข้าใจสิ่งที่นำมา 100% การอ่านรายละเอียด CSS สามารถช่วยคุณได้
เพื่อทำให้เรื่องสั้นสั้น - มีสิ่งต่าง ๆ เช่น "บรรจุบล็อก" - ซึ่งไม่จำเป็นต้องมีองค์ประกอบหลัก พูดง่ายๆก็คือองค์ประกอบแรกขึ้นลำดับชั้นที่มีตำแหน่ง: ญาติหรือตำแหน่ง: แน่นอน หรือองค์ประกอบของร่างกายตัวเองหากไม่มีอะไรอื่น ดังนั้นเมื่อคุณพูดว่า "width: 100%" มันจะตรวจสอบความกว้างของ "บล็อกที่มี" และตั้งค่าความกว้างขององค์ประกอบของคุณเป็นขนาดเดียวกัน หากมีอย่างอื่นที่นั่นคุณอาจได้รับเนื้อหาของ "บล็อกที่มี" ที่มีขนาดใหญ่กว่าตัวมันเอง (เช่น "ล้น")
ความสูงทำงานในลักษณะเดียวกัน ด้วยข้อยกเว้นหนึ่งข้อ คุณไม่สามารถเพิ่มความสูงได้ถึง 100% ของหน้าต่างเบราว์เซอร์ องค์ประกอบระดับบนสุดที่สามารถคำนวณได้ 100% เป็นองค์ประกอบของร่างกาย (หรือ html หรือไม่ไม่แน่ใจ) และมีความยาวพอที่จะมีเนื้อหา การระบุความสูง: 100% จะไม่มีผลกระทบเนื่องจากไม่มี "องค์ประกอบหลัก" ที่ใช้วัด 100% หน้าต่างจะไม่นับ ;)
ในการสร้างบางสิ่งบางอย่างที่ยืดออก 100% ของหน้าต่างคุณมีสองทางเลือก:
- ใช้จาวาสคริปต์
- อย่าใช้ DOCTYPE นี่ไม่ใช่วิธีปฏิบัติที่ดี แต่วางเบราว์เซอร์ใน "โหมด quirks" ซึ่งคุณสามารถทำ height = "100%" ในองค์ประกอบและมันจะยืดพวกเขาให้มีขนาดหน้าต่าง โปรดทราบว่าส่วนที่เหลือของหน้าของคุณอาจจะมีการเปลี่ยนแปลงด้วยเพื่อรองรับการเปลี่ยนแปลง DOCTYPE
อัปเดต:ฉันไม่แน่ใจว่าฉันไม่ผิดเมื่อโพสต์สิ่งนี้ แต่ตอนนี้ล้าสมัยอย่างแน่นอน วันนี้คุณสามารถทำได้ในสไตล์ชีทของคุณ: html, body { height: 100% }
และมันจะขยายไปถึงวิวพอร์ตทั้งหมดของคุณ แม้แต่กับ DOCTYPE min-height: 100%
อาจมีประโยชน์ขึ้นอยู่กับสถานการณ์ของคุณ
และฉันจะไม่แนะนำให้ใครทำเอกสารโหมด quirksอีกต่อไปเพราะมันทำให้ปวดหัวมากกว่าแก้พวกเขา เบราว์เซอร์ทุกตัวมีโหมดนิสัยใจคอที่แตกต่างกันดังนั้นการทำให้หน้าเว็บของคุณดูอย่างสม่ำเสมอบนเบราว์เซอร์จะกลายเป็นคำสั่งสองขนาดที่ยากกว่า ใช้ DOCTYPE เสมอ. โดยเฉพาะอย่าง HTML5 หนึ่ง <!DOCTYPE html>
- ง่ายต่อการจดจำและใช้งานได้อย่างมีเสน่ห์ในเบราว์เซอร์ทุกประเภทแม้กระทั่งอายุ 10 ปี
ข้อยกเว้นเพียงอย่างเดียวคือเมื่อคุณต้องสนับสนุนบางอย่างเช่น IE5 หรือบางอย่าง หากคุณอยู่ที่นั่นแสดงว่าคุณเป็นเจ้าของด้วยตัวเอง เบราว์เซอร์โบราณเหล่านั้นไม่เหมือนเบราว์เซอร์ในปัจจุบันและคำแนะนำเล็กน้อยที่ให้ไว้ที่นี่จะช่วยคุณได้ หากคุณอยู่ที่นั่นคุณอาจต้องสนับสนุนเบราว์เซอร์ประเภทหนึ่งซึ่งจะช่วยขจัดปัญหาความเข้ากันได้
โชคดี!
อัปเดต 2:เฮ้มันใช้เวลานานแล้ว! 6 ปีต่อมามีตัวเลือกใหม่เกิดขึ้น ฉันเพิ่งมีการสนทนาในความคิดเห็นด้านล่างนี่คือเทคนิคเพิ่มเติมสำหรับคุณที่ทำงานในเบราว์เซอร์วันนี้
ตัวเลือกที่ 1 - การกำหนดตำแหน่งที่แน่นอน ดีและสะอาดเมื่อคุณทราบความสูงที่แม่นยำของส่วนแรก
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>
บางบันทึกย่อ - second-row
จำเป็นต้องมีคอนเทนเนอร์เนื่องจากbottom: 0
และright: 0
ไม่สามารถใช้งาน iframe ได้ด้วยเหตุผลบางประการ สิ่งที่ต้องทำในการเป็นองค์ประกอบ "แทนที่" แต่width: 100%
และใช้height: 100%
งานได้ดี display: block
เป็นสิ่งจำเป็นเนื่องจากเป็นinline
องค์ประกอบตามค่าเริ่มต้นและช่องว่างเริ่มต้นสร้างล้นอย่างอื่นแปลก ๆ
ตัวเลือก 2 - ตาราง ทำงานเมื่อคุณไม่ทราบความสูงของส่วนแรก คุณสามารถใช้อย่างใดอย่างหนึ่งที่เกิดขึ้นจริงแท็กหรือทำวิธีแฟนซีด้วย<table>
display: table
ฉันจะไปที่หลังเพราะดูเหมือนว่าจะเป็นแฟชั่นในวันนี้
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>
บางบันทึกย่อ - overflow: auto
ตรวจสอบให้แน่ใจว่าแถวนั้นมีเนื้อหาทั้งหมดอยู่เสมอ มิฉะนั้นองค์ประกอบลอยตัวบางครั้งสามารถล้น height: 100%
ในแถวที่สองทำให้แน่ใจว่ามันขยายมากที่สุดเท่าที่จะสามารถบีบแถวแรกที่มีขนาดเล็กที่จะได้รับ
ตัวเลือก 3 - flexbox หนึ่งที่สะอาดที่สุดของพวกเขาทั้งหมด แต่ด้วยการสนับสนุนเบราว์เซอร์น้อยกว่าดาวฤกษ์ IE10 จะต้องมี-ms-
คำนำหน้าสำหรับคุณสมบัติ flexbox และอะไรที่น้อยกว่าจะไม่รองรับเลย
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>
หมายเหตุบางประการ - overflow: hidden
เป็นเพราะ iframe ยังคงสร้างโอเวอร์โฟลว์แม้display: block
ในกรณีนี้ ไม่สามารถมองเห็นได้ในมุมมองเต็มหน้าจอหรือตัวแก้ไขโค้ด แต่หน้าต่างแสดงตัวอย่างขนาดเล็กจะได้รับแถบเลื่อนพิเศษ ไม่รู้เลยว่าคืออะไร iframes แปลก