Due elementi inline-block, ciascuno del 50% di larghezza, non si adattano fianco a fianco in una singola fila


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle: http://jsfiddle.net/5EcPK/

Il codice sopra sta cercando di posizionare il div #left e il div #right, fianco a fianco, in una singola riga. Ma come puoi vedere nell'URL JSFiddle sopra, non è questo il caso.

Sono in grado di risolvere il problema riducendo la larghezza di uno dei div al 49%. Vedi http://jsfiddle.net/mUKSC/ . Ma questa non è una soluzione ideale perché appare un piccolo spazio tra i due div.

Un altro modo in cui sono in grado di risolvere il problema è fluttuare entrambi i div. Vedi http://jsfiddle.net/VptQm/ . Funziona bene.

Ma la mia domanda originale rimane. Perché quando entrambi i div sono mantenuti come elementi inline-block, non si adattano fianco a fianco?

Risposte:


140

Quando si utilizzano inline-blockelementi, ci sarà sempre un whitespace problema tra questi elementi (lo spazio è largo circa 4 px).

Quindi, i tuoi due divs, che hanno entrambi il 50% di larghezza, più quello whitespace(~ 4px) è più del 100% di larghezza, e quindi si rompe. Esempio del tuo problema:


Ci sono alcuni modi per risolverlo:

1. Nessuno spazio tra questi elementi

2. Utilizzo di commenti HTML

3. Impostare i genitori font-sizesu 0, quindi aggiungere un valore agli inline-blockelementi

4. Utilizzo di un margine negativo tra di loro ( non preferibile )

5. Caduta dell'angolo di chiusura

6. Saltare alcuni tag di chiusura HTML (grazie @thirtydot per il riferimento )


Riferimenti:

  1. Combattere lo spazio tra elementi di blocco in linea su trucchi CSS
  2. Rimuovi spazi vuoti tra elementi inline-block di David Walsh
  3. Come rimuovere lo spazio tra gli elementi inline-block?

Come @ MarcosPérezGude detto , il miglior modo è quello di utilizzare rem, e aggiungere un po valore predefinito per font-sizeil htmltag (come in HTML5Boilerplate ). Esempio:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

Aggiornamento : poiché è quasi il 2018, usa flexbox o, ancora meglio, layout a griglia CSS .


3
@hoosierEE che non è nosense. Lo spazio tra gli elementi va bene, è perché gli elementi inline-block si posizioneranno sulla riga di testo. Se metti uno spazio in una riga, ci sarà uno spazio. Quindi il comportamento è corretto, anche se pensi che sia un problema (come Vucko lo chiama sbagliato).
Marcos Pérez Gude

2
Sono d'accordo con @ MarcosPérezGude, questo comportamento è corretto. Come puoi vedere dal mio post, ci sono alcuni modi per rimuovere quello spazio bianco (io stesso uso i commenti HTML per rimuovere lo spazio bianco). Ma se si mente quello spazio bianco, si può sempre usare flexbox, table/table-row/table-cello l'uso float.
Vucko

2
Uso perfettamente i blocchi in linea. Il mio approccio normale è parent { font-size:0; } child {font-size: 1rem; }. Con Rems ora è più facile
Marcos Pérez Gude

è un po 'fastidioso che le schede siano ancora analizzate come spazi. Non ho mai visto che l'eliminazione della correzione del tag di chiusura prima d'ora, ha instabilità o effetti collaterali?
MintWelsh

Assicurati anche che bordersia spento. Questo può aggiungere spazio se stai facendo fluttuare i div.
evolross

23

una buona risposta in css3 è:

white-space: nowrap;

nel nodo genitore e:

white-space: normal;
vertical-align: top;

in div (o altro) al 50%

esempio: http://jsfiddle.net/YpTMh/19/

MODIFICARE:

c'è un altro modo con:

font-size: 0;

per il nodo padre e sovrascriverlo nel nodo figlio


7

È perché lo spazio tra i tuoi due div viene interpretato come uno spazio. Se metti i <div>tag in linea come mostrato di seguito, il problema viene risolto :

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


4

O falli bloccare invece che inline-block. Questo renderà i div ignorando gli spazi tra di loro.

display:block;

o rimuovi lo spazio tra i tag

<div id='left'></div><div id='right'></div>

o aggiungi

margin: -1en;

a uno dei div in modo da mitigare lo spazio occupato dal singolo spazio renderizzato.


2

Si prega di controllare sotto il codice:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>



1

Può essere fatto aggiungendo il css display: inline al div che contiene gli elementi inline.

Durante la rimozione dello spazio bianco utilizzando un margine con un valore negativo, diventa necessario aggiungerlo a questo particolare elemento. Poiché l'aggiunta a una classe influirà sui luoghi in cui è stata utilizzata questa classe.

Quindi sarebbe più sicuro usare display: inline;


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.