Her biri% 50 genişlikte iki satır içi blok eleman, tek bir sıraya yan yana sığmaz


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/

Yukarıdaki kod, #left div ve #right div'i tek bir satıra yan yana yerleştirmeye çalışıyor. Ancak yukarıdaki JSFiddle URL'sinde görebileceğiniz gibi, durum böyle değil.

Bölmelerden birinin genişliğini% 49'a düşüren sorunu çözebiliyorum. Bkz http://jsfiddle.net/mUKSC/ . Ancak bu ideal bir çözüm değildir çünkü iki div arasında küçük bir boşluk görünür.

Sorunu çözebilmemin başka bir yolu, her iki div'i de yüzdürmektir. Görmek http://jsfiddle.net/VptQm/ . Bu iyi çalışıyor.

Ama asıl sorum kalır. Neden her iki div de satır içi blok öğeler olarak tutulduğunda yan yana sığmıyorlar?

Yanıtlar:


140

inline-blockÖğeleri kullanırken , whitespace bu öğeler arasında her zaman bir sorun olacaktır (bu alan yaklaşık 4 piksel genişliğindedir).

Yani, divsher ikisi de% 50 genişliğe sahip olan whitespaceikinizin artı (~ 4px) genişliği% 100'den fazladır ve bu yüzden kırılır. Sorununuza örnek:


Bunu düzeltmenin birkaç yolu var:

1. Bu öğeler arasında boşluk yok

2. HTML yorumlarını kullanma

3. anne Set font-sizeiçin 0ve sonra bazı değer ekleyerek inline-blockelemanları

4. Aralarında negatif bir kenar boşluğu kullanmak ( tercih edilmez )

5. Kapanma açısı düşüyor

6. Belirli HTML kapanış etiketlerini atlama ( referans için @thirtydot'a teşekkürler )


Referanslar:

  1. CSS Hilelerinde Satır İçi Blok Öğeleri Arasındaki Boşlukla Mücadele
  2. Satır İçi Blok Öğeler Arasındaki Boşluğu Kaldır, David Walsh
  3. Satır içi blok öğeler arasındaki boşluk nasıl kaldırılır?

As MarcosPérezGude @ söyledi , iyi yolu kullanmaktır remve bazı varsayılan değer katmak font-sizeüzerine html(olduğu gibi etiketi HTML5Boilerplate ). Misal:

html{
    font-size: 1em;
}

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

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

Güncelleme : neredeyse 2018 olduğu için flexbox veya daha iyisi - CSS ızgara düzenini kullanın .


3
@hoosierEE bu saçmalık değil. Öğeler arasındaki boşluk iyidir, çünkü satır içi blok öğeler metin satırında konumlanacaktır. Bir satıra boşluk koyarsanız boşluk olacaktır. Dolayısıyla, bunun bir sorun olduğunu düşünseniz bile (Vucko'nun yanlış dediği gibi) davranış doğrudur.
Marcos Pérez Gude

2
@ MarcosPérezGude'a katılıyorum, bu davranış doğrudur. Gönderimden de görebileceğiniz gibi, bu boşluğu kaldırmanın birkaç yolu var (ben beyaz boşluğu kaldırmak için HTML yorumlarını kullanıyorum). O boşluk sakıncası Ama eğer, her zaman kullanabilir flexbox, table/table-row/table-cellveya kullanım float.
Vucko

2
Satır içi blokları mükemmel kullanıyorum. Benim normal yaklaşımım parent { font-size:0; } child {font-size: 1rem; }. Rems ile artık en kolayı
Marcos Pérez Gude

sekmelerin hala boşluk olarak ayrıştırılması biraz can sıkıcı. Daha önce kapanış etiketi düzeltmesini bırakmanın herhangi bir istikrarsızlık veya yan etkisi var mı?
MintWelsh

Ayrıca borderkapalı olduğundan emin olun . Bu, div'leri kaydırıyorsanız boşluk ekleyebilir.
evolross

23

css3'teki iyi cevap:

white-space: nowrap;

üst düğümde ve:

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

div (veya başka) olarak% 50'de

örnek: http://jsfiddle.net/YpTMh/19/

DÜZENLE:

bunun başka bir yolu var:

font-size: 0;

üst düğüm için ve onu alt düğümde geçersiz kılın


7

Bunun nedeni, iki div'iniz arasındaki boşluk bir boşluk olarak yorumlanıyor. <div>Etiketlerinizi aşağıda gösterildiği gibi sıraya koyarsanız sorun giderilir :

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


4

Satır içi blok yerine onları engelleyin. Bu, div'leri aralarındaki boşlukları göz ardı ederek oluşturacaktır.

display:block;

veya etiketler arasındaki boşluğu kaldırın

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

veya ekle

margin: -1en;

işlenen tek alan tarafından kaplanan alanı azaltmak için div'lerden birine.


2

Lütfen aşağıdaki kodu kontrol edin:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>



1

Satır içi öğeleri tutan div'e css display: inline eklenerek yapılabilir.

Negatif değerli marj kullanarak beyaz boşluğu kaldırırken, onu bu belirli öğeye eklemek gerekli hale gelir. Bir sınıfa eklemek, bu sınıfın kullanıldığı yerleri etkileyecektir.

Bu nedenle display: inline'ı kullanmak daha güvenli olacaktır;


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.