CSS due div uno accanto all'altro


230

Voglio mettere due <div>s uno accanto all'altro. La destra <div>è di circa 200 px; e la sinistra <div>deve riempire il resto della larghezza dello schermo? Come posso fare questo?

Risposte:


421

Puoi usare la flexbox per disporre i tuoi oggetti:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Questo è fondamentalmente solo raschiare la superficie del flexbox. Flexbox può fare cose incredibili.


Per il supporto del browser precedente, è possibile utilizzare il float CSS e le proprietà di larghezza per risolverlo.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
Questa è in realtà la risposta corretta, è concisa e - a differenza delle due attualmente sopra - è completamente autonoma. Le migliori risposte su SO dovrebbero essere proprio così, IMO. +1
Bobby Jack

float:leftVuoi elaborare perché la sinistra deve essere ? Il tuo commento alla mia risposta dice "il div di lft è richiesto in tutta l'area sinistra", ma float:leftfarà sì che il contenuto sia avvolto strettamente.
falstro,

14
Questa risposta non è del tutto corretta ed è piuttosto sconvolgente vederla così votata. Questo crea un layout che è molto instabile. Vorrei consigliare di inserire i due div in un contenitore e di utilizzare la proprietà display: inline-block per allineare i div, come suggerito da alcune delle altre risposte. Non sto criticando nessuno, dato che siamo tutti qui per aiutarci a vicenda, quindi oltre alla mia selezione, grazie MN per il tuo contributo a questa comunità.
Mussser,

1
Ma una cosa da notare è che il blocco inline non funzionerà nelle versioni precedenti di IE ...
Mussser

3
@Mussser Sono d'accordo con il tuo commento, ma tieni presente che questa risposta arriva dal 2009 ... un tempo in cui quelle che tu chiami "versioni precedenti di Ie" (cioè: IE8 e sotto) erano versioni "attuali" di IE ...
Laurent S.

139

Non so se questo è ancora un problema attuale o no, ma ho appena riscontrato lo stesso problema e ho usato il display: inline-block;tag CSS . Avvolgendoli in un div in modo che possano essere posizionati in modo appropriato.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Si noti che l'uso dell'attributo di stile inline è stato usato solo per la succinta di questo esempio, ovviamente questi sono stati spostati in un file CSS esterno.


