Vantaggi dell'utilizzo di display: inline-block vs float: lasciato in CSS


127

Normalmente, quando vogliamo avere multipli DIVsdi fila, usiamo float: left, ma ora ho scoperto il trucco didisplay:inline-block

Link di esempio qui . Mi sembra che display:inline-blocksia un modo migliore di align DIVsseguito, ma ci sono degli svantaggi? Perché questo approccio è meno popolare del floattrucco?


@Moak Quella particolare domanda riguarda inlineno inline-block. Ma il primo in relazione è buono: stackoverflow.com/a/11823622/918414
ThinkingStiff


2
link di esempio non funzionante
information_interchange

Risposte:


156

In 3 parole: inline-blockè meglio.

Blocco in linea

L'unico inconveniente display: inline-blockdell'approccio è che in IE7 e sotto un elemento può essere visualizzato solo inline-blockse era già inlinedi default. Ciò significa che invece di utilizzare un <div>elemento devi usare un <span>elemento. Non è affatto un grosso svantaggio perché semanticamente a <div>è per dividere la pagina mentre a <span>è solo per coprire un arco di una pagina, quindi non c'è un'enorme differenza semantica. Un enorme vantaggio display:inline-blockè che quando altri sviluppatori mantengono il tuo codice in un secondo momento, è molto più ovvio cosa display:inline-blocke text-align:right sta cercando di realizzare rispetto a un'istruzione float:lefto float:right. Il mio vantaggio preferita del inline-blockmetodo è che è facile da usare vertical-align: middle, line-heightetext-align: centercentrare perfettamente gli elementi, in modo intuitivo. Ho trovato un ottimo post sul blog su come implementare il blocco inline tra browser, sul blog di Mozilla . Ecco la compatibilità del browser .

Galleggiante

Il motivo per cui l'uso del floatmetodo non è adatto al layout della tua pagina è perché la floatproprietà CSS era originariamente concepita solo per avere il testo a capo intorno a un'immagine (stile rivista) e, per progettazione, non è più adatta per scopi di layout di pagina generali. Quando si modificano elementi fluttuati in un secondo momento, a volte si verificano problemi di posizionamento perché non si trovano nel flusso di pagine . Un altro svantaggio è che in genere richiede un clearfix altrimenti potrebbe rompere gli aspetti della pagina. Il clearfix richiede l'aggiunta di un elemento dopo gli elementi flottanti per impedire al loro genitore di collassare attorno a loro che attraversa la linea semantica tra lo stile di separazione dal contenuto ed è quindi un anti-modello nello sviluppo web .

Eventuali problemi di spazio bianco menzionati nel link sopra potrebbero essere facilmente risolti con la white-spaceproprietà CSS.

Modificare:

SitePoint è una fonte molto credibile di consulenza sul web design e sembrano avere la stessa opinione che io faccio:

Se non conosci i layout CSS, ti verrebbe il perdono di pensare che usare CSS fluttuanti in modi fantasiosi sia l'apice dell'abilità. Se hai consumato quanti tutorial di layout CSS puoi trovare, potresti supporre che padroneggiare i float sia un rito di passaggio. Sarai abbagliato dall'ingegnosità, stupito dalla complessità e otterrai un senso di realizzazione quando finalmente capirai come funzionano i galleggianti.

Non farti ingannare. Ti viene fatto il lavaggio del cervello.

http://www.sitepoint.com/give-floats-the-flick-in-css-layouts/

Aggiornamento 2015 - Flexbox è una buona alternativa per i browser moderni :

.container {
  display: flex; /* or inline-flex */
}

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Ulteriori informazioni

Aggiornamento del 21 dicembre 2016

Bootstrap 4 sta rimuovendo il supporto per IE9 e quindi sta eliminando i float dalle file e sta diventando pieno Flexbox.

Richiesta pull # 21389


4
"clearfix" è solo un nome; la "correzione" indica la correzione di aspettative errate e / o l'implementazione errata del browser. Sono (felicemente) d'accordo sul fatto che ci siano alternative al floating / clearing, ma non c'è nulla di intrinsecamente rotto o riparato al riguardo.
Tim Medora

10
@Alex - Esiste un modo non complicato e compatibile con più browser per rimuovere lo spazio bianco tra elementi di blocco inline che si trovano su linee separate? Vorrei poter smettere di usare i float ma i migliori collegamenti che ho trovato su questo problema ( qui e qui ) sono insoddisfacenti. Citi la white-spaceproprietà - potresti spiegarlo?
antinome,

