Kalan genişliği dolduracak bir div oluştur


87

Kalan genişliği nasıl doldurabilirim?

<div id="Main" style="width: 500px;">
    <div id="div1" style="width: 100px;"></div>
    <div id="div2"></div>
    <div id="div3" style="width: 100px; float: right;"></div>
</div>

Kalanı nasıl div2doldurabilirim?


Güncel ve doğru bir cevap için, lütfen Adrien Be'nin cevabına verilen en iyi cevabı değiştirin.
edwardtyl

Tam tersine, sabit genişlikte bir merkez div'e ve div'lerin dışındaki sıvıya ihtiyacım vardı. Başkasının ihtiyacı olursa alt kısma bir cevap ekledim.
damndaewoo

Yanıtlar:


63

Bunun gibi bir şey deneyin:

<style>
    #divMain { width: 500px; }
    #left-div { width: 100px; float: left; background-color: #fcc; }
    #middle-div { margin-left: 100px; margin-right: 100px; background-color: #cfc; }
    #right-div { width: 100px; float: right; background-color: #ccf; }
</style>

<div id="divMain">
    <div id="left-div">
        left div
    </div>
    <div id="right-div">
        right div
    </div>
    <div id="middle-div">
        middle div<br />bit taller
    </div>
</div>

div'ler doğal olarak kapsayıcılarının genişliğinin% 100'ünü kaplar, bu genişliği açıkça ayarlamaya gerek yoktur. İki yan bölmeyle aynı olan bir sol / sağ kenar boşluğu ekleyerek, kendi içeriği aralarında oturmaya zorlanır.

HTML'de "orta div" in "sağ div" den sonra geldiğine dikkat edin


1
Sanırım (harika) çözümünüze dayanarak daha da iyi bir çözüm buldum :) Sağladığım cevaba aşağıya bakın
Adrien Be

öğelerin sırasını değiştirmeden bunu yapmanın bir yolu var mı? yani sol bölme, orta bölme, sağ bölme. Farklı ekran boyutlarında farklı şeyler yapmak istiyorsanız bu önemlidir.
Eliezer Steinbock

Evet, bu sol-sağ-orta sıralaması gerçekten işin püf noktası. Sağ div'in iki div'in altına girmesine izin vermez, değil mi?
Ansjovis86

50

Güncel çözüm (Ekim 2014): akışkan düzenlere hazır


Giriş:

Bu çözüm, tarafından sağlanandan daha basittir Leigh. Aslında buna dayanıyor.

Burada, ortadaki elemanın (bizim durumumuzda, "content__middle"sınıfla birlikte) herhangi bir boyutsal özelliğe sahip olmadığını fark edebilirsiniz - genişlik, dolgu veya kenar boşluğu ile ilgili hiçbir özellik yoktur - sadece bir overflow: auto;(not 1'e bakın).

En büyük avantajı, artık sol ve sağ öğeleriniz için a max-widthve a belirtebilmenizdirmin-width . Akıcı düzenler için harika olan ... dolayısıyla duyarlı düzen :-)

not 1: margin-left& margin-rightözelliklerini "content__middle"sınıfa eklemeniz gereken Leigh'in cevabına karşı .


Değişken olmayan düzene sahip kod:

Burada (sınıfları ile sağ ve sol elemanları "content__left"ve "content__right") bir olması sabit genişlik (piksel): dolayısıyla adı sıvı olmayan bir düzen.

Http://jsbin.com/qukocefudusu/1/edit?html,css,output'ta Canlı Demo

<style>
    /*
     * [1] & [3] "floats" makes the 2 divs align themselves respectively right & left
     * [2] "overflow: auto;" makes this div take the remaining width
     */
    .content {
        width: 100%;
    }
    .content__left {
        width: 100px;
        float: left; /* [1] */
        background-color: #fcc;
    }
    .content__middle {
        background-color: #cfc;
        overflow: auto; /* [2] */
    }
    .content__right {
        width: 100px;
        float: right; /* [3] */
        background-color: #ccf;
    }