1
Questa è stata la soluzione per me. Volevo due div adiacenti come [] [] (amico, è da un po 'che non lo faccio ..) =) kudos.
Partack,

Anche questo ha funzionato per me. Ho avuto dei problemi con un altro float: div destra che spingeva la mia colonna destra in basso sotto quella sinistra, quindi ho anche fatto in modo che il contenitore usasse display: inline-block, e questo 'risolto.
Martin Carney

5
Questo non funziona quando il contenuto è di grandi dimensioni in DIV Content1. Il risultato è che i DIV si trovano su due linee separate anziché affiancate.
Richard Hollis,

@RichardHollis Sono stato in grado di impostare la widthproprietà di tutti i miei 2 div uno accanto all'altro per evitare di avvolgere il secondo su una nuova linea.
Trindaz,

1
aggiungi il css vertical-align: top; anche a entrambi, altrimenti si spingeranno a vicenda se la lunghezza del contenuto differisce
prospetto

27

Sfortunatamente, questa non è una cosa banale da risolvere per il caso generale. La cosa più semplice sarebbe aggiungere una proprietà in stile css "float: right;" al tuo div 200px, tuttavia, ciò causerebbe anche che il tuo "main" -div fosse effettivamente a tutta larghezza e qualsiasi testo in esso fluttuasse attorno al bordo del 200px-div, che spesso sembra strano, a seconda del contenuto (praticamente in tutti i casi tranne se si tratta di un'immagine mobile).

EDIT: Come suggerito da Dom, il problema del wrapping potrebbe ovviamente essere risolto con un margine. Sciocco me


1
'float: left' sarà più adatto, il div lft è richiesto per l'intera area sinistra. Nessun reato significava, basta considerare.
MN,

19

Il metodo suggerito da @roe e @MohitNanda funziona, ma se il div giusto è impostato come float:right;, allora deve venire prima nel sorgente HTML. Ciò interrompe l'ordine di lettura da sinistra a destra, il che potrebbe creare confusione se la pagina viene visualizzata con gli stili disattivati. In tal caso, potrebbe essere meglio utilizzare un div wrapper e un posizionamento assoluto:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

dimostrato:

sinistra destra

Modifica: Hmm, interessante. La finestra di anteprima mostra i div formattati correttamente, ma l'elemento del post renderizzato no. Scusate allora, dovrete provarlo da soli.


15

Ho riscontrato questo problema oggi. Sulla base delle soluzioni sopra, ha funzionato per me:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Basta fare in modo che il div parent si estenda per l'intera larghezza e fluttui i div contenuti all'interno.


8

AGGIORNARE

Se è necessario posizionare elementi in una riga, è possibile utilizzare Flex Layout . Ecco un altro tutorial Flex . È un ottimo strumento CSS e anche se non è compatibile al 100%, ogni giorno il suo supporto sta migliorando. Funziona così come:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

E quello che ottieni qui è un contenitore con una dimensione totale di 4 unità, che condividono lo spazio con i suoi figli in una relazione di 1/4 e 3/4.

Ho fatto un esempio in CodePen che risolve il tuo problema. Spero possa essere d'aiuto.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

MOLTO VECCHIO

Forse questa è solo una sciocchezza, ma hai provato con un tavolo? Non utilizza direttamente CSS per posizionare i div, ma funziona benissimo.

Puoi creare una tabella 1x2 e metterti divsdentro, quindi formattare la tabella con CSS per inserirli come desideri:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Nota

Se vuoi evitare di usare la tabella, come detto prima, puoi usare float: left;e float: right;e nel seguente elemento, non dimenticare di aggiungere un clear: left;, clear: right;o clear: both;per avere la posizione pulita.


Le tabelle sono una soluzione molto più prevedibile del "float" in continua evoluzione, che sembra sempre incasinare qualcosa quando si aggiungono o rimuovono elementi.
Kokodoko,

Questa è un'ottima soluzione se lavori con le e-mail.
Zac Clancy,

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Questo funzionerà OK finché impostato clear: bothper l'elemento che separa questo blocco di due colonne.


3
Quando si utilizzano float, è necessario impostare la proprietà width. Quindi non penso che questa sia una buona soluzione ..
Martijn,

4

Ho riscontrato lo stesso problema e la versione di Mohits funziona. Se vuoi mantenere il tuo ordine da sinistra a destra nell'html, prova questo. Nel mio caso, il div sinistro sta regolando la dimensione, il div destro rimane alla larghezza di 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

Il trucco è usare un'imbottitura giusta sulla scatola principale ma usare di nuovo quello spazio posizionando di nuovo la scatola giusta con margine destro.


Non riesco a farlo funzionare senza float: proprio in .right.
Jussi Palo,

3

Uso una miscela di float e overflow-x: hidden. Codice minimo, funziona sempre.

https://jsfiddle.net/9934sc4d/4/ - PLUS non è necessario cancellare il galleggiante!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
È utile quando conosci l'altezza del div e sai che il contenuto non è più lungo di questa altezza. Tuttavia, quando c'è più contenuto dell'altezza del div, è nascosto, a causa del troppo pieno ...
Martijn

1
È davvero meglio :)
Martijn,

1
Bello! è bello vedere le persone nutrire il sostegno con feedback utili e positivi, piuttosto che feedback negativi non costruttivi. Good man @Martijn
Tony Ray Tansley,

Grazie per questo. Faccio la maggior parte del mio lavoro di interfaccia utente in React Native e flex box funziona molto meglio lì che in HTML + CSS (secondo me). Questo ha reso la mia vita molto più semplice.
Eric Wiener,

2

Come tutti hanno sottolineato, lo farai impostando a float:right;sul contenuto RHS e un margine negativo su LHS.

Tuttavia .. se non usi float: left;a sull'LHS (come fa Mohit) otterrai un effetto graduale perché il div LHS consumerà ancora lo spazio marginato nel layout.

Tuttavia .. il float LHS ridurrà il contenuto, quindi dovrai inserire un childnode a larghezza definita se questo non è accettabile, a quel punto potresti aver definito la larghezza sul genitore.

Tuttavia .. come sottolinea David, è possibile modificare l'ordine di lettura del markup per evitare i requisiti del float LHS, ma ciò presenta problemi di leggibilità e probabilmente di accessibilità.

Tuttavia .. questo problema può essere risolto con float con qualche markup aggiuntivo

(avvertenza: non approvo il div .clearing in quell'esempio, vedi qui per i dettagli)

Tutto considerato, penso che la maggior parte di noi vorrebbe che ci fosse una larghezza non avida: rimanere in CSS3 ...


2

Questa non sarà la risposta per tutti, dal momento che non è supportata in IE7-, ma potresti usarla e quindi utilizzare una risposta alternativa per IE7-. È display: tabella, display: tabella-riga e display: tabella-cella. Nota che questo non sta usando le tabelle per il layout, ma lo styling dei div in modo che le cose si allineino bene senza tutta la seccatura dall'alto. La mia è un'app html5, quindi funziona alla grande.

Questo articolo mostra un esempio: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Ecco come apparirà il tuo foglio di stile:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

Per parafrasare uno dei miei siti Web che fa qualcosa di simile:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
Non io, ma immagino gli hack CSS, il doctype di transizione o la mancanza di spiegazioni?
annakata,

Almeno aveva un doctype :) Immagino che potrebbe non piacere agli hack del browser per i margini su IE. Almeno l'ho provato ...
Rowland Shaw,

È troppo confuso. Ci sono molte soluzioni là fuori che sono molto più concise.
John Bell,

@JohnBell forse questo è il problema con il tempo - era una soluzione ragionevole al momento (oltre 8 anni fa), ma da allora la tecnologia del browser è andata avanti. Stranamente alcune delle altre risposte contemporanee alla mia che propongono la stessa idea segnata meglio (come quella di David, due minuti dopo la mia)
Rowland Shaw,

-7

basta usare un indice z e tutto andrà bene. assicurarsi di avere le posizioni contrassegnate come fisse o assolute. quindi nulla si muoverà come con un tag float.

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.