ฉันรู้ว่านี่เป็นปัญหาเก่าฉันเจอมาหลายครั้งแล้ว ปัญหาคือการแก้ไขทั้งหมดที่นี่คือการแฮ็กที่อาจส่งผลที่ไม่คาดคิด
ก่อนอื่นมีคำอธิบายง่ายๆสำหรับปัญหาราก เนื่องจากวิธีการยุบระยะขอบทำงานหากองค์ประกอบแรกในคอนเทนเนอร์มีระยะขอบบนสุดขอบบนนั้นจะถูกนำไปใช้กับคอนเทนเนอร์หลักอย่างมีประสิทธิภาพ คุณสามารถทดสอบได้ด้วยตนเองโดยทำดังต่อไปนี้:
<div>
<h1>Test</h1>
</div>
ในดีบักเกอร์ให้เปิดขึ้นและวางเมาส์เหนือ div คุณจะสังเกตเห็นว่า div นั้นถูกวางไว้ในตำแหน่งที่ขอบบนสุดขององค์ประกอบ H1 หยุดลง พฤติกรรมนี้มีไว้สำหรับเบราว์เซอร์
ดังนั้นจึงมีวิธีแก้ไขที่ง่ายโดยไม่ต้องใช้แฮ็กแปลก ๆ เหมือนที่โพสต์ส่วนใหญ่ทำ (ไม่มีเจตนาดูถูก แต่เป็นความจริง) เพียงกลับไปที่คำอธิบายเดิม - ...if the first element inside a container has a top margin...
- หลังจากนั้นคุณจึงต้อง องค์ประกอบแรกในคอนเทนเนอร์ที่ไม่มีขอบด้านบน โอเค แต่คุณจะทำได้อย่างไรโดยไม่ต้องเพิ่มองค์ประกอบที่ไม่รบกวนความหมายกับเอกสารของคุณ
ง่าย! หลอกองค์ประกอบ! คุณสามารถทำได้ผ่านคลาสหรือมิกซ์อินที่กำหนดไว้ล่วงหน้า เพิ่ม:before
องค์ประกอบหลอก:
CSS ผ่านคลาส:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
ด้วยสิ่งนี้ทำตามตัวอย่างมาร์กอัปด้านบนคุณจะแก้ไข div ของคุณดังนี้:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
ทำไมถึงได้ผล?
องค์ประกอบแรกในคอนเทนเนอร์หากไม่มีขอบบนสุดให้กำหนดตำแหน่งของจุดเริ่มต้นของระยะขอบบนขององค์ประกอบถัดไป ด้วยการเพิ่ม:before
องค์ประกอบหลอกเบราว์เซอร์จะเพิ่มองค์ประกอบที่ไม่ใช่ความหมาย (หรืออีกนัยหนึ่งคือดีสำหรับ SEO) ลงในคอนเทนเนอร์หลักก่อนองค์ประกอบแรกของคุณ
ถามทำไมความสูง: .0000001em?
A. เบราว์เซอร์ต้องใช้ความสูงเพื่อดันองค์ประกอบระยะขอบลง ความสูงนี้เป็นศูนย์อย่างมีประสิทธิภาพ แต่จะยังช่วยให้คุณสามารถเพิ่มช่องว่างในคอนเทนเนอร์หลักได้ เนื่องจากเป็นศูนย์อย่างมีประสิทธิภาพจึงไม่มีผลกระทบต่อรูปแบบของคอนเทนเนอร์เช่นกัน สวย.
ตอนนี้คุณสามารถเพิ่มคลาส (หรือดีกว่าใน SASS / LESS, mixin!) เพื่อแก้ไขปัญหานี้แทนที่จะเพิ่มรูปแบบการแสดงแปลก ๆ ที่จะทำให้เกิดผลที่ไม่คาดคิดเมื่อคุณต้องการทำสิ่งอื่น ๆ กับองค์ประกอบของคุณโดยมีจุดประสงค์เพื่อกำจัดระยะขอบขององค์ประกอบ และ / หรือแทนที่ด้วยช่องว่างภายในหรือรูปแบบตำแหน่ง / ลอยแปลก ๆ ซึ่งไม่ได้มีจุดประสงค์เพื่อแก้ไขปัญหานี้จริงๆ
overflow:hidden
ดีกว่าสำหรับ 90% ของกรณี