Dwa elementy inline-block, każdy o szerokości 50%, nie pasują obok siebie w jednym rzędzie


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/

Powyższy kod próbuje umieścić elementy div #left i div #right obok siebie w jednym wierszu. Ale jak widać na powyższym adresie URL JSFiddle, tak nie jest.

Jestem w stanie rozwiązać ten problem, zmniejszając szerokość jednego z elementów div do 49%. Zobacz http://jsfiddle.net/mUKSC/ . Nie jest to jednak idealne rozwiązanie, ponieważ między dwoma elementami div pojawia się niewielka przerwa.

Innym sposobem rozwiązania problemu jest unoszenie obu elementów div. Zobacz http://jsfiddle.net/VptQm/ . To działa dobrze.

Ale moje pierwotne pytanie pozostaje. Dlaczego, skoro oba elementy div są przechowywane jako elementy inline-block, nie pasują obok siebie?

Odpowiedzi:


139

Podczas korzystania z inline-blockelementów zawsze będzie istniał whitespace problem między tymi elementami (szerokość ta wynosi około ~ 4 piksele).

Więc twoje dwa divs, z których oba mają 50% szerokości, plus ten whitespace(~ 4px) ma ponad 100% szerokości, więc pęka. Przykład twojego problemu:


Jest kilka sposobów, aby to naprawić:

1. Brak odstępu między tymi elementami

2. Korzystanie z komentarzy HTML

3. Ustaw rodziców font-sizena 0, a następnie dodaj wartość do inline-blockelementów

4. Stosowanie między nimi ujemnego marginesu ( nie zalecane )

5. Opadający kąt zamknięcia

6. Pomijanie niektórych tagów zamykających HTML (dzięki @thirtydot za odniesienie )


Bibliografia:

  1. Walka z przestrzenią między wbudowanymi elementami blokowymi w sztuczkach CSS
  2. Usuń odstępy między elementami wbudowanymi w blok autorstwa Davida Walsha
  3. Jak usunąć odstępy między elementami inline-block?

Jak @ MarcosPérezGude powiedział The najlepszym sposobem jest użycie remi dodać jakąś wartość domyślną font-sizena htmlznaczniku (jak w HTML5Boilerplate ). Przykład:

html{
    font-size: 1em;
}

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

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

Aktualizacja : ponieważ jest prawie 2018 r., Użyj flexboksa lub jeszcze lepiej - układu siatki CSS .


3
@hoosierEE to nie jest nosense. Przestrzeń między elementami jest w porządku, ponieważ elementy inline-block będą pozycjonować się w wierszu tekstu. Jeśli wstawisz spację w linii, będzie spacja. Tak więc zachowanie jest prawidłowe, nawet jeśli uważasz, że to problem (jak Vucko nazywa to błędem).
Marcos Pérez Gude

2
Zgadzam się z @ MarcosPérezGude, to zachowanie jest poprawne. Jak widać w moim poście, istnieje kilka sposobów na usunięcie tej spacji (ja sam używam komentarzy HTML, aby usunąć spację). Ale jeśli przeszkadza, że białe miejsca, zawsze można użyć flexbox, table/table-row/table-celllub używanie float.
Vucko,

2
Doskonale używam bloków inline. Moje normalne podejście to parent { font-size:0; } child {font-size: 1rem; }. Z remami teraz jest najłatwiej
Marcos Pérez Gude

to trochę denerwujące, że tabulatory są nadal przetwarzane jako spacje. nigdy wcześniej nie widziałem, że porzucenie poprawki tagu zamykającego ma jakieś niestabilność lub skutki uboczne?
MintWelsh

Upewnij się również, że borderjest wyłączony. Może to zwiększyć przestrzeń, jeśli pływasz w elementach div.
evolross

22

dobra odpowiedź w css3 to:

white-space: nowrap;

w węźle nadrzędnym i:

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

w div (lub innym) przy 50%

przykład: http://jsfiddle.net/YpTMh/19/

EDYTOWAĆ:

jest inny sposób:

font-size: 0;

dla węzła nadrzędnego i nadpisz go w węźle podrzędnym


7

Dzieje się tak, ponieważ biały znak między dwoma elementami div jest interpretowany jako spacja. Jeśli umieścisz <div>tagi w jednej linii, jak pokazano poniżej, problem zostanie rozwiązany :

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


4

Albo spraw, by blokowały zamiast inline-block. Spowoduje to, że elementy div będą ignorować spacje między nimi.

display:block;

lub usuń odstępy między tagami

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

lub dodaj

margin: -1en;

do jednego z elementów div, aby złagodzić miejsce zajmowane przez pojedynczą renderowaną przestrzeń.


2

Sprawdź poniższy kod:

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

Można to zrobić, dodając display: inline do elementu div, który zawiera elementy inline.

Podczas usuwania spacji za pomocą marginesu o wartości ujemnej konieczne staje się dodanie go do tego konkretnego elementu. Dodanie go do klasy wpłynie na miejsca, w których ta klasa była używana.

Więc bezpieczniej byłoby użyć display: inline;


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.