Jak umieścić dwa divy obok siebie?

370

Rozważ następujący kod :

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Chciałbym, aby dwa div były obok siebie wewnątrz div otoki. W takim przypadku wysokość zielonego div powinna określać wysokość opakowania.

Jak mogę to osiągnąć za pomocą CSS?

Misza Moroszko
źródło
14
#wrapper { display: flex; }
icl7126
Możliwy duplikat CSS dwóch div obok siebie
Alexander

Odpowiedzi:

447

Unieś jeden lub oba wewnętrzne divy.

Pływający jeden div:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* will contain if #first is longer than #second */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    overflow: hidden; /* if you don't want #second to wrap below #first */
}

lub jeśli umieścisz oba elementy, musisz zachęcić div otoki, aby zawierał oba elementy pływające, albo pomyśli, że jest pusty i nie będzie otaczał ich ramką

Pływające oba div:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* add this to contain floated children */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    float: left; /* add this */
}
clairesuzy
źródło
2
można ustawić overflow:autona #wrapper, aby rozmiar nadal dostosowywał się do rozmiaru zawartości. (Bez potrzeby wyraźnego: oba elementy)
meo
tak w przykładzie pierwszym, jeśli #pierwszy jest dłuższy, na pewno możesz - zawierający liczby zmiennoprzecinkowe 101 eh;) .. przepełnienie ukryte w # sekundy pozwala uniknąć obliczenia lewego marginesu, chociaż w przeciwnym razie rozwiązania są w zasadzie takie same
clairesuzy
3
Dokładnie! Nie chcę obliczać marży. overflow: hiddenrobi tu świetną robotę! Jednak wciąż jest to dla mnie magia. Pomyślałem, że to overflow: hiddenpowinno ukryć zawartość, jeśli nie pasuje do pojemnika. Ale tutaj zachowanie jest nieco inne. Czy mógłbyś rozwinąć tę kwestię?
Misha Moroshko
4
overflowwłaściwość wyczyści ruchy zarówno pionowe, jak i poziome, dlatego w moim pierwszym przykładzie #secondnie potrzebuje lewego marginesu, właściwość przepełnienia działa tak długo, jak długo jej wartość nie jest visible. Wolę ukryć niż auto dla tych scenariuszy na wypadek, gdyby tak było pasek przewijania nie jest generowany przez przypadek (co zrobi auto) .. w obu przypadkach nie będzie ukrytej treści w takim scenariuszu, ponieważ będzie on ukryty tylko wtedy, gdy wyjdzie poza szerokość 500 pikseli, ale o ile nie będzie zawartości wysokości owinąć w szerokość jak zwykle .. bez ukrywania;)
clairesuzy
1
przepełnienie: ukryte na #wrapper służy do przechowywania # pierwszego elementu zmiennoprzecinkowego w pionie, jeśli będzie on dłuższy niż nie-zmienny #sekundowy div. drugi przelew #second służy do przechowywania zawartości obok pierwszego elementu pływającego, w poziomie, w przeciwnym razie znalazłby się pod pierwszym elementem pływającym. Rozszerzone zachowanie właściwości przepełnienia zostało wprowadzone gdzieś w CSS 2.1, same specyfikacje zmieniły się w odpowiedzi na sposób przechowywania zmiennoprzecinkowych elementów bez elementu czyszczącego lub hackowania poprawki, to techniczne określenie jest takie, że przy takim użyciu tworzy nowy kontekst formatowania bloku
clairesuzy,
130

Posiadanie dwóch div,

<div id="div1">The two divs are</div>
<div id="div2">next to each other.</div>

możesz również skorzystać z displaywłaściwości:

#div1 {
    display: inline-block;
}

#div2 {
    display: inline-block;
}

Przykład jsFiddle tutaj .

Jeśli div1przekroczy określoną wysokość, div2zostanie umieszczony obok div1na dole. Aby rozwiązać ten problem, użyj vertical-align:top;na div2.

Przykład jsFiddle tutaj .

jim_kastrin
źródło
@BSeven w zaakceptowanej odpowiedzi użyto właściwości float, która była obsługiwana wcześniej niż właściwość display przez główne przeglądarki. Chrome obsługuje float od wersji 1.0 i wyświetlanie od wersji 4.0. Być może zaakceptowana odpowiedź była w chwili pisania bardziej zgodna z poprzednimi wersjami.
jim_kastrin
5
To rozwiązanie ma jeden irytujący problem: ponieważ divsą tworzone, inlinenie musisz między nimi wstawiać spacji, nowych wierszy itp. W kodzie HTML. W przeciwnym razie przeglądarki wyświetlą między nimi spację. Zobacz ten Fiddle : nie możesz utrzymać obu divs na tej samej linii, chyba że umieścisz ich tagi bez niczego pomiędzy nimi.
Alexander Abakumov
30

Możesz umieszczać elementy obok siebie za pomocą właściwości float CSS:

#first {
float: left;
}
#second {
float: left;
}

Musisz upewnić się, że div otoki pozwala na przestawianie pod względem szerokości, a marginesy itp. Są ustawione poprawnie.

James
źródło
17

Spróbuj użyć modelu Flexbox. Pisanie jest łatwe i krótkie.

Live Jsfiddle

CSS:

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}

domyślnym kierunkiem jest rząd. Tak więc wyrównuje się obok siebie w #wrapper. Ale nie jest obsługiwany IE9 lub mniej niż te wersje

Md. Rafee
źródło
1
Nie mogę uwierzyć, jak łatwo jest go używać flex. Dziękuję Ci!
Sam
16

