Hình ảnh bên trong div có thêm không gian bên dưới hình ảnh


503

Tại sao trong đoạn mã sau chiều cao của divlớn hơn chiều cao của img? Có một khoảng trống bên dưới hình ảnh, nhưng dường như nó không phải là phần đệm / lề.

Khoảng cách hoặc không gian thêm bên dưới hình ảnh là gì?

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

Hình ảnh có một khoảng trống hoặc khoảng trắng bên dưới nó


10
Đây là một câu trả lời ngắn gọn và đầy đủ cho câu hỏi này: stackoverflow.com/a/31445364/3597276
Michael Benjamin

1
Đây là một bài đọc tốt về vấn đề này: Sự lạ lùng <img> Khoảng trống trong HTML
Matheus Avellar

Câu trả lời:


601

Theo mặc định, một hình ảnh được hiển thị nội tuyến, giống như một chữ cái để nó nằm trên cùng một dòng mà a, b, c và d ngồi trên.

Có khoảng trống bên dưới dòng đó cho con cháu bạn tìm thấy trên các chữ cái như g, j, p và q.

Trình diễn con cháu

Bạn có thể:

  • điều chỉnh vertical-alignhình ảnh để đặt nó ở vị trí khác (ví dụ middle:) hoặc
  • thay đổi displayđể nó không nội tuyến.

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>


Hình ảnh được bao gồm là miền công cộng và có nguồn gốc từ Wikimedia Commons


9
Nói chính xác hơn, điều này xảy ra các yếu tố nội tuyến b / c chiếm không gian hiện tại của chúng line-height. Đặt line-heighttheo kích thước mong muốn cũng sẽ khắc phục khoảng trắng không mong muốn.
Kevin Boucher

3
"F" có đủ điều kiện là một descender?
j08691

2
@ j08691 - Phụ thuộc vào phông chữ.
Quentin

134

Một tùy chọn khác được đề xuất ở đây là đặt kiểu của hình ảnh làstyle="display: block;"


4
cảm ơn. Điều này cũng khắc phục một vấn đề tương tự với không gian dưới một bộ phim flash. (đã thêm hiển thị: chặn các thẻ nhúng / đối tượng)
jessieloo

5
hoặc inline-blocknếu bạn vẫn muốn nó hiển thị nội tuyến như hình ảnh thông thường.
Ian

6
@Ian @Imperative inline-blockdường như không hoạt động.
p.matsinopoulos

93

Khắc phục nhanh:

Để xóa khoảng cách dưới hình ảnh , bạn có thể:

  • Đặt thuộc tính căn chỉnh dọc của hình ảnh thành vertical-align: bottom; vertical-align: top;hoặcvertical-align: middle;
  • Đặt thuộc tính hiển thị của hình ảnh thành display:block;

Xem mã sau đây để xem bản demo trực tiếp:


Giải thích: tại sao có một khoảng trống dưới hình ảnh?

Khoảng trống hoặc không gian thừa dưới hình ảnh không phải là một lỗi hoặc vấn đề, đó là hành vi mặc định. Nguyên nhân sâu xa là hình ảnh là các yếu tố được thay thế ( xem các yếu tố thay thế MDN ). Điều này cho phép họ "hành động như hình ảnh" và có kích thước nội tại, tỷ lệ khung hình riêng ....
Trình duyệt tính toán thuộc tính hiển thị của họ inlinenhưng họ cung cấp cho họ một hành vi đặc biệt khiến họ gần gũi hơn với inline-blockcác yếu tố (như bạn có thể căn chỉnh chúng theo chiều dọc, đưa ra chúng có chiều cao, lề trên / dưới và phần đệm, biến đổi ...).

Điều này cũng có nghĩa là:

<img>không có đường cơ sở, vì vậy khi hình ảnh được sử dụng trong ngữ cảnh định dạng nội tuyến với dọc-align: baseline, phần dưới của hình ảnh sẽ được đặt trên đường cơ sở văn bản.
( nguồn: MDN , nhấn mạnh của tôi )

