2009-02-10 13 views
7

Come posso modificare questo:CSS: tre colonne problema layout

<div style="border: solid 1px red; text-align: center"> 
    <div style="background-color: yellow; float: left">left</div> 
    middle 
    <div style="float:right; background-color: yellow">right</div> 
</div> 

in modo che "destra" è in linea verticale con "sinistra"?

Ecco ciò che il mio male css assomiglia resa:

left     middle 
              right 

grazie!

+0

Così si vuole proprio sopra o al di sotto di sinistra? Non sono sicuro di aver capito la domanda. Hai una foto? –

+0

Li voglio entrambi sullo stesso livello in verticale, quindi assomiglierebbe a: | right | middle | left |, all in a row. – morgancodes

risposta

21

Se si utilizza un ‘float: right’, ne fanno la prima cosa sulla linea:

<div style="border: solid 1px red; text-align: center"> 
    <div style="float:right; background-color: yellow">right</div> 
    <div style="background-color: yellow; float: left">left</div> 
    middle 
</div> 

Altrimenti si cade sempre nella prossima riga di testo.

ma perché !!!!!

(1) Perché una volta che hai iniziato a inserire il testo statico su una linea, hai una larghezza indeterminata per adattarla a un elemento fluttuato. Diciamo che ha scritto:

abc abc abc <div style="float: left">xyz xyz</div> abc abc abc 

Ora immaginate di iniziare il ridimensionamento quella finestra verso il basso in modo che “abc abc abc” appena si inserisce sulla prima riga. Ora incontri un float e provi ad includerlo sulla linea in cui ti trovi. Ma non va bene: per adattarlo, dovresti avere "abc xyz xyz" sulla linea, facendo scorrere il rimanente "abc" alla riga successiva. Ma! Ora hai spostato il punto di inserimento del float lungo una linea, quindi il galleggiante deve scendere anche una linea. Ma! Ora la prima riga non è avvolta correttamente, perché c'è spazio per tre "abc", ma la linea è stata chiusa prematuramente per far posto a un float che si verifica effettivamente più in basso nella pagina ...

Lo standard CSS risolve questa empasse logica facendo un float su una linea con testo inline prima di aspettare la riga successiva.

(2) Perché questo è ciò che Netscape ha fatto con <img float="right"> molti, molti anni fa.

+0

dolce. Grazie. ma perché!!!!!! così strano! – morgancodes

+0

L'ordine dei tuoi contenuti è importante? – MrChrister

+0

Pensa questo: 1) i float sono "fuori dal flusso" 2) il testo "in flusso" sposta la penna verso il basso in modo che la riga successiva vada al di sotto della riga precedente. 3) gli elementi "fuori flusso" sono posizionati usando la posizione corrente della penna. È più complesso di così, ma per i principianti ... –

0

"middle" ha bisogno di essere in un div a sé stante o può buttare fuori il vostro display

+0

grazie. questo non lo risolve.

left
middle
Se lascio il div "medio" a sinistra, quindi perdo il centraggio. – morgancodes

0

Aggiornato:

<div style="border: solid 1px red; text-align: center"> 
    <div style="background-color: yellow; float: left">left</div> 
    <div style="float:right" background-color: yellow">right</div> 
    <div style="float:none">middle</div> 
</div> 
+0

ugh. Non c'è un modo più ordinato? Grazie nonostante il mio "ugh". – morgancodes

+0

in realtà, questo non funziona. Voglio che "left" e "right" siano sulla stessa linea di base, non impilati. – morgancodes

1

Fai middle un div, galleggiare a sinistra e specificare larghezze per tutti tre contenitori. Inoltre, puoi rendere l'ambiente circostante divoverflow: auto, altrimenti collasserà su se stesso.

0

provare qualcosa del genere:

<div style="border: solid 1px red; text-align: centerl width:100px"> 
      <div style="background-color: yellow; float: left; width:30px">left</div> 
      <div style="background-color: yellow; float: left; width:30px">middle</div> 
      <div style="background-color: yellow; float: left; width:30px">right</div> 
</div> 
+1

larghezze assolute non è l'ideale. Il mio "basta usare un tavolo" prurito sta cominciando a divampare! – morgancodes

+0

Quando si lavora con i float, normalmente è necessario utilizzare larghezze specifiche, in modo che tutto galleggi l'uno accanto all'altro piacevolmente a –

3

ho ottenuto quello che vi serve *:

<table style='border: 1px solid red; width: 100%; border-collapse: collapse;'> 
    <tr> 
    <td style='background-color: yellow; width: 25%;'>left</td> 
    <td style='text-align: center;'>middle</td> 
    <td style='background-color: yellow; width: 25%; text-align: right;'>right</td> 
    </tr> 
</table> 

Thank Me Later!

* disclaimer: Sono solo al 95% serio.

+0

@paolo, vedere il mio commento a Dreas Grech. Voglio fare le cose nel modo "giusto", ma è COSÌ DURO. – morgancodes

+0

Lo so. Ecco perché l'ho suggerito. Sto scherzando e mezzo serio. A volte devi solo cedere. So cosa vuoi dire, però. –

+0

Penso che per alcuni casi (pochissimi) valga la pena usare le tabelle per il layout, le 3 colonne sono una di queste. – mbillard

0

Per eseguire ciò che si sta tentando di fare, è necessario posizionare la colonna destra prima della colonna centrale.

<div style="border: solid 1px red; text-align: center"> 
     <div style="background-color: yellow; float: left">left</div> 
     <div style="float:right; background-color: yellow">right</div> 
     middle 
</div> 

Perché la colonna destra è posizionata relativamente al suo contesto che è una linea sotto il contenuto centrale.

2

Questo funziona senza ri-organizzare l'ordine dei contenuti

<style type="text/css"> 
    .column 
    { 
    float: left; 
    width:33.3%; 
    } 

    #container 
    { 
    text-align: center; 
    width:100%; 
    } 

    .clearfix 
    { 
    display: inline-block; 
    } 
</style> 
<div id="container" class="clearfix"> 
     <div class="column">left</div> 
     <div class="column">middle</div> 
     <div class="column">right</div> 
</div> 

Si può anche cadere il 33% e renderli rappresentativi del vostro disegno, o anche fare una larghezza fissa sulle colonne. In questa causa, utilizza gli ID anziché le classi.