Làm thế nào để đặt hai div cạnh nhau?


370

Hãy xem xét các mã sau đây :

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

Tôi muốn hai div nằm cạnh nhau bên trong div Wrapper. Trong trường hợp này, chiều cao của div xanh sẽ xác định chiều cao của trình bao bọc.

Làm thế nào tôi có thể đạt được điều này thông qua CSS?



14
#wrapper { display: flex; }
icl7126

Có thể có bản sao CSS hai div bên cạnh nhau
Alexander

Câu trả lời:


447

Nổi một hoặc cả hai div bên trong.

Nổi một 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 */
}

hoặc nếu bạn thả nổi cả hai, bạn sẽ cần khuyến khích div trình bao bọc chứa cả những đứa trẻ nổi, hoặc nó sẽ nghĩ nó trống và không đặt đường viền xung quanh chúng

Nổi cả hai 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
bạn có thể đặt overflow:autotrên #wrapper Vì vậy, kích thước vẫn sẽ thích ứng với kích thước nội dung. (Không cần rõ ràng: cả hai yếu tố)
meo

có trong ví dụ thứ nhất, nếu #first dài hơn, bạn chắc chắn có thể - chứa float 101 eh;) .. tràn ẩn trên #second tránh sự cần thiết phải tính lề trái mặc dù các giải pháp về cơ bản là giống nhau
clairesuzy

3
Chính xác! Tôi không muốn tính toán lợi nhuận. overflow: hiddenlàm một công việc tuyệt vời ở đây! Tuy nhiên, nó vẫn là loại phép thuật đối với tôi. Tôi nghĩ rằng overflow: hiddennên ẩn nội dung nếu nó không phù hợp với thùng chứa của nó. Nhưng, ở đây hành vi là một chút khác nhau. Bạn có thể giải thích về điều đó xin vui lòng?
Misha Moroshko

4
thuộc overflowtính sẽ xóa trôi nổi cả dọc và ngang, đó là lý do tại sao trong ví dụ đầu tiên của tôi, #secondkhông cần lề trái, thuộc tính tràn hoạt động miễn là giá trị của nó không visible.. Tôi thích tự động ẩn cho những trường hợp chỉ trong trường hợp như vậy một thanh cuộn không được tạo ra một cách tình cờ (tự động sẽ làm) .. dù bằng cách nào thì sẽ không có nội dung nào ẩn một kịch bản như thế này vì nó sẽ chỉ bị ẩn nếu nó nằm ngoài chiều rộng 500px của bạn nhưng miễn là không có nội dung chiều cao nào bọc trong chiều rộng như bình thường .. không che giấu;)
clairesuzy

1
tràn: ẩn trên #wrapper phục vụ để chứa #first float theo chiều dọc nếu nó dài hơn div #second không nổi. tràn thứ hai trên #second phục vụ để chứa nội dung bên cạnh số float đầu tiên, theo chiều ngang nếu không nó sẽ nằm bên dưới số float đầu tiên. Hành vi mở rộng của thuộc tính tràn được thực hiện theo một nơi nào đó trong CSS2.1, bản thân các thông số kỹ thuật đã thay đổi để đáp ứng với cách chứa float mà không có phần tử xóa hoặc hack Clearfix, thuật ngữ kỹ thuật là khi được sử dụng như thế này, nó tạo ra một cái mới bối cảnh định dạng khối
clairesuzy

130

Có hai div

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

bạn cũng có thể sử dụng displaytài sản:

#div1 {
    display: inline-block;
}

#div2 {
    display: inline-block;
}

ví dụ jsFiddle ở đây .

Nếu div1vượt quá một độ cao nhất định, div2sẽ được đặt bên cạnh div1ở phía dưới. Để giải quyết điều này, sử dụng vertical-align:top;trên div2.

ví dụ jsFiddle ở đây .


@BSeven câu trả lời được chấp nhận sử dụng thuộc tính float, được hỗ trợ sớm hơn thuộc tính hiển thị bởi các trình duyệt chính. Chrome hỗ trợ float từ v1.0 và hiển thị từ v4.0. Có lẽ câu trả lời được chấp nhận là tương thích ngược hơn tại thời điểm nó được viết.
jim_kastrin

5
Giải pháp này có một vấn đề gây khó chịu: vì divchúng được tạo nên inlinebạn không được giữ khoảng trắng, dòng mới, v.v ... giữa chúng trong HTML của bạn. Nếu không, các trình duyệt sẽ hiển thị một không gian giữa chúng. Xem Fiddle này : bạn không thể quản lý để giữ cả hai divtrên cùng một dòng trừ khi bạn đặt thẻ của họ mà không có bất cứ điều gì ở giữa.
Alexander Abakumov

30

Bạn có thể ngồi các phần tử cạnh nhau bằng cách sử dụng thuộc tính float CSS:

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

