องค์ประกอบแบบอินไลน์บล็อกสองชิ้นแต่ละชิ้นกว้าง 50% ไม่พอดีเคียงข้างกันในแถวเดียว


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle: http://jsfiddle.net/5EcPK/

โค้ดด้านบนพยายามวาง #left div และ #right div เคียงข้างกันในแถวเดียว แต่อย่างที่คุณเห็นใน JSFiddle URL ด้านบนนี่ไม่ใช่กรณีนี้

ฉันสามารถแก้ไขปัญหาโดยลดความกว้างของ div ตัวใดตัวหนึ่งลงเหลือ 49% ดูhttp://jsfiddle.net/mUKSC/ แต่นี่ไม่ใช่ทางออกที่ดีเนื่องจากมีช่องว่างเล็ก ๆ ปรากฏขึ้นระหว่าง div ทั้งสอง

อีกวิธีหนึ่งที่ฉันสามารถแก้ปัญหาได้คือการลอยทั้ง div ดูhttp://jsfiddle.net/VptQm/ ใช้งานได้ดี

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

คำตอบ:


141

เมื่อใช้inline-blockองค์ประกอบมักจะมีwhitespace ปัญหาระหว่างองค์ประกอบเหล่านั้น (ช่องว่างนั้นกว้างประมาณ ~ 4px)

ดังนั้นทั้งสองของคุณdivsซึ่งทั้งคู่มีความกว้าง 50% บวกกับwhitespace(~ 4px) มีความกว้างมากกว่า 100% ดังนั้นมันจึงแตก ตัวอย่างปัญหาของคุณ:


มีสองสามวิธีในการแก้ไข:

1. ไม่มีช่องว่างระหว่างองค์ประกอบเหล่านั้น

2. ใช้ความคิดเห็น HTML

3. ตั้งค่าผู้ปกครองfont-sizeเป็น0แล้วเพิ่มมูลค่าให้กับinline-blockองค์ประกอบ

4. ใช้ระยะขอบลบระหว่างกัน ( ไม่ควรใช้ )

5. ลดมุมปิด

6. ข้ามแท็กปิด HTML บางแท็ก (ขอบคุณ @thirtydot สำหรับการอ้างอิง )


อ้างอิง:

  1. การต่อสู้กับช่องว่างระหว่าง Inline Block Elements บน CSS Tricks
  2. ลบช่องว่างระหว่างองค์ประกอบแบบอินไลน์โดย David Walsh
  3. จะลบช่องว่างระหว่างองค์ประกอบอินไลน์บล็อกได้อย่างไร?

ในฐานะที่เป็น@ MarcosPérezGude กล่าวว่าการที่ดีที่สุดวิธีคือการใช้remและเพิ่มค่าเริ่มต้นบางอย่างfont-sizeในhtmlแท็ก (เหมือนในHTML5Boilerplate ) ตัวอย่าง:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

อัพเดท : เป็นมันเกือบ 2018 ใช้flexboxหรือดียิ่งขึ้น - รูปแบบตาราง CSS


3
@hoosierEE นั่นไม่ใช่เรื่องไร้สาระ ช่องว่างระหว่างองค์ประกอบก็ใช้ได้เนื่องจากองค์ประกอบแบบอินไลน์จะวางตำแหน่งที่บรรทัดข้อความ ถ้าคุณวางช่องว่างเป็นเส้นจะมีช่องว่าง ดังนั้นพฤติกรรมจึงถูกต้องแม้ว่าคุณจะคิดว่านั่นเป็นปัญหาก็ตาม (อย่างที่ Vucko เรียกมันผิด)
Marcos Pérez Gude

2
ฉันเห็นด้วยกับ @ MarcosPérezGudeพฤติกรรมนี้ถูกต้อง ดังที่คุณเห็นจากโพสต์ของฉันมีสองสามวิธีในการลบช่องว่างนั้น (ฉันใช้ความคิดเห็น HTML เพื่อลบช่องว่าง) แต่ถ้าคุณทราบว่าพื้นที่สีขาวคุณสามารถใช้flexbox, หรือการใช้งานtable/table-row/table-cell float
Vucko

2
ฉันใช้อินไลน์บล็อกอย่างสมบูรณ์แบบ parent { font-size:0; } child {font-size: 1rem; }วิธีการปกติของฉันคือ ด้วย rems ตอนนี้ง่ายที่สุด
Marcos Pérez Gude

มันน่ารำคาญเล็กน้อยที่แท็บยังคงแยกวิเคราะห์เป็นช่องว่าง ฉันไม่เคยเห็นมาก่อนว่าการวางแท็กปิดมีความไม่เสถียรหรือผลข้างเคียงหรือไม่
MintWelsh

ตรวจสอบให้แน่ใจว่าborderปิดอยู่ สิ่งนี้สามารถเพิ่มช่องว่างได้หากคุณลอย Divs
evolross

23

คำตอบที่ดีใน css3 คือ:

white-space: nowrap;

ในโหนดหลักและ:

white-space: normal;
vertical-align: top;

ใน div (หรืออื่น ๆ ) ที่ 50%

ตัวอย่าง: http://jsfiddle.net/YpTMh/19/

แก้ไข:

มีวิธีอื่นด้วย:

font-size: 0;

สำหรับโหนดแม่และแทนที่ในโหนดลูก


7

เป็นเพราะช่องว่างระหว่าง div ทั้งสองของคุณถูกตีความว่าเป็นช่องว่าง หากคุณวาง<div>แท็กของคุณในแนวเดียวกันตามที่แสดงด้านล่างปัญหาจะได้รับการแก้ไข :

<div id="left"></div><div id="right"></div>

4

เนื่องจากมีช่องว่างระหว่างองค์ประกอบ. หากคุณลบช่องว่างทั้งหมดที่พวกเขาจะพอดี

<div id="left">Left</div><div id="right">Right</div>

4

ทำให้บล็อกแทนการบล็อกแบบอินไลน์ สิ่งนี้จะทำให้ div โดยไม่สนใจช่องว่างระหว่างกัน

display:block;

หรือลบช่องว่างระหว่างแท็ก

<div id='left'></div><div id='right'></div>

หรือเพิ่ม

margin: -1en;

ไปยังหนึ่งใน div เพื่อลดพื้นที่ว่างที่เกิดจากการแสดงผลช่องว่างเดียว




1

สามารถทำได้โดยการเพิ่ม css display: inline ให้กับ div ที่เก็บอิลิเมนต์แบบอินไลน์

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

ดังนั้นจึงจะปลอดภัยกว่าถ้าใช้ display: inline;


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