ภาพด้านใน div มีพื้นที่พิเศษด้านล่างของภาพ


503

ทำไมในรหัสต่อไปนี้ความสูงของตัวdivใหญ่กว่าความสูงของimg? มีช่องว่างด้านล่างของภาพ แต่ดูเหมือนว่าจะไม่เป็นช่องว่างภายใน / ขอบ

ช่องว่างหรือพื้นที่พิเศษด้านล่างของภาพคืออะไร

#wrapper {
  border: 1px solid red;
  width:200px;
}
img {
  width:200px;
}
<div id="wrapper">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>

รูปภาพที่มีช่องว่างหรือช่องว่างสีขาวข้างใต้


10
ต่อไปนี้เป็นคำตอบสั้น ๆ และสมบูรณ์สำหรับคำถามนี้: stackoverflow.com/a/31445364/3597276
Michael Benjamin

1
นี่คือการอ่านที่ดีเกี่ยวกับปัญหานี้: The Strange <img> ช่องว่างใน HTML
Matheus Avellar

คำตอบ:


601

ตามค่าเริ่มต้นรูปภาพจะแสดงผลแบบอินไลน์เช่นตัวอักษรดังนั้นจึงอยู่ในบรรทัดเดียวกันกับที่ a, b, c และ d

มีพื้นที่ใต้เส้นที่เป็นdescendersที่คุณพบในตัวอักษรเช่นกรัม, J, p และ q

การสาธิตการสืบทอด

คุณสามารถ:

  • ปรับvertical-alignภาพให้อยู่ในตำแหน่งอื่น (เช่นmiddle) หรือ
  • เปลี่ยนdisplayดังนั้นมันจึงไม่อินไลน์

div {
  border: solid black 1px;
  margin-bottom: 10px;
}

#align-middle img {
  vertical-align: middle;
}

#align-base img {
  vertical-align: bottom;
}

#display img {
  display: block;
}
<div id="default">
<h1>Default</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt="">
</div>

<div id="align-middle">
<h1>vertical-align: middle</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt=""> </div>
  
  <div id="align-base">
<h1>vertical-align: bottom</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt=""> </div>

<div id="display">
<h1>display: block</h1>
  The quick brown fox jumps over the lazy dog <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/VangoghStarry-night2.jpg/300px-VangoghStarry-night2.jpg" alt="">
</div>


ภาพรวมเป็นสาธารณสมบัติและได้มาจาก Wikimedia Commons


9
จะแม่นยำมากขึ้นนี้เกิดขึ้นองค์ประกอบแบบอินไลน์ B / C line-heightใช้พื้นที่ในปัจจุบันของพวกเขา การกำหนดline-heightมิติที่ต้องการจะเอาชนะช่องว่างที่ไม่ต้องการ
Kevin Boucher

3
"f" มีคุณสมบัติเป็นผู้สืบทอดหรือไม่
j08691

2
@ j08691 - ขึ้นอยู่กับฟอนต์
เควนติน

134

ตัวเลือกอื่นที่แนะนำที่นี่คือการตั้งค่าสไตล์ของภาพเป็นstyle="display: block;"


4
ขอบคุณ นอกจากนี้ยังแก้ไขปัญหาที่คล้ายกันกับพื้นที่ในภาพยนตร์แฟลช (เพิ่มการแสดงผล: บล็อกเพื่อฝัง / แท็กวัตถุ)
jessieloo

5
หรือinline-blockถ้าคุณยังต้องการให้แสดงอินไลน์เหมือนภาพปกติ
เอียน

6
@Ian @Imperative inline-blockดูเหมือนจะไม่ทำงาน
p.matsinopoulos

93

แก้ไขด่วน:

หากต้องการลบช่องว่างใต้ภาพคุณสามารถ:

  • ตั้งค่าคุณสมบัติการจัดตำแหน่งแนวตั้งของรูปภาพเป็นvertical-align: bottom; vertical-align: top;หรือvertical-align: middle;
  • ตั้งค่าคุณสมบัติการแสดงผลของภาพเป็น display:block;

ดูรหัสต่อไปนี้สำหรับการสาธิตสด:


คำอธิบาย: ทำไมจึงมีช่องว่างใต้ภาพ?

ช่องว่างหรือพื้นที่เพิ่มเติมใต้ภาพไม่ใช่ข้อบกพร่องหรือปัญหา แต่เป็นพฤติกรรมเริ่มต้น สาเหตุหลักคือรูปภาพถูกแทนที่องค์ประกอบ ( ดูMDN แทนที่องค์ประกอบ ) สิ่งนี้ช่วยให้พวกเขา "ทำตัวเหมือนภาพ" และมีมิติที่แท้จริงอัตราส่วนภาพ ...
เบราว์เซอร์คำนวณคุณสมบัติการแสดงผลของพวกเขาinlineแต่พวกเขาให้พวกเขามีพฤติกรรมพิเศษซึ่งทำให้พวกเขาเข้าใกล้inline-blockองค์ประกอบมากขึ้น พวกเขามีความสูงขอบบน / ล่างและแพ็ดดิ้งแปลง ... )

นี่ก็หมายความว่า:

<img>ไม่มีพื้นฐานดังนั้นเมื่อมีการใช้รูปภาพในบริบทการจัดรูปแบบอินไลน์โดยมีการจัดเรียงแนวตั้ง: พื้นฐานบรรทัดล่างของรูปภาพจะถูกวางไว้บนพื้นฐานข้อความ
(ที่มา: MDN , เหมืองที่เน้น )

