Div ความสูง 100% และขยายเพื่อให้พอดีกับเนื้อหา


172

ฉันมีองค์ประกอบ div ในหน้าของฉันโดยตั้งความสูงไว้ที่ 100% ความสูงของร่างกายนั้นตั้งไว้ที่ 100% div ภายในมีพื้นหลังและทั้งหมดนั้นและแตกต่างจากพื้นหลังของร่างกาย วิธีนี้ใช้สำหรับสร้าง div div 100% ของความสูงของหน้าจอเบราว์เซอร์ แต่ปัญหาคือฉันมีเนื้อหาภายใน div ที่ขยายในแนวตั้งเกินความสูงของหน้าจอเบราว์เซอร์ เมื่อฉันเลื่อนลง div จะสิ้นสุดที่จุดที่คุณต้องเริ่มเลื่อนหน้า แต่เนื้อหาล้นเกินกว่านั้น ฉันจะทำให้ div ไปทางด้านล่างเพื่อให้พอดีกับเนื้อหาภายในได้อย่างไร

นี่เป็น CSS ที่เรียบง่ายของฉัน:

body {
    height:100%;
    background:red;
}

#some_div {
    height:100%;
    background:black;
}

เมื่อฉันเลื่อนหน้าความมืดจะสิ้นสุดลงและเนื้อหาจะไหลลงบนพื้นหลังสีแดง ดูเหมือนว่าไม่สำคัญว่าฉันจะตั้งค่า positon ให้สัมพันธ์หรือสัมบูรณ์บน #some_div ปัญหาจะเกิดขึ้นด้วยวิธีใดก็ตาม เนื้อหาภายใน #some_div ส่วนใหญ่อยู่ในตำแหน่งที่แน่นอนและสร้างขึ้นแบบไดนามิกจากฐานข้อมูลเพื่อไม่ให้ทราบความสูงล่วงหน้า

แก้ไข: นี่คือภาพหน้าจอของปัญหา: ปัญหา div


เรื่องนี้ถูกถามเมื่อไม่กี่สัปดาห์ที่ผ่านมา ฉันจะดูว่าฉันสามารถค้นหาคำถามนั้น ฉันเชื่อว่าฉันแสดงความคิดเห็นกับมัน แก้ไขฉันเชื่อว่าคำถามของคุณคล้ายกับสิ่งนี้: stackoverflow.com/questions/9398313/…
jmbertucci

กรุณารหัสของคุณเพื่อความเข้าใจที่ดีขึ้น
sandeep

คุณสามารถโพสต์โค้ดแบบเต็มของคุณได้
ไหม

23
คุณต้องการโค้ด php, css และ javascript ทั้งหมดของฉันไหม? ฉันโพสต์ส่วนของ css ที่เกี่ยวข้องกับคำถาม ...
Joey

2
NECROPOST เป็น GO: การตั้งค่าคุณสมบัติล้นทั่วไปแก้ไขปัญหาเช่นนี้ที่มีเนื้อหาภายใน div จะยืดที่ผ่านมานั้น ( overflow: hidden;, overflow: scroll;ฯลฯ )
AlbertEngelB

คำตอบ:


308

นี่คือสิ่งที่คุณควรทำในสไตล์ CSS บนหลัก div

display: block;
overflow: auto;

และห้ามสัมผัส height


4
ใช้งานได้ดีมาก ฉันต้องการที่จะเพิ่มheight: 100%การhtml, bodyและ div ภาชนะที่จะทำให้มันเติมเต็มความสูงเมื่อไม่มีเนื้อหาเพียงพอแม้ว่า
Nico Huysamen

วิธีแก้ปัญหาที่น่าอัศจรรย์ แต่คุณสามารถสัมผัสความสูงได้ถ้าหาก objetive เป็นเหมือนหน้าต่างที่ตอบสนองได้พอดี
Alexis Rabago Carvajal

เป็นdisplay: block;จำเป็น? Divs เป็นองค์ประกอบระดับบล็อกอยู่แล้ว
Max Heiber

มันจะเพิ่มแถบเลื่อนภายในสำหรับผม (ทั้งแนวนอนและแนวตั้ง)
นาธาน H

หากคุณยังคงได้รับองค์ประกอบหลักสูงกว่าองค์ประกอบเด็กเล็กน้อยให้ตรวจสอบช่องว่างเพิ่มเติมและ / หรือ ลบออก ลองปรับความสูงของเส้น ตัวอย่างเช่นฉันใส่line-height: 0เพราะฉันไม่ต้องการข้อความเพียงเพื่อแสดงภาพ
Zorgatone

57

