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?



14
#wrapper { display: flex; }
icl7126

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 */
}

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 .


@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.


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


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/


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


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


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.


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>


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.


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;
}

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>


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>
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.