</style>

<div class="content">
    <div class="content__left">
        left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>
    </div>
    <div class="content__right">
        right div<br/>right div<br/>right div<br/>right div<br/>
    </div>
    <div class="content__middle">
        middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br />bit taller
    </div>
</div>

Değişken yerleşimli kod:

Burada (sınıfları ile sağ ve sol elemanları "content__left"ve "content__right") bir olması değişken bir genişliğe (yüzde olarak), ancak, aynı zamanda, bir minimum ve maksimum genişliği: dolayısıyla sıvı düzeni olarak adlandırılan.

Http://jsbin.com/runahoremuwu/1/edit?html,css,outputmax-width özellikleriyle değişken bir düzende Canlı Demo

<style>
    /*
     * [1] & [3] "floats" makes the 2 divs align themselves respectively right & left
     * [2] "overflow: auto;" makes this div take the remaining width
     */
    .content { 
        width: 100%; 
    }
    .content__left { 
        width: 20%; 
        max-width: 170px;  
        min-width: 40px;  
        float: left; /* [1] */
        background-color: #fcc; 
     }
    .content__middle { 
        background-color: #cfc; 
        overflow: auto; /* [2] */
    }
    .content__right { 
        width: 20%; 
        max-width: 250px; 
        min-width: 80px; 
        float: right; /* [3] */
        background-color: #ccf; 
    }
</style>

<div class="content">
    <div class="content__left">
        max-width of 170px & min-width of 40px<br />left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>left div<br/>
    </div>
    <div class="content__right">
        max-width of 250px & min-width of 80px<br />right div<br/>right div<br/>right div<br/>right div<br/>
    </div>
    <div class="content__middle">
        middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br/>middle div<br />bit taller
    </div>
</div>

Tarayıcı Desteği

BrowserStack.com'da aşağıdaki web tarayıcılarında test edilmiştir:

  • IE7 ila IE11
  • Ff 20, Ff 28
  • Safari 4.0 (Windows XP), Safari 5.1 (Windows XP)
  • Chrome 20, Chrome 25, Chrome 30, Chrome 33,
  • Opera 20

2
Özellikle Duyarlı Web Tasarımı bir zorunluluk haline geldiğinden tüm geliştiricilere bu yöntemi kullanmalarını tavsiye ederim. :)
aullah

1
Buna dikkat et. Bazı durumlarda, yükseklikler taşma nedeniyle doğru değilse Firefox'ta content__middle div'de kaydırma çubuğu görünür: auto;
Jason

Merhaba Jason, bu çok ilginç, buna işaret ettiğin için teşekkürler. Bu olduğunda canlı bir örnek göstermesi için bir jsfiddle sağlayabilir misiniz?
Adrien Be

bunun nedeni overflowblok biçimlendirme bağlamı oluşturması mı? olur display: flexaynı etkiye sahip?
Jayen

1
Evet oldu. developer.mozilla.org/en-US/docs/Web/Guide/CSS/… çok yardımcı oldu. kullanarak sona overflow-y: hidden) o a)), b ayarlanacak genişliği izin iyi tarayıcı desteği ve c olduğu gibi bir tablo değildi
Jayen

39

Flex kutuları çözüm - ve harikalar. On yıldır css dışında böyle bir şey istiyorum. Tek ihtiyacınız display: flexolan "Ana" ve flex-grow: 100(100'ün keyfi olduğu - tam olarak 100 olması önemli değil) tarzınıza eklemektir . Bu stili eklemeyi deneyin (efekti görünür kılmak için eklenen renkler):

<style>
    #Main {
        background-color: lightgray;
        display: flex;
    }

    #div1 {
        border: 1px solid green;   
        height: 50px; 
        display: inline-flex; 
    }
    #div2 {
        border: 1px solid blue;    
        height: 50px;
        display: inline-flex;
        flex-grow: 100;
    }
    #div3 {
        border: 1px solid orange;        
        height: 50px;
        display: inline-flex;
    }
</style>

Esnek kutular hakkında daha fazla bilgiyi burada bulabilirsiniz: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


