Due div, uno a larghezza fissa, l'altro, il resto


97

Ho due contenitori div.

Anche se uno deve essere di una larghezza specifica, devo regolarlo, in modo che l'altro div occupi il resto dello spazio. C'è un modo per farlo?

.left {
    float: left;
    width: 83%;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    margin-right: 10px;
    overflow: auto;
}

.right {
    float: right;
    width: 16%;
    text-align: right;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    height: 100%;
    overflow: auto;
}
<div class="left"></div>
<div class="right"></div> <!-- needs to be 250px -->


4
Non utilizzare hack decennali per browser antichi. Scorri verso il basso per una moderna soluzione flexbox.
Evgeny

1
Prima di seguire il collegamento di Evgeny, considera i browser che i tuoi utenti utilizzano effettivamente, piuttosto che i browser che avresti voluto che usassero. Flexbox non renderà bene su IE 9 del tuo professore: caniuse.com/#feat=flexbox
duhaime

@duhaime IE9 ha un utilizzo globale dello 0,13%
Evgeny

Quindi 1 utente su 1000 ...
duhaime

Risposte:


127

Vedi: http://jsfiddle.net/SpSjL/ (regola la larghezza del browser)

HTML:

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

CSS:

.left {
    overflow: hidden;
    min-height: 50px;
    border: 2px dashed #f0f;
}

.right {
    float: right;
    width: 250px;
    min-height: 50px;
    margin-left: 10px;
    border: 2px dashed #00f;
}

Puoi anche farlo con display: table, che di solito è un approccio migliore: come posso mettere un elemento di input sulla stessa riga della sua etichetta?


4
Non funziona con me. La sinistra sta andando al 100% di larghezza e la destra è 250px. Due righe :(
sopportare il

19
Devi scambiare l'ordine delle divs, come nella mia risposta e nella mia demo. rightallora left.
trenta punti

1
Nel complesso questo funziona per me, ma a volte quando ho del testo nel div sinistro invece di andare a capo alla riga successiva (e c'è spazio) è semplicemente tagliato a destra (dove inizia il div destro). Come posso fare in modo che il testo vada a capo nel div sinistro?
Guy

1
DIV non flottante riempie l'intera larghezza. Cattiva idea quando il contenuto è più alto del DIV mobile o il testo è troppo lungo.
netAction

47

È il 2017 e il modo migliore per farlo è usare flexbox, che è compatibile con IE10 + .

.box {
  display: flex;
}

.left {
  flex: 1;  /* grow */
  border: 1px dashed #f0f;
}

.right {
  flex: 0 0 250px; /* do not grow, do not shrink, start at 250px */
  border: 1px dashed #00f;
}
<div class="box">
  <div class="left">Left</div>
  <div class="right">Right 250px</div>
</div>


1
il tuo commento sulla domanda mi ha salvato dal tentativo di supportare IE6. Grazie!
Mike Davlantes

Anche questo è un bene, ma calc () è molto meglio di flex grazie alla compatibilità con IE9 e Chrome 26.
Don Dilanga

Questo ha funzionato bene per me. Non era nemmeno necessario definire la larghezza .right.
rotaercz

1
Mi uccide che nel 2017/2018/2019 riceviamo ancora commenti sulla falsariga di BEWARE OF IE 9.
Mike Devenney

43

È possibile utilizzare la funzione calc () dei CSS.

Demo: http://jsfiddle.net/A8zLY/543/

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

.left {
height:200px;
width:calc(100% - 200px);
background:blue;
float:left;
}

.right {
width:200px;
height:200px;
background:red;
float:right;   
}

Spero che questo ti aiuti !!


grazie per il consiglio. Ho verificato la compatibilità tra i browser, ed è un po 'alta per un utilizzo stabile
Farside

1
Questa dovrebbe essere selezionata come la risposta migliore, perché in questa risposta i tag DIV non vengono scambiati come nella risposta migliore.
Don Dilanga

14

Se puoi invertire l'ordine nel codice sorgente, puoi farlo in questo modo:

HTML:

<div class="right"></div> // needs to be 250px    
<div class="left"></div>

CSS:

.right {
  width: 250px;
  float: right;
}   

Un esempio: http://jsfiddle.net/blineberry/VHcPT/

Aggiungi un contenitore e puoi farlo con il tuo attuale ordine del codice sorgente e il posizionamento assoluto:

HTML:

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

CSS:

#container {
  /* set a width %, ems, px, whatever */
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  right: 250px;
}

.right {
  position: absolute;
  background: red;
  width: 250px;
  top: 0;
  right: 0;
}

Qui, il .leftdiv ottiene una larghezza implicitamente stabilito dai top, lefte rightstili che permette di riempire lo spazio rimanente in #container.

Esempio: http://jsfiddle.net/blineberry/VHcPT/3/


Il primo esempio non sembra funzionare realmente. Il div .left in jsFiddle è in realtà l'intera larghezza dello schermo. Se entrambi i div hanno la stessa altezza, allora ottimo, ma in questo caso aggiungi solo 5px padding a .left e vedrai.
user3413723

1
La seconda soluzione però ha funzionato benissimo per me. Genio!
user3413723

6

Se puoi avvolgerli in un contenitore <div>puoi usare il posizionamento per <div>ancorare la sinistra a left:0;right:250px, guarda questa demo . Dirò ora che questo non funzionerà in IE6 poiché solo un angolo di a <div>può essere posizionato in modo assoluto su una pagina ( vedi qui per una spiegazione completa).


3

1- Avere un div wrapper, impostare il padding e il margine come preferisci
2- Rendi il div del lato sinistro la larghezza di cui hai bisogno e
fallo fluttuare a sinistra 3- Imposta il margine div del lato destro uguale alla larghezza del lato sinistro

.left
{
    ***width:300px;***
    float: left;
    overflow:hidden;

}

.right
{
    overflow: visible;
    ***margin-left:300px;***
}



<div class="wrapper">
    <div class="left">
        ...
    </div>

    <div class="right" >
        ...
    </div>

</div>

Spero che questo funzioni per te!



1

imposta il tuo diritto alla larghezza specifica e fallo fluttuare, alla tua sinistra imposta semplicemente il margine destro a 250px

.left {
vertical-align: middle;
min-height: 50px;
margin-right: 250px;
overflow: auto

}

.right {
width:250px;
text-align: right;
display: table-cell;
vertical-align: middle;
min-height: 50px;
height: 100%;
overflow: auto
}

uccidi il tipo di display in .right e assicurati di non avere un'impostazione chiara da nessuna parte che potrebbe influenzare .left
meteorainer

hai qualche tipo di div wrapper? C'è qualcosa online che posso ispezionare o è totalmente locale?
meteorainer

È completamente locale, tuttavia, lasciami provare a metterlo su jsfiddle.
reca il

haha, hai rimosso il tuo galleggiante: giusto. Inoltre, non dimenticare di tenere conto delle larghezze dei bordi, quindi se hai intenzione di lasciarle sottrai le larghezze da una delle larghezze div.
meteorainer

0

Se hai bisogno di una soluzione cross browser, puoi usare il mio approccio, chiaro e facile.

.left{
        position: absolute;
        height: 150px;
        width:150px;
        background: red;
        overflow: hidden;
        float:left;
}
.right{
        position:relative;
        height: 150px;
        width:100%;
        background: red;
        margin-left:150px;
        background: green;
        float:right;
}

-1

Usa il semplice questo può aiutarti

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
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.