Bạn cần đảm bảo rằng div trình bao bọc cho phép nổi theo chiều rộng và lề vv được đặt chính xác.


17

Cố gắng sử dụng mô hình flexbox. Nó rất dễ dàng và ngắn để viết.

Live Jsfiddle

CSS:

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

hướng mặc định là hàng. Vì vậy, nó thẳng hàng cạnh nhau bên trong #wrapper. Nhưng nó không được hỗ trợ IE9 hoặc ít hơn các phiên bản đó


1
Tôi không thể tin nó dễ sử dụng flex. Cảm ơn bạn!
Sam

16

đây là giải pháp:

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

bản demo của bạn được cập nhật;

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


Cảm ơn. Nếu tôi bỏ qua overflow: auto;nó vẫn hoạt động. Bạn có thể cho một ví dụ khi nó được yêu cầu?
Misha Moroshko

có chắc chắn: loại bỏ tự động tràn và làm cho nội dung đầu tiên dài hơn nội dung thứ hai, bạn cũng thấy rằng kích thước của bộ chứa chỉ thích ứng, khi bạn đặt tự động tràn trên nó hoặc nếu bạn sử dụng phần tử xóa: jsfiddle. net / dqC8t / 3
meo

OK, tôi hiểu rồi, cảm ơn! Tuy nhiên, tôi không thích margin: 0 0 0 302px;vì nó phụ thuộc vào width: 300px;. Nhưng dù gì cũng cảm ơn!!
Misha Moroshko

bạn không cần nó nếu bạn chỉ định i width cho div thứ hai của mình
meo

15

lựa chọn 1

Sử dụng float:lefttrên cả hai divphần tử và đặt% width cho cả hai phần tử div với tổng chiều rộng kết hợp là 100%.

Sử dụng box-sizing: border-box;trên các phần tử div nổi. Hộp viền giá trị buộc phần đệm và viền vào chiều rộng và chiều cao thay vì mở rộng nó.

Sử dụng Clearfix trên <div id="wrapper">để xóa các phần tử con nổi sẽ làm cho tỷ lệ div của trình bao bọc đến chiều cao chính xác.

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

Lựa chọn 2

Sử dụng position:absolutetrên một yếu tố và chiều rộng cố định trên yếu tố khác.

Thêm vị trí: liên quan đến <div id="wrapper">phần tử để làm cho các phần tử con vị trí tuyệt đối với <div id="wrapper">phần tử.

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

Lựa chọn 3

Sử dụng display:inline-blocktrên cả hai divphần tử và đặt% width cho cả hai phần tử div với tổng chiều rộng kết hợp là 100%.

Và một lần nữa (giống như float:leftví dụ) sử dụng box-sizing: border-box;trên các phần tử div. Hộp viền giá trị buộc phần đệm và viền vào chiều rộng và chiều cao thay vì mở rộng nó.

LƯU Ý: các phần tử khối nội tuyến có thể có các vấn đề về khoảng cách vì nó bị ảnh hưởng bởi các khoảng trắng trong đánh dấu HTML. Thêm thông tin tại đây: https://css-tricks.com/fighting-the-space-b between-line-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/

Tùy chọn cuối cùng sẽ là sử dụng tùy chọn hiển thị mới có tên flex, nhưng lưu ý rằng khả năng tương thích trình duyệt có thể xuất hiện để chơi:

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

http://www.sketchingwithcss.com/samplech CHƯƠNG / áo choàng.html


1
Đã đồng ý; floatđừng thả thuyền của tôi. inline-blockđá. (Xin lỗi.)
SteveCinq

7

Cố gắng sử dụng các thay đổi mã bên dưới để đặt hai div trước mặt nhau

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

Liên kết JSFiddle


7

Nó rất dễ dàng - bạn có thể làm điều đó một cách khó khăn

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

hoặc cách dễ dàng

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

Cũng giống như một triệu cách khác.
Nhưng tôi chỉ với cách dễ dàng. Tôi cũng muốn nói với bạn rằng rất nhiều câu trả lời ở đây là không chính xác Nhưng cả hai cách mà tôi đã chỉ ra ít nhất đều hoạt động trong HTML 5.


5

Đây là câu trả lời CSS3 đúng. Hy vọng điều này sẽ giúp bạn bằng cách nào đó ngay bây giờ: D Tôi thực sự khuyên bạn nên đọc cuốn sách: https://www.amazon.com/Book-CSS3-Developers-Future-Design/dp/1593272863 Thật ra tôi đã thực hiện giải pháp này từ việc đọc cuốn sách này ngay bây giờ . : 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. Thêm float:left;tài sản trong cả hai div.

  2. Thêm display:inline-block;tài sản.

  3. Thêm display:flex;tài sản trong div cha.


2

Cách tiếp cận của tôi:

<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

Trong UI vật liệu và Reac.js, bạn có thể sử dụng lưới

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.