Fai un div riempire la larghezza rimanente


88

Come posso fare in modo che un div riempia la larghezza rimanente?

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

Come posso div2riempire il resto?


Per una risposta corretta aggiornata, modificare la risposta migliore selezionata alla risposta di Adrien Be.
edwardtyl

Avevo bisogno del contrario, un div centrale a larghezza fissa e un div esterno fluido. Ho aggiunto una risposta in fondo se qualcun altro ne ha bisogno.
damndaewoo

Risposte:


63

Prova qualcosa di simile:

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

i div occuperanno naturalmente il 100% della larghezza del loro contenitore, non è necessario impostare esplicitamente questa larghezza. Aggiungendo un margine sinistro / destro uguale ai due div laterali, i suoi contenuti sono costretti a stare tra di loro.

Nota che il "div centrale" va dopo il "div destro" nell'HTML


1
Penso di aver trovato una soluzione ancora migliore basata sulla tua (ottima) soluzione :) vedi sotto nella risposta che fornisco
Adrien Be

c'è un modo per farlo senza cambiare l'ordine degli articoli? cioè div sinistro, div medio, div destro. Questo è importante se vuoi fare cose diverse su schermi di dimensioni diverse.
Eliezer Steinbock

Sì, questo ordine di sinistra-destra-metà è davvero il trucco. Non consente al div giusto di non andare sotto i due div, giusto?
Ansjovis86

50

Soluzione aggiornata (ottobre 2014): pronta per layout fluidi


Introduzione:

Questa soluzione è ancora più semplice di quella fornita da Leigh. In realtà è basato su di esso.

Qui puoi notare che l'elemento centrale (nel nostro caso, con "content__middle"classe) non ha alcuna proprietà dimensionale specificata - nessuna larghezza, né padding, né proprietà relativa al margine - ma solo una overflow: auto;(vedi nota 1).

Il grande vantaggio è che ora puoi specificare a max-widthe a min-widthper i tuoi elementi sinistro e destro . Il che è fantastico per i layout fluidi .. quindi layout reattivo :-)

nota 1: rispetto alla risposta di Leigh in cui è necessario aggiungere le proprietà margin-left& margin-rightalla "content__middle"classe.


Codice con layout non fluido:

Qui gli elementi sinistro e destro (con classi "content__left"e "content__right") hanno una larghezza fissa (in pixel): quindi chiamato layout non fluido.

Demo dal vivo su http://jsbin.com/qukocefudusu/1/edit?html,css,output

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

Codice con layout fluido:

Qui gli elementi sinistro e destro (con classi "content__left"e "content__right") hanno una larghezza variabile (in percentuale) ma anche una larghezza minima e massima: da qui chiamata layout fluido.

Demo dal vivo in un layout fluido con le max-widthproprietà http://jsbin.com/runahoremuwu/1/edit?html,css,output

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

Supporto browser

Testato su BrowserStack.com sui seguenti browser web:

  • Da IE7 a 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
Consiglierei a tutti gli sviluppatori di utilizzare questo metodo, soprattutto perché il Responsive Web Design è diventato una necessità. :)
aullah

1
Attento a questo. In alcuni casi la barra di scorrimento apparirà nel div content__middle su Firefox se le altezze non sono accurate a causa di overflow: auto;
Jason,

Ciao Jason, è molto interessante, grazie per averlo fatto notare. Puoi fornire un jsfiddle per mostrare un esempio dal vivo quando ciò accade?
Adrien Be

è questo perché overflowcrea un contesto di formattazione del blocco? avrebbe display: flexlo stesso effetto?
Jayen

1
Sì, lo ha fatto. developer.mozilla.org/en-US/docs/Web/Guide/CSS/… è stato molto utile. overflow-y: hiddenho finito per usarlo in quanto a) consentiva di impostare la larghezza, b) ha il miglior supporto per il browser ec) non era una tabella
Jayen

39

Le scatole flessibili sono la soluzione e sono fantastiche. Ho desiderato qualcosa di simile da CSS per un decennio. Tutto ciò di cui hai bisogno è aggiungere display: flexal tuo stile "Principale" e flex-grow: 100(dove 100 è arbitrario - non è importante che sia esattamente 100). Prova ad aggiungere questo stile (colori aggiunti per rendere visibile l'effetto):

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

Maggiori informazioni sulle scatole flessibili qui: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


Flexbox è fantastico, ma occupa solo lo spazio necessario invece di tutto lo spazio che rimane. Così sono andato con l'overflow: soluzione automatica.
ThinkBonobo

@ThinkBonobo cosa intendi con "esso"? Una scatola flessibile stessa agirà come un "blocco" e gli oggetti all'interno di una scatola flessibile possono sicuramente occupare più spazio di quanto ne richieda.
BT

@BT significa il div centrale principale. È sicuramente una soluzione che funziona per molti casi ma non per il mio caso d'uso particolare.
Think Bonobo

1
@ThinkBonobo Scommetto che potrei farlo funzionare per te se pubblichi un jsFiddle
BT

24

Usa la proprietà CSS Flexbox flex-grow per ottenere ciò.

.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
Migliore risposta tbh. Funziona 4 anni dopo e più pulito rispetto ad altre soluzioni. +1
Harry J

4

Anche se in bitritardo nella pubblicazione di una risposta, ecco un approccio alternativo senza utilizzare i margini.

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

Questo metodo funziona come per magia, ma ecco una spiegazione:) \

Giocherellare con un campione simile qui.


4

Il Div che deve occupare lo spazio rimanente deve essere una classe .. Gli altri div possono essere id (s) ma devono avere larghezza ..

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>

Il seguente collegamento ha il codice in azione, che dovrebbe risolvere il problema di copertura dell'area rimanente.

jsFiddle


1

Stavo cercando una soluzione al problema opposto in cui avevo bisogno di un div di larghezza fissa al centro e un div di larghezza fluido su entrambi i lati, quindi ho pensato di postarlo qui nel caso qualcuno ne avesse bisogno.

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

Se modifichi la larghezza #centerdell'elemento, devi aggiornare la proprietà width di .fluida:

width: calc(50% - [half of center width]px);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.