Come posso mantenere i float CSS in una riga?


216

Voglio avere due elementi sulla stessa riga usando float: leftper l'elemento a sinistra.

Non ho problemi a raggiungerlo da solo. Il problema è che voglio che i due elementi rimangano sulla stessa riga anche quando si ridimensiona il browser in modo molto piccolo . Sai ... come è stato con i tavoli.

L'obiettivo è impedire che l'oggetto sulla destra venga avvolto, qualunque cosa accada .

Come dire al browser che utilizza CSS che preferirei allungare il contenitorediv piuttosto che avvolgerlo in modo che il float: right;div sia al di sotto del float: left; div?

quello che voglio:

                                   \
 +---------------+  +------------------------/
 | float: left;  |  | float: right;          \
 |               |  |                        /
 |               |  |content stretching      \   Screen Edge
 |               |  |the div off the screen  /  <---
 +---------------+  +------------------------\
                                             /

54
Quanto sarebbe bello se StackOverlow aggiungesse un piccolo widget di disegno in modo da poter realizzare questi diagrammi con il mouse? Potrebbe essere più appropriato per i siti SE orientati al design ... ma sarebbe comunque fantastico.
JoeCool

5
@JoeCool Il sito UX SE in realtà ha già uno strumento per creare prototipi. meta.ux.stackexchange.com/questions/1291/…
frank hadder

Risposte:


77

Avvolgi i tuoi float <div>in un contenitore <div>che utilizza questo hack di larghezza minima tra browser:

.minwidth { min-width:100px; width: auto !important; width: 100px; }

Si potrebbe anche essere necessario impostare "troppo pieno", ma probabilmente non.

Questo funziona perché:

  • La !importantdichiarazione, combinata con, fa min-widthsì che tutto rimanga sulla stessa linea in IE7 +
  • IE6 non implementa min-width, ma ha un bug tale che width: 100pxsovrascrive la !importantdichiarazione, causando una larghezza del contenitore di 100px.

Funziona benissimo per due galleggianti, ma non tre. Può funzionare per tre ??
tylerthemiler,

15
L'unico problema è che forza una larghezza minima fissa.
Matt Montag,

6
Questa non è una soluzione, è solo una larghezza minima, quando i tuoi contenuti diventano davvero piccoli (vedi domanda), quindi sotto i 100px hai lo stesso problema. Specialmente con celle di tabella, questo rimane un problema.
Sanne,

Assolutamente scioccante: risolto il mio problema all'istante. Ho affrontato questo problema in un semplice layout bootstrap a due colonne con più caselle di quanti ne possa nominare, ma ha funzionato perfettamente. Grazie per la spiegazione del perché questo lavoro - roba affascinante, dom è.
nocarrier,

Questo potrebbe funzionare con i div, ma l'ho appena testato con ul / li e non funziona :(
AsGoodAsItGets

132

Un'altra opzione è, invece di fluttuare, per impostare la proprietà dello spazio vuoto ora su un div parent:

.parent {
     white-space: nowrap;
}

e azzera lo spazio bianco e usa un display a blocchi in linea in modo che i div rimangano sulla stessa linea ma puoi comunque dargli una larghezza.

.child {
    display:inline-block;
    width:300px;
    white-space: normal;
}

Ecco un JSFiddle: https://jsfiddle.net/9g8ud31o/


4
Sicuramente la migliore soluzione che abbia mai visto. Funziona per il mio caso d'uso, ma mi chiedo quanto sia supportato. Fortunatamente l'uso dei float per TUTTO sta lentamente diventando un ricordo del passato.
Ryan Ore,

1
Puoi spiegare come funziona? o qualche collegamento almeno?
Anirudhan J

4
@AnirudhanJ Non è troppo difficile. Inline-block fa fluire normalmente gli elementi con il testo inline (ma mantiene alcune delle abilità di riempimento / margine del blocco) e letteralmente dite semplicemente al CSS di non avvolgere il testo con lo spazio bianco: opzione nowrap (applicando "normal "di nuovo al bambino, per evitare che si propaghi in tutto)
Brian,

