Як розмістити два диви один біля одного?


370

Розглянемо наступний код :

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

Я хотів би, щоб два діви були поруч один з одним всередині оболонки. У цьому випадку висота зеленого дива повинна визначати висоту обгортки.

Як я міг досягти цього за допомогою CSS?



14
#wrapper { display: flex; }
icl7126

Можливий дублікат CSS двох дівок поруч
Олександр

Відповіді:


447

Пливуть один або обидва внутрішні диви.

Плаваючий один 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 */
}

або якщо ви плаваєте обидва, вам потрібно буде заохочувати обгортковий дів містити обох плаваючих дітей, інакше він подумає, що він порожній, і не ставитиме межу навколо них

Плаваючі обидві діви:

#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
ви можете встановити overflow:autoна #wrapper Так що розмір все ще адаптуватиметься до розміру вмісту. (Без потреби чіткого: обидва елемента)
мей

так у прикладі один, якщо #first довше, ви, звичайно, могли б - містять поплавці 101 eh;) .. Переповнення, приховані на #second, уникають необхідності обчислення лівої межі, хоча в іншому випадку рішення в основному однакові
clairesuzy

3
Саме так! Я не хочу обчислювати маржу. overflow: hiddenробить тут чудову роботу! Однак для мене це все-таки магія. Я думав, що це overflow: hiddenповинно приховувати вміст, якщо він не відповідає його контейнеру. Але, тут поведінка дещо інша. Не могли б ви детальніше зупинитися на цьому?
Мішко Морошко

4
overflowвластивість очистить плаває як по вертикалі і горизонталі , яка , чому в моєму першому прикладі, #secondне потрібен лівий край, властивість Переповнення працює, поки це значення не єvisible .. Я віддаю перевагу прихований в авто для тих , хто тільки в сценаріях так смуга прокрутки не генерується випадково (що автоматично зробить) .. в будь-якому випадку не буде вмісту, прихованого такого сценарію, як цей, оскільки він буде прихований лише в тому випадку, якщо він виходить за межі вашої ширини 500 пікселів, але поки немає вмісту висоти, загорнути в межах ширини як звичайно .. не ховаючись;)
clairesuzy

1
переповнення: прихований на #wrapper служить для розміщення вертикального поплавця по вертикалі, якщо воно буде довше, ніж неперепливний #second div. другий переповнення на #second служить для вмісту поруч із першим поплавком, горизонтально в іншому випадку він піде під перший поплавок. Розширена поведінка властивості переповнення була поетапно десь у CSS2.1, самі специфікації змінилися у відповідь на спосіб містити поплавці без елемента очищення або злому виправлення, технічний термін полягає в тому, що при такому використанні він створює новий Контекст форматування блоку
clairesuzy

130

Маючи два діви,

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

Ви також можете скористатися displayмайном:

#div1 {
    display: inline-block;
}

#div2 {
    display: inline-block;
}

Приклад jsFiddle тут .

Якщо div1перевищує певну висоту, div2буде розміщено поруч div1із дном. Щоб вирішити це, скористайтеся vertical-align:top;далі div2.

Приклад jsFiddle тут .


@BSeven прийнята відповідь використовує властивість float, яка була підтримана раніше, ніж властивість відображення основними браузерами. Chrome підтримує функцію float від v1.0 та дисплей від v4.0. Можливо, прийнята відповідь була більш сумісною для того часу, коли вона була написана.
jim_kastrin

5
У цьому рішенні є одна дратівлива проблема: оскільки divїх зроблено, inlineу вашому HTML не повинно залишатися пробілів, нових рядків тощо. В іншому випадку браузери візьмуть пробіл між ними. Дивіться цю скрипку : ви не можете втримати обох divs в одній лінії, якщо ви не поставите їх теги без нічого середнього.
Олександр Абакумов

30

Ви можете сидіти елементи поруч, використовуючи властивість CSS float:

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

Вам потрібно буде переконатися, що div оболонки дозволяє плаваючий за шириною, а поля тощо встановлені правильно.


17

Спробуйте скористатися моделлю флешбоксу. Легко і коротко писати.

Наживо Jsfiddle

CSS:

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

за замовчуванням - рядок. Отже, він вирівнює поруч один з одним всередині #wrapper. Але він не підтримується IE9 або менше, ніж ці версії


1
Я не можу повірити, наскільки це просто у використанні flex. Дякую!
Сем

16

ось рішення:

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

демо оновлено;

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


Дякую. Якщо я пропущу, overflow: auto;це все ще працює. Чи можете ви навести приклад, де це потрібно?
Мішко Морошко

так впевнений: видаліть автоматичне переповнення та зробіть вміст першого довше, ніж вміст другого, ви добре бачите, що розмір контейнера підлаштовується лише під час встановлення на нього автоматичного переповнення або використання елемента очищення: jsfiddle. net / dqC8t / 3
мей

Гаразд, бачу, дякую! Однак мені це не сподобалось, margin: 0 0 0 302px;бо це залежить від цього width: 300px;. Але, дякую все одно !!
Мішко Морошко

вам це не потрібно, якщо ви вкажете ширину для свого другого діва
мео

15

Варіант 1

Використовуйте float:leftна обохdivелементи та встановіть% ширини для обох елементів div із комбінованою загальною шириною 100%.

Використовуйте box-sizing: border-box; на плаваючих елементах div. Значення border-box змушує прошивку і облямовує ширину та висоту, а не розширює її.

Використовуйте clearfix on, <div id="wrapper">щоб очистити плаваючі дочірні елементи, які зроблять шкалу поділки на потрібній висоті.

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

Варіант 2

Використовуйте position:absolute на одному елементі та фіксовану ширину на іншому.

Додати позицію: відносно <div id="wrapper">елемента, щоб зробити дочірні елементи абсолютно положенням до <div id="wrapper">елемента.

#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/

Варіант 3

Використовуйте display:inline-blockобидва divелементи та встановіть% ширини для обох елементів div із комбінованою загальною шириною 100%.

І знову (те саме, як float:leftприклад) використання box-sizing: border-box;на елементах div. Значення border-box змушує прошивку і облямовує ширину та висоту, а не розширює її.

ПРИМІТКА: елементи вбудованого блоку можуть мати проблеми з інтервалом, оскільки на нього впливають пробіли в розмітці HTML. Більше інформації тут: 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/

Остаточним варіантом буде використання нової опції відображення з назвою flex, але зауважте, що сумісність браузера може прийти до гри:

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

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


1
Домовились; floatне пливе мій човен. inline-blockскелі. (Вибачте.)
SteveCinq

7

Спробуйте використати нижче зміни коду, щоб розмістити два діви навпроти одного

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

Посилання JSFiddle


7

Це дуже просто - ви могли зробити це важким шляхом

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

або простий спосіб

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

Є також, як мільйон інших способів.
Але я б просто простим шляхом. Я також хотів би сказати вам, що багато відповідей тут невірні, але обидва способи, які я показав, принаймні працюють у HTML 5.


5

Це правильна відповідь CSS3. Сподіваюсь, це допоможе вам якось зараз: D Я дуже рекомендую вам прочитати книгу: https://www.amazon.com/Book-CSS3-Developers-Future-Design/dp/1593272863 Насправді я прийняв це рішення, читаючи цю книгу зараз . : D

#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. Додайте float:left;властивість в обох дивах.

  2. Додати display:inline-block;власність.

  3. Додати display:flex;власність у батьківський div.


2

Мій підхід:

<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

У матеріальному інтерфейсі та react.js ви можете використовувати сітку

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.