Flexbox harikadır ancak kalan tüm alan yerine yalnızca ihtiyaç duyduğu kadar yer kaplar. Böylece taşma ile gittim: otomatik çözüm.
ThinkBonobo

@ThinkBonobo "O" ile ne demek istiyorsun? Bir esnek kutunun kendisi bir 'blok' gibi davranacaktır ve bir esnek kutu içindeki öğeler kesinlikle gerektirdiğinden daha fazla yer kaplayabilir.
BT

@BT, ana merkezi div anlamına gelir. Kesinlikle birçok durumda işe yarayan bir çözüm, ancak benim özel kullanım durumum için değil.
ThinkBonobo

1
@ThinkBonobo Bahsi Bir jsFiddle yayınlarsanız sizin için çalışmasını sağlayabilirim
BT

23

Bunu flex-grow başarmak için CSS Flexbox özelliğini kullanın.

.main {
  display: flex;
}
.col-1, .col-3 {
  width: 100px;
}
.col-2 {
  flex-grow: 1;
}
<div class="main">
  <div class="col-1" style="background: #fc9;">Left column</div>
  <div class="col-2" style="background: #eee;">Middle column</div>
  <div class="col-3" style="background: #fc9;">Right column</div>
</div>


1
En iyi cevap tbh. 4 yıl sonra çalışır ve diğer çözümlere göre daha temizdir. +1
Harry J

4

bitCevap vermede gecikmiş olsa da , burada marj kullanmadan alternatif bir yaklaşım var.

<style>
    #divMain { width: 500px; }
    #div1 { width: 100px; float: left; background-color: #fcc; }
    #div2 { overflow:hidden; background-color: #cfc; }
    #div3 { width: 100px; float: right; background-color: #ccf; }
</style>

<div id="divMain">
    <div id="div1">
        div 1
    </div>
    <div id="div3">
        div 3
    </div>
    <div id="div2">
        div 2<br />bit taller
    </div>
</div>

Bu yöntem sihir gibi çalışır, ancak işte bir açıklama:) \

Burada benzer bir örnekle oynayın.


4

Kalan alanı kaplaması gereken Div bir sınıf olmalıdır .. Diğer div'ler id (ler) olabilir ancak genişlikleri olmalıdır ..

CSS :

#main_center {
    width:1000px;
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    display:block;
}
#left {
    width:200px;
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    background:#c6f5c6;
    float:left;
}
.right {
    height:100px;
    padding:0px 0px;
    margin:0px auto;
    overflow:hidden;
    background:#000fff;
}
.clear {
    clear:both;
}

HTML :

<body>
    <div id="main_center">
        <div id="left"></div>
        <div class="right"></div>
        <div class="clear"></div>
    </div>
</body>

Aşağıdaki bağlantı, kalan alan kapsama sorununu çözmesi gereken eylem halindeki kodu içerir.

jsFiddle


1

Merkezde sabit bir genişlik div ve her iki tarafta da bir akışkan genişlik divine ihtiyacım olan karşıt soruna bir çözüm arıyordum, bu yüzden aşağıdakileri buldum ve birinin ihtiyacı olursa diye buraya göndereceğimi düşündüm.

#wrapper {
  clear: both;
  width: 100%;
}

#wrapper div {
  display: inline-block;
  height: 500px;
}

#center {
  background-color: green;
  margin: 0 auto;
  overflow: auto;
  width: 500px;
}

#left {
  float: left;
}

#right {
  float: right;
}

.fluid {
  background-color: yellow;
  width: calc(50% - 250px);
}
<div id="wrapper">
  <div id="center">
    This is fixed width in the centre
  </div>
  <div id="left" class="fluid">
    This is fluid width on the left
  </div>
  <div id="right" class="fluid">
    This is fluid width on the right
  </div>
</div>

#centerÖğenin genişliğini değiştirirseniz, genişlik özelliğini şu şekilde güncellemeniz gerekir .fluid:

width: calc(50% - [half of center width]px);
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.