ทำให้เด็กมองเห็นได้ภายนอกโอเวอร์โฟลว์: ผู้ปกครองที่ซ่อนอยู่


100

ใน CSS overflow:hiddenมีการตั้งค่าบนคอนเทนเนอร์หลักเพื่อให้สามารถขยายได้ตามความสูงของลูกที่ลอยอยู่

แต่มันยังมีคุณสมบัติที่น่าสนใจอีกอย่างเมื่อรวมกับmargin: auto...

หากพี่น้องก่อนหน้านี้เป็นองค์ประกอบลอยจริงจะปรากฏขึ้นมาเคียงข้างกัน นั่นคือถ้าพี่น้องเป็นfloat:leftคอนเทนเนอร์ด้วยfloat:none overflow:hiddenจะปรากฏทางด้านขวาของพี่น้องโดยไม่มีการขึ้นบรรทัดใหม่เหมือนกับว่ามันลอยอยู่ในโฟลว์ปกติ หากพี่น้องก่อนหน้านี้เป็นfloat:rightคอนเทนเนอร์จะปรากฏทางด้านซ้ายของพี่น้อง การปรับขนาดคอนเทนเนอร์นี้จะแสดงให้เห็นว่าอยู่กึ่งกลางระหว่างองค์ประกอบลอย บอกว่าถ้าคุณมีพี่น้องสองคนก่อนหน้านี้หนึ่งfloat:leftอื่น ๆfloat:right, ภาชนะที่จะปรากฏเป็นศูนย์กลาง inbetween สอง

นี่คือปัญหา ...

ฉันจะรักษาเค้าโครงประเภทนั้นได้อย่างไรโดยไม่มีการปิดบังเด็ก

Googling ทั่วทั้งเว็บช่วยให้ฉันมีวิธีการclear:bothและขยายคอนเทนเนอร์ ... แต่ฉันไม่พบวิธีอื่นในการรักษาศูนย์กลางเด็กก่อนหน้าซ้าย / ขวา หากคุณสร้างคอนเทนเนอร์คอนเทนเนอร์overflow:visibleนั้นก็จะเพิกเฉยต่อการจัดวางองค์ประกอบที่ลอยอยู่และปรากฏเป็นชั้น ๆ อยู่ด้านบนขององค์ประกอบลอย

ดังนั้นคำถาม :

ฉันต้องมีคอนเทนเนอร์overflow:hiddenเพื่อรักษาเค้าโครง ...

จะทำยังไงให้เด็ก ๆ ไม่สวมหน้ากาก ฉันจำเป็นต้องให้เด็กอยู่ในตำแหน่งที่สัมพันธ์กับผู้ปกครองนอกคอนเทนเนอร์อย่างแน่นอน

หรือ

ฉันจะทำอย่างไรoverflow:visibleเพื่อให้ฉันอย่างสามารถวางตำแหน่งของเด็กที่สัมพันธ์กับผู้ปกครองนอกภาชนะ ... ยังรักษาพี่น้องลอยเหมือนรูปแบบการไหล?

คำตอบ:


86

คุณสามารถใช้clearfix"การรักษาเค้าโครง" ในการทำเช่นเดียวกับที่overflow: hiddenทำ

.clearfix:before,
.clearfix:after {
    content: ".";    
    display: block;    
    height: 0;    
    overflow: hidden; 
}
.clearfix:after { clear: both; }
.clearfix { zoom: 1; } /* IE < 8 */

เพิ่มclass="clearfix"คลาสให้กับพาเรนต์และลบoverflow: hidden;


หืม! ฉลาดฉันเพิ่งทดลองกับมัน สิ่งที่ฉันได้รับในขณะนี้คือเนื้อหาที่สร้างขึ้นทำงานได้อย่างถูกต้องถูกเก็บรักษาไว้ในขั้นตอนของการจัดวาง แต่ผู้ปกครองจะยังคงเพิกเฉยและวางเลเยอร์บนองค์ประกอบลอย อย่างไรก็ตามนี่เป็นความคิดที่ดีมากและฉันจะเล่นกับมันมากขึ้นเพื่อดูว่าฉันสามารถปฏิบัติได้อย่างถูกต้องและกลับมาโหวตอีกครั้ง ขอบคุณ :).
marknadal

@ user1671639 ตัวอย่างของคุณใช้ไม่ได้กับ clearfix คุณต้องการอย่างอื่นดังนั้นฉันขอแนะนำให้คุณโพสต์คำถามที่มีปัญหาของคุณ
Frexuz