ในฐานะที่เป็นเบราว์เซอร์โดยค่าเริ่มต้นคำนวณคุณสมบัติจัดแนวตั้งเพื่อพื้นฐานนี้เป็นพฤติกรรมเริ่มต้น ภาพต่อไปนี้แสดงตำแหน่งที่ฐานตั้งอยู่บนข้อความ:

ตำแหน่งของข้อความพื้นฐาน ( แหล่งรูปภาพ )

องค์ประกอบที่มีการจัดแนวพื้นฐานจำเป็นต้องรักษาพื้นที่สำหรับตัวลดทอนที่ขยายต่ำกว่าเส้นฐาน (เช่นj, p, g ...) อย่างที่คุณเห็นในภาพด้านบน ในการกำหนดค่านี้ด้านล่างของภาพจะถูกจัดตำแหน่งบนพื้นฐานที่คุณเห็นในตัวอย่างนี้:

div{border:1px solid red;font-size:30px;}
img{width:100px;height:auto;}
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />jpq are letters with descender
</div>


นี่คือสาเหตุที่พฤติกรรมเริ่มต้นของ<img>แท็กสร้างช่องว่างที่ด้านล่างของคอนเทนเนอร์และทำไมการเปลี่ยนคุณสมบัติการจัดตำแหน่งแนวตั้งหรือคุณสมบัติการแสดงผลลบออกดังที่แสดงในตัวอย่างต่อไปนี้:

div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}

.block img{
  display:block;
}
.bottom img{
  vertical-align:bottom;
}
<p>Default:</p>
<div>
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With display:block;</p>
<div class="block">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>
<p>With vertical-align:bottom;</p>
<div class="bottom">
  <img src="http://i.imgur.com/RECDV24.jpg" />
</div>


ดังนั้นนี่คือสาเหตุที่การตั้งค่าขนาดแบบอักษรเป็น 0 ไม่ทำงาน หรือไม่
Persijn

2
@Persijn มันทำ เช่นเดียวกับการตั้งค่าline-height:0;แต่ฉันไม่คิดว่านี่เป็นวิธีแก้ปัญหาที่ดีเมื่อเทียบกับการเปลี่ยนคุณสมบัติการจัดแนวตั้งหรือการแสดงผล
web-tiki

2
อย่างไรก็ตามโปรดทราบว่าบางเบราว์เซอร์ไม่เคารพfont-size:0: พวกเขาตั้งค่าขนาดตัวอักษรเป็นขนาดต่ำสุดในการตั้งค่าผู้ใช้
Mr Lister

ใช่มันดูเหมือนเป็นพื้นที่สีขาว
mrbengi

ฉันคิดว่า middle text-top sub superตำแหน่งในภาพไม่ถูกต้อง
xianshenglu

40

หนึ่งสามารถลบล้างความสูงบรรทัดของผู้ปกครอง:

#wrapper {
  line-height: 0;
}

แก้ไขทั้งหมด: http://jsfiddle.net/FaPFv/


5
คำเตือน! สิ่งนี้จะฆ่าโหนดข้อความใด ๆ ใน #wrapper มันจะถูกสืบทอด แต่คะแนนโบนัสสำหรับพู้ทำเล่นที่น่ากลัว! ที่นี่มีการปรับปรุงด้วยโหนดข้อความ jsfiddle.net/FaPFv/30
gcb

หรือขนาดตัวอักษร: 0
Kiran

13

สิ่งที่คุณต้องทำคือกำหนดคุณสมบัตินี้:

img {
    display: block;
}

รูปภาพโดยค่าเริ่มต้นมีคุณสมบัตินี้:

img {
    display: inline;
}

7

คุณสามารถใช้วิธีการต่าง ๆ สำหรับปัญหานี้เช่น

  1. การใช้ line-height

    #wrapper {  line-height: 0px;  }
  2. การใช้ display: flex

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
  3. การใช้display: block, table, flexและinherit

    #wrapper img {  display: block;    }
    #wrapper img {  display: table;    }
    #wrapper img {  display: flex;     }
    #wrapper img {  display: inherit;  }

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

5

ฉันใช้line-height:0และมันใช้งานได้ดีสำหรับฉัน


ขออภัย -1: ที่ขันการวางตำแหน่งข้อความดังนั้นหากมีคนใส่ข้อความบางส่วน (โดยเฉพาะพูดหลายบรรทัดด้วย<BR>) ถัดจากภาพพวกเขาจะมีระเบียบที่ซ้อนทับ / ยื่นเกิน
Sz.

3

ฉันคิดว่ามันใช้งานได้ดีโดยใช้ display: block; ที่รูปภาพและจัดแนวตั้ง: top; บนข้อความ

.imagebox {
    width:200px;
    float:left;
    height:88px;
    position:relative;
    background-color: #999;
}
.container {
    width:600px;
    height:176px;
    background-color: #666;
    position:relative;
    overflow:hidden;
}
.text {
    color: #000;
    font-size: 11px;
    font-family: robotomeduim, sans-serif;
    vertical-align:top;
    
}

.imagebox img{ display:block;}
<div class="container">
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
    <div class="imagebox">
        <img src="http://machdiamonds.com/n69xvs.jpg" /> <span class="text">Image title</span>
    </div>
</div>

หรือคุณสามารถแก้ไขรหัสเป็นJS FIDDLE


-1

ฉันเพิ่งเพิ่มfloat:leftdiv และมันใช้งานได้


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