ตั้งค่าheightการautoและการmin-height 100%นี่ควรจะแก้ปัญหาได้สำหรับเบราว์เซอร์ส่วนใหญ่

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}

3
IMO นี่ตอบคำถามที่ว่า "ฉันจะทำให้ div ไปทางด้านล่างเพื่อให้พอดีกับเนื้อหาภายในได้อย่างไร" ดีกว่าคำตอบที่ทำเครื่องหมายไว้ในปัจจุบันซึ่งเพียงเปิดการเลื่อนแบบโฟลว์แทนที่จะทำให้มั่นใจว่า div / body จะขยายให้พอดีกับเนื้อหา +1
Jammerz858

ทำงานสำหรับกรณีของฉัน ขอบคุณ!
Tyson Nero

มันอาจจะเป็นที่น่าสังเกตว่าด้วยเหตุผลบางอย่างมันไม่ทำงานถ้าheightเป็น100%และmin-heightเป็นauto- ผมจะคาดหวังเหล่านี้จะใช้แทนกันได้ในกรณีนี้ แต่ดูเหมือนว่าพวกเขาไม่ได้
PeaBrain

13

โดยปกติปัญหานี้จะเกิดขึ้นเมื่อองค์ประกอบลูกของผู้ปกครองถูกลอย นี่คือทางออกล่าสุดของปัญหา:

ในไฟล์ CSS ของคุณเขียนคลาสต่อไปนี้ชื่อ. cleanarfixพร้อมกับตัวเลือกหลอก: after

.clearfix:after {
content: "";
display: table;
clear: both;
}

จากนั้นใน HTML ของคุณเพิ่มคลาส. cleanarfix ให้กับ Div parent ของคุณ ตัวอย่างเช่น:

<div class="clearfix">
    <div></div>
    <div></div>
</div>

มันควรจะทำงานเสมอ คุณสามารถเรียกชื่อคลาสเป็น. groupแทน. cleanarfixเนื่องจากจะทำให้โค้ดมีความหมายมากขึ้น โปรดทราบว่าไม่จำเป็นต้องเพิ่มจุดหรือช่องว่างในค่าของเนื้อหาระหว่างเครื่องหมายคำพูดคู่ "" นอกจากนี้น้ำล้น: อัตโนมัติ; อาจแก้ปัญหาได้ แต่ทำให้เกิดปัญหาอื่น ๆ เช่นการแสดงแถบเลื่อนและไม่แนะนำ

ที่มา: บล็อกของ Lisa Catalano และ Chris Coyier


8

หากคุณเพียงแค่ออกheight: 100%และใช้จะใช้เป็นพื้นที่มากที่สุดเท่าที่เนื้อหาภายใน วิธีนี้ข้อความทั้งหมดจะอยู่ในพื้นหลังสีดำdisplay:block;divdiv


คุณใช้display: blockที่ไหน ฉันไม่เห็นสิ่งนั้นในคำถามของคุณ
การแข่งขัน Lightness ใน Orbit

ฉันเพิ่มมันลงใน #some_div หลังจากที่ Ronnie แนะนำ แต่มันก็ไม่ได้แก้ปัญหา
Joey

1
คุณลองเพิ่ม float: none; เป็น #some_div css เดียวกัน
RonnieVDPoel

แทนการใช้float: none; clear:both;มันทำสิ่งเดียวกัน แต่มีมากกว่าเบราว์เซอร์ @RonnieVDPoel
Cannicide

6

คำถามนี้อาจเก่า แต่สมควรได้รับการอัปเดต นี่เป็นอีกวิธีในการทำเช่นนั้น:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}

1
หากคุณกำลังจะโพสต์คำถามเก่าแนะนำให้ใช้ค่าปัจจุบัน (แนะนำให้ใช้ AKA โดยไม่มีคำนำหน้าเฟล็กซ์)
jhpratt

ขอโทษฉันไม่รู้ว่าคุณกำลังพูดถึงอะไร
9459537

1
Flex คำนำหน้าไม่จำเป็นสำหรับในขณะนี้
jhpratt

แล้วอันไหนล่ะ?
user9459537

5

ลองสิ่งนี้:

body { 
    min-height:100%; 
    background:red; 
} 

#some_div {
    min-height:100%; 
    background:black; 
} 

IE6 และรุ่นก่อนหน้านี้ไม่สนับสนุนคุณสมบัติความสูงขั้นต่ำ