oto rozwiązanie:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: auto; /* so the size of the wrapper is alway the size of the longest content */
}
#first {
    float: left;
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    margin: 0 0 0 302px; /* considering the border you need to use a margin so the content does not float under the first div*/
}

Twoje demo zaktualizowane;

http://jsfiddle.net/dqC8t/1/

meo
źródło
Dzięki. Jeśli pominę overflow: auto;to nadal działa. Czy możesz podać przykład, w którym jest to wymagane?
Misha Moroshko
tak, pewnie: usuń automatyczną przepełnienie i uczyń zawartość pierwszej dłuższą niż zawartość drugiej, dobrze widzisz, że rozmiar pojemnika dostosowuje się tylko, gdy ustawisz na nim automatyczną przepełnienie lub jeśli użyjesz elementu czyszczącego: jsfiddle. net / dqC8t / 3
meo
OK, rozumiem, dziękuję! Jednak nie podobało mi się, margin: 0 0 0 302px;ponieważ to zależy width: 300px;. Ale i tak dzięki!!
Misha Moroshko
nie potrzebujesz go, jeśli określisz szerokość i dla drugiego div
meo
15

opcja 1

Użyj float:leftna obu divelementach i ustaw% szerokości dla obu elementów div o łącznej szerokości 100%.

Użyj box-sizing: border-box;na pływających elementach div. Wartość border-box wymusza wypełnienie i obramowanie na szerokość i wysokość zamiast go rozszerzać.

Użyj clearfix na, <div id="wrapper">aby usunąć pływające elementy potomne, które sprawią, że otoki otoki będą skalowane do właściwej wysokości.

.clearfix:after {
   content: " "; 
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}

http://jsfiddle.net/dqC8t/3381/

Opcja 2

Użyj position:absolutena jednym elemencie i stałej szerokości na drugim elemencie.

Dodaj pozycję: względem <div id="wrapper">elementu, aby elementy potomne były absolutnie pozycjonowane względem <div id="wrapper">elementu.

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}
#first {
    border: 1px solid red;
    width:100px;
}
#second {
    border: 1px solid green;
    position:absolute;
    top:0;
    left:100px;
    right:0;
}

http://jsfiddle.net/dqC8t/3382/

Opcja 3

Użyj display:inline-blockna obu divelementach i ustaw% szerokości dla obu elementów div o łącznej szerokości 100%.

I znowu (tak jak w float:leftprzykładzie) użyj box-sizing: border-box;na elementach div. Wartość border-box wymusza wypełnienie i obramowanie na szerokość i wysokość zamiast go rozszerzać.

UWAGA: w elementach bloku wbudowanego mogą występować problemy z odstępami, ponieważ wpływ na to mają spacje w znacznikach HTML. Więcej informacji tutaj: https://css-tricks.com/fighting-the-space-between-inline-block-elements/

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}

#first {
    width:50%;
    border: 1px solid red;
    display:inline-block;
}

#second {
    width:50%;
    border: 1px solid green;
    display:inline-block;
}

http://jsfiddle.net/dqC8t/3383/

Ostatnią opcją byłoby użycie nowej opcji wyświetlania o nazwie flex, ale należy pamiętać, że do gry może wejść kompatybilność przeglądarki:

http://caniuse.com/#feat=flexbox

http://www.sketchingwithcss.com/samplechapter/cheatsheet.html

Jako Basson
źródło
1
Zgoda; floatnie pływaj na mojej łodzi. inline-blockskały (Przepraszam.)
SteveCinq
7

Spróbuj użyć poniższych zmian kodu, aby umieścić dwa divy przed sobą

#wrapper {
  width: 500px;
  border: 1px solid black;
  display:flex;
}

Łącze JSFiddle

Shailesh
źródło
7

To bardzo proste - możesz to zrobić na własnej skórze

.clearfix:after {
   content: " "; 
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}
<div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

lub w prosty sposób

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Istnieje również milion innych sposobów.
Ale po prostu w prosty sposób. Chciałbym również powiedzieć, że wiele odpowiedzi tutaj jest niepoprawnych, ale oba sposoby, które pokazałem, działają przynajmniej w HTML 5.

Runningman Studios
źródło
5

To jest właściwa odpowiedź CSS3. Mam nadzieję, że pomoże Ci to jakoś teraz: D Naprawdę polecam przeczytanie książki: https://www.amazon.com/Book-CSS3-Developers-Future-Design/dp/1593272863 Właściwie to stworzyłem to rozwiązanie, czytając teraz tę książkę . :RE

#wrapper{
  display: flex;
  flex-direction: row;
  border: 1px solid black;
}
#first{
  width: 300px;
  border: 1px solid red;
}
#second{
  border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Martin Krajčírovič
źródło
3
  1. Dodaj float:left;właściwość w obu divach.

  2. Dodaj display:inline-block;nieruchomość.

  3. Dodaj display:flex;właściwość w div div.

Przyjaciel
źródło
2

Moje podejście:

<div class="left">Left</div>
<div class="right">Right</div>

CSS:

.left {
    float: left;
    width: calc(100% - 200px);
    background: green;
}

.right {
    float: right;
    width: 200px;
    background: yellow;
}
sNICkerssss
źródło
0

#wrapper {
width: 1200;
border: 1px solid black;
position: relative;
float: left;
}
#first {
width: 300px;
border: 1px solid red;
position: relative;
float: left;
}
#second {
border: 1px solid green;
position: relative;
float: left;
width: 500px;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Akshit Ahuja
źródło
0

W materiałowym interfejsie użytkownika i reag.js możesz użyć siatki

<Grid
  container
  direction="row"
  justify="center"
  alignItems="center"
>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>

</Grid>
Pedro JR
źródło