3
@Alex - grazie, è fantastico, ma trovo ancora l'approccio float-with-modern-clearfix un po 'più mantenibile, perché non si romperà se un giorno mi capiti di personalizzare letter-spacingaltrove nel mio CSS.
antinome,

1
perché il bootstrap sta ancora usando float per il suo sistema a griglia? Quelli non sono layout?
AzDesign,

2
Tieni presente che il blocco in linea aggiunge uno spazio bianco attorno agli elementi. Se lo stai usando per una griglia o non vuoi questo spazio bianco, dovrai aggiungere ulteriori hack di stile / HTML per tener conto di questo. Vedi: css-tricks.com/fighting-the-space-between-inline-block-elements/…
kretzm

23

Anche se concordo sul fatto che in generale inline-blockè meglio, c'è un'altra cosa da tenere in considerazione se si utilizzano larghezze percentuali per creare una griglia reattiva (o se si desidera larghezze pixel perfette):

Se stai utilizzando inline-blockgriglie con larghezza totale del 100% o quasi del 100%, devi assicurarti che il markup HTML non contenga spazi bianchi tra le colonne .

Con i float, questo non è qualcosa di cui devi preoccuparti: le colonne galleggiano su qualsiasi spazio bianco o altro contenuto tra le colonne. Le risposte a questa domanda hanno alcuni buoni consigli su come rimuovere gli spazi bianchi HTML senza rendere brutto il tuo codice .

Se per qualsiasi motivo non riesci a controllare il markup HTML (ad es. Un CMS restrittivo), puoi provare i trucchi descritti qui, oppure potresti dover scendere a compromessi e usare float invece di inline-block. Ci sono anche brutti trucchi CSS che dovrebbero essere usati solo in circostanze estreme, come font-size:0;nel contenitore della colonna, quindi riapplicare la dimensione del carattere all'interno di ogni colonna .

Per esempio:


c'è qualche possibile soluzione per il no-whitespace-between, forse div+(whitespace) {display:none}o qualcosa del genere?
NoBugs,

1
Vedi il terzo paragrafo dopo la sua prima frase ... Vedi in particolare la domanda collegata
user56reinstatemonica8

@NoBugs applica semplicemente la dimensione del carattere: 0; all'elemento contenente, fai attenzione se non hai dimensioni di carattere specifiche impostate su elementi all'interno dei blocchi in linea !!
Jai,

@Jai Esatto, e poiché lo styling / view dovrebbe essere disgiunto dal processo di creazione dell'html / modello, questa è una cattiva pratica. (Che cosa succede se si utilizza un servizio che ti ha dato <div class="inlinething">hi</div> <div class="inlinething">there</div> more content here... ?)
NoBugs

4

Se si desidera allineare i divpixel con precisione, utilizzare float. inline-blocksembra richiedere sempre di tagliare alcuni pixel (almeno in IE)


6
Sì, perché devi evitare di usare gli spazi tra gli elementi perché i blocchi inline tengono conto degli spazi nello stesso modo degli elementi inline. Tieni i tag di blocco in linea ravvicinati e senza problemi con i pixel.
Ben Sinclair,

Anche questa può essere una differenza del browser con il padding / margin predefinito sugli elementi .. Beh, almeno in passato l'ho sempre fatto * {padding:0px; margin:0px; }perché questo aiuta a bilanciare la mia codifica
Angry 84

È questo il motivo per cui Bootstrap (forse altri) lo usano piuttosto che il blocco in linea mi chiedo?
NoBugs,

1

Puoi trovare una risposta approfondita qui .

Ma in generale con floatte devi essere consapevole e prenderti cura degli elementi circostanti e inline-blockun modo semplice per allineare gli elementi.

Grazie


1

C'è una caratteristica del blocco inline che potrebbe non essere semplice però. Ciò significa che il valore predefinito per l'allineamento verticale nei CSS è baseline. Ciò può causare alcuni comportamenti di allineamento imprevisti. Guarda questo articolo

http://www.brunildo.org/test/inline-block.html

Invece, quando fai un float: a sinistra, i div sono indipendenti l'uno dall'altro e puoi allinearli usando il margine facilmente.

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.