Div içindeki görüntünün görüntünün altında fazladan boşluk var


503

Aşağıdaki kodda neden yüksekliği, yüksekliğinden divdaha büyük img? Görüntünün altında bir boşluk var, ancak bir dolgu / kenar boşluğu gibi görünmüyor.

Resmin altındaki boşluk veya fazladan boşluk nedir?

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

Altında boşluk veya boşluk olan görüntü


10
İşte bu soruya kısa ve eksiksiz bir cevap: stackoverflow.com/a/31445364/3597276
Michael Benjamin

1
İşte bu konuda iyi bir okuma: HTML'deki Garip <img> Boşluğu
Matheus Avellar

Yanıtlar:


601

Varsayılan olarak, görüntü a, b, c ve d ile aynı satırda olacak şekilde satır içi olarak, bir harf gibi işlenir.

Bu çizginin altında g, j, p ve q gibi harflerde bulduğunuz inişler için boşluk var .

İnişlerin gösterilmesi

Yapabilirsin:

  • ayarlamak vertical-alignbaşka yerde konumlandırmak için resmin (örn middle) veya
  • displayböylece satır içi değil değiştirin .

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>


Eklenen resim kamu malı ve olduğu kaynaklı Wikimedia Commons


9
Daha kesin olmak gerekirse, bu b / c satır içi öğeleri akımlarının alanını kaplar line-height. line-heightİstenen boyuta ayarlamak , istenmeyen boşlukların da üstesinden gelecektir.
Kevin Boucher

3
"F" descender olarak nitelendiriliyor mu?
j08691

2
@ j08691 - Yazı tipine bağlıdır.
Quentin

134

Burada önerilen başka bir seçenek de görüntünün stilinistyle="display: block;"


4
Teşekkürler. Bu aynı zamanda flash film altındaki alanla ilgili benzer bir sorunu düzeltti. (eklenen ekran: gömme / nesne etiketleri için blok)
jessieloo

5
veya inline-blocknormalde görüntülerde olduğu gibi satır içi görüntülenmesini istiyorsanız.
Ian

6
@Ian @Imperative inline-blockçalışmıyor gibi görünüyor.
p.matsinopoulos

93

Hızlı düzeltme:

To resmin altında boşluğu kaldırmak şunları yapabilirsiniz:

  • Set vertical-align resmin özelliğini vertical-align: bottom; vertical-align: top;veyavertical-align: middle;
  • Görüntünün display özelliğini display:block;

Canlı bir demo için aşağıdaki koda bakın:


Açıklama: Görüntünün altında neden bir boşluk var?

Resmin altındaki boşluk veya ekstra alan bir hata veya sorun değil, varsayılan davranıştır. Temel neden, resimlerin değiştirilmiş öğeler olmasıdır ( bkz. MDN değiştirilen öğeler ). Bu onların "görüntü gibi davranmak" ve kendi iç boyutları, en boy oranına sahip olmasını sağlar ....
Tarayıcılar display özelliklerini hesaplarlar, inlineancak onları inline-blockelemanlara daha yakın yapan özel bir davranış sağlarlar (dikey olarak hizalayabileceğiniz gibi, bir yükseklik, üst / alt kenar boşluğu ve dolgu, dönüştürür ...).

Bu aynı zamanda şu anlama gelir:

<img>taban çizgisi içermediğinden, resimler dikey hizalama: taban çizgisi ile satır içi biçimlendirme bağlamında kullanıldığında , görüntünün altı metin taban çizgisine yerleştirilir.
( kaynak: MDN , benim vurgu )

Tarayıcılar varsayılan olarak dikey hizalama özelliğini taban çizgisine göre hesaplarken, bu varsayılan davranıştır. Aşağıdaki resim taban çizgisinin metnin neresinde bulunduğunu göstermektedir:

Metin üzerinde taban çizgisinin konumu ( Görüntü kaynağı )

Taban çizgisi ile hizalanmış öğelerin , yukarıdaki resimde görebileceğiniz gibi taban çizgisinin (gibi ) altına inen inişler için yer tutması gerekir j, p, g .... Bu yapılandırmada, görüntünün altı bu örnekte görebileceğiniz gibi taban çizgisine hizalanır :

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>Etiketin varsayılan davranışının kapsayıcısının altında bir boşluk oluşturmasının nedeni budur ve dikey hizalama özelliğini veya display özelliğini değiştirmek aşağıdaki demoda olduğu gibi kaldırır:

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>


Bu yüzden yazı tipi boyutunu 0 olarak ayarlamak işe yaramaz. ya da öyle mi?
Persijn

2
@Persijn öyle. Ayarı line-height:0;seviyorum ama bunu dikey hizalama veya görüntüleme özelliklerini değiştirmeye kıyasla iyi bir geçici çözüm olarak görmüyorum
web-tiki

2
Bununla birlikte, bazı tarayıcıların saygı duymadığını unutmayın font-size:0: yazı tipi boyutunu kullanıcı ayarlarında minimum boyuta ayarlarlar.
Bay Lister

Evet, beyaz bir boşluk gibi görünüyor.
mrbengi

Bence middle text-top sub superresimdeki pozisyon doğru değil.
xianshenglu

40

Ayrıca ebeveynin satır yüksekliğini geçersiz kılabilir:

#wrapper {
  line-height: 0;
}

Tüm düzeltmeler: http://jsfiddle.net/FaPFv/


5
UYARI! bu, #wrapper öğesindeki metin düğümlerini de öldürür. miras alınacağı gibi. Ama bu harika kemancı için bonus puan! burada metin düğümleri ile güncellenir. jsfiddle.net/FaPFv/30
gcb

Alternatif olarak, yazı tipi boyutu: 0
Kiran

13

Tek yapmanız gereken bu özelliği atamak:

img {
    display: block;
}

Varsayılan olarak resimler şu özelliğe sahiptir:

img {
    display: inline;
}

7

Bu sorun için aşağıdaki gibi çeşitli yöntemler kullanabilirsiniz:

  1. kullanma line-height

    #wrapper {  line-height: 0px;  }
  2. kullanma display: flex

    #wrapper {  display: flex;         }
    #wrapper {  display: inline-flex;  }
  3. Kullanılması display: block, table, flexveinherit

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

Lütfen çok özensiz line-heightkesmek tavsiye etmeyin ya da en azından neden hepsinin en kötü "çözümü" olduğunu açıklamayın: Birisi görüntünün yanına metin koyduğu anda (özellikle BR etiketleri ile önceden biçimlendirilmiş çok satırlı), kendilerini başlangıçlarından daha kötü bir durumda bulacaklar.
Sz.

5

Kullandım line-height:0ve benim için iyi çalışıyor.


Özür dileriz, -1: metin konumlandırmayı <BR>bozar, bu nedenle birisi de görüntünün yanına bazı (özellikle çok satırlı, diyelim ) bir metin koyarsa, yanlış yerleştirilmiş, üst üste binen / sarkan bir karmaşaya sahip olur.
Sz.

3

Display: block kullanarak harika çalışıyor buldum; görüntü üzerinde ve dikey hizalama: üst; metni.

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

veya bir JS FIDDLE kodunu düzenleyebilirsiniz


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.