ฉันคิดว่าปัญหาคือเมื่อคุณบอกว่าร่างกายมีความสูง 100% พื้นหลังของมันจะสูงได้เท่ากับความสูงของเบราว์เซอร์ "วิวพอร์ต" หนึ่งเดียว (พื้นที่ดูที่ไม่รวมแถบเครื่องมือ & สถานะแถบเมนู & แถบเมนู ขอบหน้าต่าง) หากเนื้อหาสูงกว่าหนึ่งวิวพอร์ตมันจะล้นความสูงที่อุทิศให้กับพื้นหลัง

คุณสมบัติความสูงขั้นต่ำบนเนื้อหาควรบังคับให้พื้นหลังมีความสูงอย่างน้อยหนึ่งวิวพอร์ตหนึ่งถ้าเนื้อหาของคุณไม่ได้เติมเต็มหน้าทั้งหน้าลงไปด้านล่าง แต่ก็ควรปล่อยให้มันขยายลงเพื่อครอบคลุมเนื้อหาภายในเพิ่มเติม


3

คำถามเก่า แต่ในกรณีของฉันฉันพบว่าใช้position:fixedแก้ไขให้ฉันได้ สถานการณ์ของฉันอาจแตกต่างไปเล็กน้อย ฉันมีกึ่งโปร่งใสที่ซ้อนทับdivพร้อมภาพเคลื่อนไหวในการโหลดที่ฉันต้องการแสดงในขณะที่กำลังโหลดหน้าเว็บ ดังนั้นการใช้height:auto / 100%หรือmin-height: 100%ทั้งสองเต็มหน้าต่าง แต่ไม่ใช่พื้นที่ปิดหน้าจอ การใช้การposition:fixedเลื่อนภาพซ้อนทับนี้กับผู้ใช้จึงครอบคลุมพื้นที่ที่มองเห็นได้เสมอและทำให้แอนิเมชั่นการโหลดล่วงหน้าของฉันอยู่ตรงกลางหน้าจอ


1

เพียงเพิ่มสองบรรทัดนี้ใน css id #some_div ของคุณ

display: block;
overflow: auto;

หลังจากนั้นคุณจะได้สิ่งที่คุณกำลังมองหา!


0

ฉันไม่แน่ใจทั้งหมดว่าฉันเข้าใจคำถามเพราะนี่เป็นคำตอบที่ตรงไปตรงมา แต่นี่ไป ... :)

คุณลองตั้งค่าคุณสมบัติโอเวอร์โฟลว์ของคอนเทนเนอร์ให้มองเห็นหรืออัตโนมัติหรือไม่?

#some_div {
    height:100%;
    background:black; 
    overflow: visible;
    }

การเพิ่มที่ควรผลักดันภาชนะสีดำให้มีขนาดใดก็ได้ที่ภาชนะไดนามิกของคุณต้องการ ฉันชอบที่จะเห็นอัตโนมัติเพราะอัตโนมัติดูเหมือนว่าจะมาพร้อมกับแถบเลื่อน ...


0

เบราว์เซอร์สมัยใหม่รองรับหน่วย "viewport height" สิ่งนี้จะขยาย div เป็นความสูงวิวพอร์ตที่มี ฉันคิดว่ามันน่าเชื่อถือกว่าวิธีอื่น ๆ

#some_div {
    height: 100vh;
    background: black;
}

0

แม้คุณสามารถทำสิ่งนี้ได้

display:block;
overflow:auto;
height: 100%;

ซึ่งจะรวม Div div แบบไดนามิกของคุณตามเนื้อหา สมมติว่าคุณมี div ทั่วไปในคลาสมันจะเพิ่มความสูงของไดนามิก div แต่ละอันตามเนื้อหา



0

OVERLAY โดยไม่มีตำแหน่ง: คงที่

วิธีเจ๋งจริง ๆ ที่ฉันคิดออกนี้สำหรับเมนูล่าสุดคือการตั้งค่าร่างกาย:

position: relative

และตั้งค่าคลาส wrapper ของคุณดังนี้:

#overlaywrapper {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00000080;
    z-index: 100;
}

ซึ่งหมายความว่าคุณไม่จำเป็นต้องกำหนดตำแหน่งให้คงที่และยังสามารถอนุญาตให้เลื่อนได้ ฉันใช้สิ่งนี้เพื่อวางซ้อนเมนูที่ใหญ่จริงๆ



0

ตกลงฉันลองทำสิ่งนี้:

ร่างกาย (ปกติ)

#MainDiv { 
  /* where all the content goes */
  display: table;
  overflow-y: auto;
}

มันไม่ใช่วิธีที่ถูกต้องในการเขียน แต่ถ้าคุณทำให้ div หลักแสดงเป็นตารางมันจะขยายและจากนั้นฉันก็ใช้แถบเลื่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.