2015-07-13 11 views
8

Stworzyłem dwa divy i chciałbym, aby pozostały obok siebie, ale jeden z nich zawsze schodzi, nawet jeśli mają one wyświetlacz: blok inline. Co jest nie tak? Nie rozumiem.Blokada wbudowana w dwa bloki div, dlaczego nie znajdują się obok siebie?

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
} 
 
.a { 
 
    display: inline-block; 
 
    background: red; 
 
} 
 
.b { 
 
    width: 20px; 
 
    display: inline-block; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello</div> 
 
    <div class="b">aaa</div> 
 
</div>

+0

div '.a' nie mają max szerokość lub szerokość tak ustawiony tekst w nim będzie nadal wypełniać przestrzeń aż pojemnik ma zawinąć. – lemieuxster

+0

Jeśli chcesz, aby 'b' pojawił się po' a' spróbowałeś ustawić je tak, aby były tylko 'inline'? – j08691

+0

Proste, ponieważ zawartość pierwszego div przekracza 200px, a jako blok inline, każdy * blok * przesuwa się jako cały blok. – Stickers

Odpowiedz

8

problem

bez określania szerokości szerokość bloku liniowego jest określana automatycznie przez jego zawartości. W twoim przypadku czerwony blok zawiera długą linię, co sprawia, że ​​wypełnia (prawie) całą dostępną przestrzeń. Niebieski blok jest szerszy niż przestrzeń pozostawiona do dyspozycji przez czerwony blok, powodując zawijanie do następnej linii.

Roztwór 1: określający szerokość obu elementów

W poniższym fragmencie oba pustak szerokości. Możesz określić szerokość piksela, ponieważ znasz także rozmiar kontenera, ale procenty też by działały, o ile dodadzą do 100%, a nie więcej.

Zauważ, że musiałem trochę zmodyfikować HTML, aby usunąć spacje między nimi. Jest to częsta pułapka przy wyborze tego rozwiązania.

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
} 
 
.a { 
 
    display: inline-block; 
 
    width: 180px; 
 
    background: red; 
 
} 
 
.b { 
 
    display: inline-block; 
 
    width: 20px; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello 
 
    </div><div class="b">aaa</div> 
 
</div>

Rozwiązanie 2: wyświetlanie elementów jak komórki tabeli w wierszu

Alternatywnie, można uczynić je zachowywać się jak wiersz tabeli. Ma to tę zaletę, że ich wysokość również się do siebie dopasuje, i że można łatwo dać jedną z nich szerokość, a drugą nie. Ponadto nie będziesz mieć problemu białych znaków między elementami, które musisz rozwiązać, korzystając z pierwszego rozwiązania.

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
    display: table; 
 
} 
 
.a { 
 
    display: table-cell; 
 
    background: red; 
 
} 
 
.b { 
 
    width: 20px; 
 
    display: table-cell; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello 
 
    </div><div class="b">aaa</div> 
 
</div>

+0

Bardzo oryginalne rozwiązanie przy użyciu tabeli. Podobał mi się ten pomysł. Dziękuję za odpowiedź. – MeV

+0

Jedna korekta - * zachowuje się jak wiersz tabeli * czy nie powinna to być "komórka tabeli"? – Stickers

+0

Każdy z nich zachowuje się jak komórka, razem zachowują się jak rząd. :) – GolezTrol

1

Twoje inline-block elementów wypełni całą przestrzeń poziomą, jeśli mają wystarczająco dużo treści, spychając inne elementy poniżej. Jednym ze sposobów naprawienia tego byłoby użycie Flexbox.

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
    display: flex; 
 
} 
 
.a { 
 
    background: red; 
 
} 
 
.b { 
 
    width: 20px; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello</div> 
 
    <div class="b">aaa</div> 
 
</div>

+0

Dzięki za odpowiedź ..! Wiesz, myślałem o używaniu flexa i jest to oczywiście dobre rozwiązanie, ale nie byłem w stanie zrozumieć, dlaczego blok inline nie działa. Czy masz oficjalną stronę wyjaśniającą, że elementy wbudowanego bloku używają całej dostępnej przestrzeni? jeszcze raz dziękuję – MeV

0

Od tekstu wewnątrz div z klasą „a” jest duża w stosunku do wielkości div, to trwa całe kontenery szerokość, dając DIV stałej szerokości mniejszej niż pojemnika szerokość ustalona lub przez %, divy będą pasować obok siebie.

EDIT

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
} 
 
.a { 
 
    display: inline-block; 
 
    background: red; 
 
    width:150px; 
 
} 
 
.b { 
 
    width: 20px; 
 
    display: inline-block; 
 
    background: blue; 
 
    vertical-align:top; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello</div> 
 
    <div class="b">aaa</div> 
 
</div>

+0

200px powinno być 180px lub mniej. – GolezTrol

+0

Jeśli mój pojemnik nie miałby stałej szerokości (jak w moim przykładzie), nie byłbym w stanie ustawić stałej szerokości dla elementów podrzędnych. Może się tak zdarzyć w responsywnej witrynie internetowej. Dzięki za odpowiedź. – MeV

+0

cóż, tak, to było moje wyjaśnienie przed edycją, komórka niszczy czasem twoje odpowiedzi: s, powiedziałem, że możesz użyć stałej szerokości lub% ... @GolezTrol masz rację, to był punkt, ale ten sam problem z telefonem komórkowym. ..: s – KAD

5

The display:inline-block sprawia, że ​​oba te elementy pozostają w tej samej linii czy jest wystarczająco dużo miejsca na nim. W przeciwnym razie linia zostanie przerwana.

Istnieje wiele rozwiązań, które tu pracują, ale pozwala myśleć prostsze ...

Jeśli zdefiniowano stałą szerokość zarówno do pojemnika i „b” div, to dlaczego nie ustawić stałą szerokość do także "a" div z pozostałym 180px?

.container { 
 
    width: 200px; 
 
    border: 1px solid black; 
 
} 
 
.a { 
 
    width: 180px; 
 
    display: inline-block; 
 
    background: red; 
 
} 
 
.b { 
 
    width: 20px; 
 
    display: inline-block; 
 
    background: blue; 
 
}
<div class="container"> 
 
    <div class="a">hello hello hello hello hello hello hello</div><div class="b">aaa</div> 
 
</div>

+0

Jasne wyjaśnienie. Dziękuję Ci. – MeV

Powiązane problemy