Come si fa a far sì che il div sulla destra fluttui sulla destra dello schermo, però? Questo mette semplicemente due blocchi in linea uno accanto all'altro che non interromperanno la linea.
aggiungi Mart

puoi anche usare la spaziatura tra lettere: -3px (o qualunque valore funzioni per te) per rimuovere lo spazio tra gli elementi del blocco inline. PS: migliore della risposta accettata ;
Claudiu,

15

Avvolgi i tuoi floater in un div con una larghezza minima maggiore della larghezza combinata + margine dei floater.

Non sono necessari hack o tabelle HTML.


10

Soluzione 1:

display: table-cell (non ampiamente supportato)

Soluzione 2:

tavoli

(Odio gli hack.)


8

Un'altra opzione: non fluttuare la colonna di destra; basta dargli un margine sinistro per spostarlo oltre il galleggiante. Avrai bisogno di un paio di hack per correggere IE6, ma questa è l'idea di base.


4

Sei sicuro che gli elementi a livello di blocco fluttuati siano la migliore soluzione a questo problema?

Spesso con difficoltà CSS nella mia esperienza si scopre che il motivo per cui non riesco a vedere un modo di fare ciò che voglio è che sono stato catturato in una visione a tunnel per quanto riguarda il mio markup (pensando "come posso fare questi elementi fanno questo ? ") piuttosto che tornare indietro e guardare a cosa esattamente devo raggiungere e magari rielaborare leggermente il mio HTML per facilitarlo.


bene funziona praticamente per tutto e il layout esistente si basa su di esso, sto solo cercando di risolvere un problema con l'interruzione del layout quando aumenti troppo la dimensione del testo O ridimensiona la finestra del browser più piccola di 700 pixel di larghezza
Jiaaro

2

consiglierei di usare le tabelle per questo problema. sto riscontrando un problema simile e fintanto che la tabella viene utilizzata solo per visualizzare alcuni dati e non per il layout della pagina principale, va bene.


2

Aggiungi questa linea al selettore di elementi fluttuanti

.floated {
    float: left;
    ...
    box-sizing: border-box;
}

Impedirà di aggiungere imbottitura e bordi alla larghezza, quindi l'elemento rimane sempre in fila, anche se hai ad es. tre elementi con una larghezza del 33.33333%


0

Quando l'utente riduce le dimensioni della finestra in orizzontale e questo fa sì che i float si impilino verticalmente, rimuovili e sul secondo div (che era un float) usa margin-top: -123px (il tuo valore) e margin-left: 444px (il tuo valore) per posiziona i div come sono apparsi con i float. Se fatto in questo modo, quando la finestra si restringe, il div del lato destro rimane in posizione e scompare quando la pagina è troppo stretta per includerla. ... che (per me) è meglio che avere il div sul lato destro "salta" sotto il div sul lato sinistro quando la finestra del browser viene ristretta dall'utente.


-3

Il modo in cui mi sono comportato è stato usare un po 'di jQuery. La ragione per cui l'ho fatto in questo modo era perché A e B erano larghezze percentuali.

HTML:

<div class="floatNoWrap">
    <div id="A" style="float: left;">
        Content A
    </div>
    <div id="B" style="float: left;">
        Content B
    </div>
    <div style="clear: both;"></div>
</div>

CSS:

.floatNoWrap
{
    width: 100%;
    height: 100%;
}

jQuery:

$("[class~='floatNoWrap']").each(function () {
    $(this).css("width", $(this).outerWidth());
});

1
Un framework per CSS? Devo -jquery per TUTTE le ricerche JavaScript e, a causa di un completo e totale disprezzo per la qualità, dobbiamo iniziare a cercare esplicitamente anche CSS con -jquery? Fallo nel modo giusto o non farlo affatto.
Giovanni,
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.