Vì các trình duyệt theo mặc định sẽ tính toán thuộc tính dọc cho đường cơ sở, đây là hành vi mặc định. Hình ảnh sau đây cho thấy đường cơ sở nằm trên văn bản:

Vị trí của đường cơ sở trên văn bản ( Nguồn hình ảnh )

Các yếu tố căn chỉnh đường cơ sở cần giữ không gian cho con cháu kéo dài bên dưới đường cơ sở (như j, p, g ...) như bạn có thể thấy trong hình trên. Trong cấu hình này, phần dưới của hình ảnh được căn chỉnh trên đường cơ sở như bạn có thể thấy trong ví dụ này:

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>


Đây là lý do tại sao hành vi mặc định của <img>thẻ tạo ra một khoảng trống ở dưới cùng của vùng chứa của nó và tại sao việc thay đổi thuộc tính căn chỉnh dọc hoặc thuộc tính hiển thị sẽ xóa nó như trong bản demo sau:

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>


Vì vậy, đây là lý do tại sao cài đặt kích thước phông chữ thành 0 không hoạt động. hay không
Persijn

2
@Persijn nó làm. Giống như cài đặt line-height:0;nhưng tôi không coi đây là một cách giải quyết tốt so với việc thay đổi thuộc tính dọc hoặc hiển thị
web-tiki

2
Tuy nhiên, lưu ý rằng một số trình duyệt không tôn trọng font-size:0: họ đặt kích thước phông chữ thành kích thước tối thiểu trong cài đặt người dùng.
Ông Lister

Vâng, có vẻ như một khoảng trắng.
mrbengi

tốt, tôi nghĩ rằng middle text-top sub supervị trí trong hình là không đúng.
xianshenglu

40

Người ta cũng có thể vô hiệu hóa chiều cao dòng của cha mẹ:

#wrapper {
  line-height: 0;
}

Tất cả các bản sửa lỗi: http://jsfiddle.net/FaPFv/


5
CẢNH BÁO! điều này cũng sẽ giết bất kỳ nút văn bản nào trong #wrapper. vì nó sẽ được kế thừa. Nhưng điểm thưởng cho fiddler tuyệt vời đó! ở đây nó được cập nhật với các nút văn bản. jsfiddle.net/FaPFv/30
gcb

Ngoài ra, cỡ chữ: 0
Kiran

13

Tất cả bạn phải làm là gán thuộc tính này:

img {
    display: block;
}

Các hình ảnh theo mặc định có thuộc tính này:

img {
    display: inline;
}

7

Bạn có thể sử dụng một số phương pháp cho vấn đề này như

  1. Sử dụng line-height

    #wrapper {  line-height: 0px;  }
  2. Sử dụng display: flex

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
  3. Sử dụng display: block, table, flexinherit

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

Vui lòng không đề xuất line-heighthack rất cẩu thả , hoặc ít nhất là làm rõ, tại sao đó là "giải pháp" tồi tệ nhất trong tất cả: khoảnh khắc ai đó đặt văn bản bên cạnh hình ảnh (đặc biệt là đa dòng được định dạng sẵn bằng thẻ BR), họ sẽ thấy mình trong một tình huống tồi tệ hơn so với khi họ bắt đầu.
Sz.

5

Tôi đã sử dụng line-height:0và nó hoạt động tốt cho tôi.


Xin lỗi, -1: làm hỏng việc định vị văn bản, vì vậy nếu ai đó cũng đặt một số văn bản (đặc biệt là nhiều dòng, giả sử <BR>) bên cạnh hình ảnh, họ sẽ có một mớ hỗn độn, chồng chéo / nhô ra.
Sz.

3

Tôi thấy nó hoạt động rất tốt bằng cách sử dụng display: block; trên hình ảnh và dọc-align: trên cùng; trên văn bản.

.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>

hoặc bạn có thể chỉnh sửa mã FIDDLE của JS


-1

Tôi chỉ cần thêm float:leftvào div và nó hoạt động


9
Điều này là do cài đặt float:leftnguyên nhândisplay:block
Kevin Boucher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.