สิ่งนี้ไม่ได้ผลในลักษณะเดียวกับoverflow:hiddenเลย การใช้ clearfix กับ div พาเรนต์ไม่อนุญาตให้คอมโพเนนต์ย่อยทั้งหมด "อยู่ใน" ความสูงเดียวกันกับพาเรนต์
Khom Nazid

11

คำตอบทั้งสองข้อที่โพสต์ไม่ได้ผลสำหรับฉัน อย่างไรก็ตามการตั้งค่าposition: absoluteสำหรับองค์ประกอบลูกไม่ได้ผล


18
แต่ DIV ของผู้ปกครองจะไม่ปิดบังหรือไม่ถ้ามันเกินขอบเขตของ DIV หลัก (ซึ่งมี overflow: hidden)?
marknadal

9
Afaik ไม่ได้ตราบใดที่ผู้ปกครองไม่มีตำแหน่ง: ญาติ จากนั้นเด็กจะอยู่ในตำแหน่งที่สัมพันธ์กับองค์ประกอบบรรพบุรุษที่อยู่ในตำแหน่งแรก (ไม่คงที่) โดยนำมันออกจากการไหลของโดมปกติ (พาเรนต์)
Pim Schaaf

หากพาเรนต์มี position: สัมพัทธ์และไม่ต้องการคุณสามารถกำหนดตำแหน่ง: unset
yeahlad

จริงถ้าposition: fixedตำแหน่งหรือตำแหน่งที่แน่นอนเทียบกับสิ่งที่อยู่นอกพาเรนต์ที่มีvisibility: hiddenก็จะมองเห็นได้ อย่างไรก็ตามคุณมักจะต้อง (ต้องการ) เพื่อวางตำแหน่งให้สัมพันธ์กับพาเรนต์เพื่อให้การเปลี่ยนแปลงโค้ดมีประสิทธิภาพมากขึ้น ดังนั้นวิธีแก้ปัญหาเหล่านี้ไม่ใช่ทางเลือก
ArneHugo

10

นี่เป็นคำถามเก่า แต่เจอด้วยตัวเอง

ฉันมีวิธีแก้ปัญหาแบบกึ่ง ๆ ที่ใช้สถานการณ์สำหรับคำถามเดิม ("เด็ก ๆ มองเห็นได้ล้น: ผู้ปกครองที่ซ่อนอยู่")

หาก div ระดับบนสุดไม่จำเป็นต้องอยู่ในตำแหน่ง: สัมพัทธ์เพียงแค่ตั้งค่าสไตล์ลูกเป็น visibility: visible

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

นี่คือตัวอย่างเส็งเคร็งเพียงแค่โพสต์ลงในไฟล์ html เพื่อดู

<div style="background: #ff00ff; overflow: hidden; width: 500px; height: 500px; position: relative;">
    <div style="background: #ff0000;position: fixed; top: 10px; left: 10px;">asd
        <div style="background: #00ffff; width: 200px; overflow: visible; position: absolute; visibility: visible; clear:both; height: 1000px; top: 100px; left: 10px;"> a</div>
    </div>
</div>

นี่คือตัวอย่างเส็งเคร็งเพียงแค่โพสต์ลงในไฟล์ html เพื่อดู <code> <div style = "background: # ff00ff; overflow: hidden; width: 500px; height: 500px; position: relative;"> <div style = "background: # ff0000; position: fixed; top: 10px; left : 10px; "> asd <div style =" background: # 00ffff; width: 200px; overflow: visible; position: absolute; visibility: visible; clear: both; height: 1000px; top: 100px; left: 10px; "> ก </div> </div> </div> </code>
Thomas Davis

4
ขอบคุณที่พยายามตอบ แต่ไม่ได้ผลเนื่องจากตำแหน่งคงที่จะวางตำแหน่งองค์ประกอบโดยอัตโนมัติโดยสัมพันธ์กับวิวพอร์ตซึ่งหมายความว่าองค์ประกอบนั้นจะไม่เคลื่อนที่ไปพร้อมกับพาเรนต์ ในความเป็นจริงถ้าคุณมีหน้าที่เลื่อนมันจะอยู่ที่ 10px, 10px เมื่อคุณเลื่อน
marknadal

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

ขอบคุณที่ได้ผลสำหรับฉัน ฉันมีผู้ปกครองที่มีตำแหน่งที่สัมพันธ์กันและนั่นเป็นสิ่งที่จำเป็นเนื่องจากตำแหน่งถูกกำหนดโดยใช้left. การใช้margin-leftแทนจะได้ผลเช่นเดียวกันดังนั้นฉันจึงไม่จำเป็นต้องใช้ตำแหน่งที่สัมพันธ์กันอีกต่อไป
Felipe Castro

1

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

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